{"version":3,"sources":["webpack:///./node_modules/angular2-draggable/fesm5/angular2-draggable.js.pre-build-optimizer.js"],"names":["AngularDraggableModule"],"mappings":"qJA8gDIA,EACA","file":"4.5dbc3cdedee52522d759.js","sourcesContent":["import { Directive, ElementRef, Renderer2, Input, Output, HostListener, EventEmitter, NgModule } from '@angular/core';\nimport { __values } from 'tslib';\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\r\nvar Position = /** @class */ (function () {\r\n function Position(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n /**\r\n * @param {?} e\r\n * @return {?}\r\n */\r\n Position.fromEvent = /**\r\n * @param {?} e\r\n * @return {?}\r\n */\r\n function (e) {\r\n if (e instanceof MouseEvent) {\r\n return new Position(e.clientX, e.clientY);\r\n }\r\n else {\r\n return new Position(e.changedTouches[0].clientX, e.changedTouches[0].clientY);\r\n }\r\n };\r\n /**\r\n * @param {?} obj\r\n * @return {?}\r\n */\r\n Position.isIPosition = /**\r\n * @param {?} obj\r\n * @return {?}\r\n */\r\n function (obj) {\r\n return !!obj && ('x' in obj) && ('y' in obj);\r\n };\r\n /**\r\n * @param {?} el\r\n * @return {?}\r\n */\r\n Position.getCurrent = /**\r\n * @param {?} el\r\n * @return {?}\r\n */\r\n function (el) {\r\n var /** @type {?} */ pos = new Position(0, 0);\r\n if (window) {\r\n var /** @type {?} */ computed = window.getComputedStyle(el);\r\n if (computed) {\r\n var /** @type {?} */ x = parseInt(computed.getPropertyValue('left'), 10);\r\n var /** @type {?} */ y = parseInt(computed.getPropertyValue('top'), 10);\r\n pos.x = isNaN(x) ? 0 : x;\r\n pos.y = isNaN(y) ? 0 : y;\r\n }\r\n return pos;\r\n }\r\n else {\r\n console.error('Not Supported!');\r\n return null;\r\n }\r\n };\r\n /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n Position.copy = /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n function (p) {\r\n return new Position(0, 0).set(p);\r\n };\r\n Object.defineProperty(Position.prototype, \"value\", {\r\n get: /**\r\n * @return {?}\r\n */\r\n function () {\r\n return { x: this.x, y: this.y };\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n Position.prototype.add = /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n function (p) {\r\n this.x += p.x;\r\n this.y += p.y;\r\n return this;\r\n };\r\n /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n Position.prototype.subtract = /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n function (p) {\r\n this.x -= p.x;\r\n this.y -= p.y;\r\n return this;\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n Position.prototype.reset = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this.x = 0;\r\n this.y = 0;\r\n return this;\r\n };\r\n /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n Position.prototype.set = /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n function (p) {\r\n this.x = p.x;\r\n this.y = p.y;\r\n return this;\r\n };\r\n return Position;\r\n}());\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\r\nvar HelperBlock = /** @class */ (function () {\r\n function HelperBlock(parent, renderer) {\r\n this.parent = parent;\r\n this.renderer = renderer;\r\n this._added = false;\r\n // generate helper div\r\n var /** @type {?} */ helper = renderer.createElement('div');\r\n renderer.setStyle(helper, 'position', 'absolute');\r\n renderer.setStyle(helper, 'width', '100%');\r\n renderer.setStyle(helper, 'height', '100%');\r\n renderer.setStyle(helper, 'background-color', 'transparent');\r\n renderer.setStyle(helper, 'top', '0');\r\n renderer.setStyle(helper, 'left', '0');\r\n // done\r\n this._helper = helper;\r\n }\r\n /**\r\n * @return {?}\r\n */\r\n HelperBlock.prototype.add = /**\r\n * @return {?}\r\n */\r\n function () {\r\n // append div to parent\r\n if (this.parent && !this._added) {\r\n this.parent.appendChild(this._helper);\r\n this._added = true;\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n HelperBlock.prototype.remove = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this.parent && this._added) {\r\n this.parent.removeChild(this._helper);\r\n this._added = false;\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n HelperBlock.prototype.dispose = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this._helper = null;\r\n this._added = false;\r\n };\r\n Object.defineProperty(HelperBlock.prototype, \"el\", {\r\n get: /**\r\n * @return {?}\r\n */\r\n function () {\r\n return this._helper;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return HelperBlock;\r\n}());\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\r\nvar AngularDraggableDirective = /** @class */ (function () {\r\n function AngularDraggableDirective(el, renderer) {\r\n this.el = el;\r\n this.renderer = renderer;\r\n this.allowDrag = true;\r\n this.moving = false;\r\n this.orignal = null;\r\n this.oldTrans = new Position(0, 0);\r\n this.tempTrans = new Position(0, 0);\r\n this.currTrans = new Position(0, 0);\r\n this.oldZIndex = '';\r\n this._zIndex = '';\r\n this.needTransform = false;\r\n /**\r\n * Bugfix: iFrames, and context unrelated elements block all events, and are unusable\r\n * https://github.com/xieziyu/angular2-draggable/issues/84\r\n */\r\n this._helperBlock = null;\r\n /**\r\n * Flag to indicate whether the element is dragged once after being initialised\r\n */\r\n this.isDragged = false;\r\n this.started = new EventEmitter();\r\n this.stopped = new EventEmitter();\r\n this.edge = new EventEmitter();\r\n /**\r\n * List of allowed out of bounds edges *\r\n */\r\n this.outOfBounds = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false\r\n };\r\n /**\r\n * Round the position to nearest grid\r\n */\r\n this.gridSize = 1;\r\n /**\r\n * Whether to limit the element stay in the bounds\r\n */\r\n this.inBounds = false;\r\n /**\r\n * Whether the element should use it's previous drag position on a new drag event.\r\n */\r\n this.trackPosition = true;\r\n /**\r\n * Input css scale transform of element so translations are correct\r\n */\r\n this.scale = 1;\r\n /**\r\n * Whether to prevent default event\r\n */\r\n this.preventDefaultEvent = false;\r\n /**\r\n * Set initial position by offsets\r\n */\r\n this.position = { x: 0, y: 0 };\r\n /**\r\n * Emit position offsets when moving\r\n */\r\n this.movingOffset = new EventEmitter();\r\n /**\r\n * Emit position offsets when put back\r\n */\r\n this.endOffset = new EventEmitter();\r\n this._helperBlock = new HelperBlock(el.nativeElement, renderer);\r\n }\r\n Object.defineProperty(AngularDraggableDirective.prototype, \"zIndex\", {\r\n /** Set z-index when not dragging */\r\n set: /**\r\n * Set z-index when not dragging\r\n * @param {?} setting\r\n * @return {?}\r\n */\r\n function (setting) {\r\n this.renderer.setStyle(this.el.nativeElement, 'z-index', setting);\r\n this._zIndex = setting;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(AngularDraggableDirective.prototype, \"ngDraggable\", {\r\n set: /**\r\n * @param {?} setting\r\n * @return {?}\r\n */\r\n function (setting) {\r\n if (setting !== undefined && setting !== null && setting !== '') {\r\n this.allowDrag = !!setting;\r\n var /** @type {?} */ element = this.handle ? this.handle : this.el.nativeElement;\r\n if (this.allowDrag) {\r\n this.renderer.addClass(element, 'ng-draggable');\r\n }\r\n else {\r\n this.renderer.removeClass(element, 'ng-draggable');\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.ngOnInit = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this.allowDrag) {\r\n var /** @type {?} */ element = this.handle ? this.handle : this.el.nativeElement;\r\n this.renderer.addClass(element, 'ng-draggable');\r\n }\r\n this.resetPosition();\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.ngOnDestroy = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this.bounds = null;\r\n this.handle = null;\r\n this.orignal = null;\r\n this.oldTrans = null;\r\n this.tempTrans = null;\r\n this.currTrans = null;\r\n this._helperBlock.dispose();\r\n this._helperBlock = null;\r\n };\r\n /**\r\n * @param {?} changes\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.ngOnChanges = /**\r\n * @param {?} changes\r\n * @return {?}\r\n */\r\n function (changes) {\r\n if (changes['position'] && !changes['position'].isFirstChange()) {\r\n var /** @type {?} */ p = changes['position'].currentValue;\r\n if (!this.moving) {\r\n if (Position.isIPosition(p)) {\r\n this.oldTrans.set(p);\r\n }\r\n else {\r\n this.oldTrans.reset();\r\n }\r\n this.transform();\r\n }\r\n else {\r\n this.needTransform = true;\r\n }\r\n }\r\n if (changes['scale'] && !changes['scale'].isFirstChange()) {\r\n this.oldTrans.x = this.currTrans.x * this.scale;\r\n this.oldTrans.y = this.currTrans.y * this.scale;\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.ngAfterViewInit = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this.inBounds) {\r\n this.boundsCheck();\r\n this.oldTrans.add(this.tempTrans);\r\n this.tempTrans.reset();\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.resetPosition = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (Position.isIPosition(this.position)) {\r\n this.oldTrans.set(this.position);\r\n }\r\n else {\r\n this.oldTrans.reset();\r\n }\r\n this.tempTrans.reset();\r\n this.transform();\r\n };\r\n /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.moveTo = /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n function (p) {\r\n if (this.orignal) {\r\n p.subtract(this.orignal);\r\n this.tempTrans.set(p);\r\n this.transform();\r\n if (this.bounds) {\r\n this.edge.emit(this.boundsCheck());\r\n }\r\n this.movingOffset.emit(this.currTrans.value);\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.transform = /**\r\n * @return {?}\r\n */\r\n function () {\r\n var /** @type {?} */ translateX = this.tempTrans.x + this.oldTrans.x;\r\n var /** @type {?} */ translateY = this.tempTrans.y + this.oldTrans.y;\r\n // Snap to grid: by grid size\r\n if (this.gridSize > 1) {\r\n translateX = Math.round(translateX / this.gridSize) * this.gridSize;\r\n translateY = Math.round(translateY / this.gridSize) * this.gridSize;\r\n }\r\n // done to prevent the element from bouncing off when\r\n // the parent element is scaled and element is dragged for first time\r\n if (this.tempTrans.x !== 0 || this.tempTrans.y !== 0) {\r\n if (this.isDragged === false) {\r\n this.oldTrans.x = this.currTrans.x * this.scale;\r\n this.oldTrans.y = this.currTrans.y * this.scale;\r\n }\r\n this.isDragged = true;\r\n }\r\n if (this.scale && this.scale !== 0 && this.isDragged) {\r\n translateX = translateX / this.scale;\r\n translateY = translateY / this.scale;\r\n }\r\n var /** @type {?} */ value = \"translate(\" + translateX + \"px, \" + translateY + \"px)\";\r\n this.renderer.setStyle(this.el.nativeElement, 'transform', value);\r\n this.renderer.setStyle(this.el.nativeElement, '-webkit-transform', value);\r\n this.renderer.setStyle(this.el.nativeElement, '-ms-transform', value);\r\n this.renderer.setStyle(this.el.nativeElement, '-moz-transform', value);\r\n this.renderer.setStyle(this.el.nativeElement, '-o-transform', value);\r\n // save current position\r\n this.currTrans.x = translateX;\r\n this.currTrans.y = translateY;\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.pickUp = /**\r\n * @return {?}\r\n */\r\n function () {\r\n // get old z-index:\r\n this.oldZIndex = this.el.nativeElement.style.zIndex ? this.el.nativeElement.style.zIndex : '';\r\n if (window) {\r\n this.oldZIndex = window.getComputedStyle(this.el.nativeElement, null).getPropertyValue('z-index');\r\n }\r\n if (this.zIndexMoving) {\r\n this.renderer.setStyle(this.el.nativeElement, 'z-index', this.zIndexMoving);\r\n }\r\n if (!this.moving) {\r\n this.started.emit(this.el.nativeElement);\r\n this.moving = true;\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.boundsCheck = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this.bounds) {\r\n var /** @type {?} */ boundary = this.bounds.getBoundingClientRect();\r\n var /** @type {?} */ elem = this.el.nativeElement.getBoundingClientRect();\r\n var /** @type {?} */ result = {\r\n 'top': this.outOfBounds.top ? true : boundary.top < elem.top,\r\n 'right': this.outOfBounds.right ? true : boundary.right > elem.right,\r\n 'bottom': this.outOfBounds.bottom ? true : boundary.bottom > elem.bottom,\r\n 'left': this.outOfBounds.left ? true : boundary.left < elem.left\r\n };\r\n if (this.inBounds) {\r\n if (!result.top) {\r\n this.tempTrans.y -= elem.top - boundary.top;\r\n }\r\n if (!result.bottom) {\r\n this.tempTrans.y -= elem.bottom - boundary.bottom;\r\n }\r\n if (!result.right) {\r\n this.tempTrans.x -= elem.right - boundary.right;\r\n }\r\n if (!result.left) {\r\n this.tempTrans.x -= elem.left - boundary.left;\r\n }\r\n this.transform();\r\n }\r\n return result;\r\n }\r\n };\r\n /** Get current offset */\r\n /**\r\n * Get current offset\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.getCurrentOffset = /**\r\n * Get current offset\r\n * @return {?}\r\n */\r\n function () {\r\n return this.currTrans.value;\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.putBack = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this._zIndex) {\r\n this.renderer.setStyle(this.el.nativeElement, 'z-index', this._zIndex);\r\n }\r\n else if (this.zIndexMoving) {\r\n if (this.oldZIndex) {\r\n this.renderer.setStyle(this.el.nativeElement, 'z-index', this.oldZIndex);\r\n }\r\n else {\r\n this.el.nativeElement.style.removeProperty('z-index');\r\n }\r\n }\r\n if (this.moving) {\r\n this.stopped.emit(this.el.nativeElement);\r\n // Remove the helper div:\r\n this._helperBlock.remove();\r\n if (this.needTransform) {\r\n if (Position.isIPosition(this.position)) {\r\n this.oldTrans.set(this.position);\r\n }\r\n else {\r\n this.oldTrans.reset();\r\n }\r\n this.transform();\r\n this.needTransform = false;\r\n }\r\n if (this.bounds) {\r\n this.edge.emit(this.boundsCheck());\r\n }\r\n this.moving = false;\r\n this.endOffset.emit(this.currTrans.value);\r\n if (this.trackPosition) {\r\n this.oldTrans.add(this.tempTrans);\r\n }\r\n this.tempTrans.reset();\r\n if (!this.trackPosition) {\r\n this.transform();\r\n }\r\n }\r\n };\r\n /**\r\n * @param {?} target\r\n * @param {?} element\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.checkHandleTarget = /**\r\n * @param {?} target\r\n * @param {?} element\r\n * @return {?}\r\n */\r\n function (target, element) {\r\n // Checks if the target is the element clicked, then checks each child element of element as well\r\n // Ignores button clicks\r\n // Ignore elements of type button\r\n if (element.tagName === 'BUTTON') {\r\n return false;\r\n }\r\n // If the target was found, return true (handle was found)\r\n if (element === target) {\r\n return true;\r\n }\r\n // Recursively iterate this elements children\r\n for (var /** @type {?} */ child in element.children) {\r\n if (element.children.hasOwnProperty(child)) {\r\n if (this.checkHandleTarget(target, element.children[child])) {\r\n return true;\r\n }\r\n }\r\n }\r\n // Handle was not found in this lineage\r\n // Note: return false is ignore unless it is the parent element\r\n return false;\r\n };\r\n /**\r\n * @param {?} event\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.onMouseDown = /**\r\n * @param {?} event\r\n * @return {?}\r\n */\r\n function (event) {\r\n // 1. skip right click;\r\n if (event instanceof MouseEvent && event.button === 2) {\r\n return;\r\n }\r\n // 2. if handle is set, the element can only be moved by handle\r\n var /** @type {?} */ target = event.target || event.srcElement;\r\n if (this.handle !== undefined && !this.checkHandleTarget(target, this.handle)) {\r\n return;\r\n }\r\n if (this.preventDefaultEvent) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n this.orignal = Position.fromEvent(event);\r\n this.pickUp();\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.onMouseLeave = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this.putBack();\r\n };\r\n /**\r\n * @param {?} event\r\n * @return {?}\r\n */\r\n AngularDraggableDirective.prototype.onMouseMove = /**\r\n * @param {?} event\r\n * @return {?}\r\n */\r\n function (event) {\r\n if (this.moving && this.allowDrag) {\r\n if (this.preventDefaultEvent) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n // Add a transparent helper div:\r\n this._helperBlock.add();\r\n this.moveTo(Position.fromEvent(event));\r\n }\r\n };\r\n AngularDraggableDirective.decorators = [\r\n { type: Directive, args: [{\r\n selector: '[ngDraggable]',\r\n exportAs: 'ngDraggable'\r\n },] },\r\n ];\r\n /** @nocollapse */\r\n AngularDraggableDirective.ctorParameters = function () { return [\r\n { type: ElementRef },\r\n { type: Renderer2 }\r\n ]; };\r\n AngularDraggableDirective.propDecorators = {\r\n started: [{ type: Output }],\r\n stopped: [{ type: Output }],\r\n edge: [{ type: Output }],\r\n handle: [{ type: Input }],\r\n bounds: [{ type: Input }],\r\n outOfBounds: [{ type: Input }],\r\n gridSize: [{ type: Input }],\r\n zIndexMoving: [{ type: Input }],\r\n zIndex: [{ type: Input }],\r\n inBounds: [{ type: Input }],\r\n trackPosition: [{ type: Input }],\r\n scale: [{ type: Input }],\r\n preventDefaultEvent: [{ type: Input }],\r\n position: [{ type: Input }],\r\n movingOffset: [{ type: Output }],\r\n endOffset: [{ type: Output }],\r\n ngDraggable: [{ type: Input }],\r\n onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }, { type: HostListener, args: ['touchstart', ['$event'],] }],\r\n onMouseLeave: [{ type: HostListener, args: ['document:mouseup',] }, { type: HostListener, args: ['document:mouseleave',] }, { type: HostListener, args: ['document:touchend',] }, { type: HostListener, args: ['document:touchcancel',] }],\r\n onMouseMove: [{ type: HostListener, args: ['document:mousemove', ['$event'],] }, { type: HostListener, args: ['document:touchmove', ['$event'],] }]\r\n };\r\n return AngularDraggableDirective;\r\n}());\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\r\nvar ResizeHandle = /** @class */ (function () {\r\n function ResizeHandle(parent, renderer, type, css, onMouseDown) {\r\n var _this = this;\r\n this.parent = parent;\r\n this.renderer = renderer;\r\n this.type = type;\r\n this.css = css;\r\n this.onMouseDown = onMouseDown;\r\n // generate handle div\r\n var /** @type {?} */ handle = renderer.createElement('div');\r\n renderer.addClass(handle, 'ng-resizable-handle');\r\n renderer.addClass(handle, css);\r\n // add default diagonal for se handle\r\n if (type === 'se') {\r\n renderer.addClass(handle, 'ng-resizable-diagonal');\r\n }\r\n // append div to parent\r\n if (this.parent) {\r\n parent.appendChild(handle);\r\n }\r\n // create and register event listener\r\n this._onResize = function (event) { onMouseDown(event, _this); };\r\n handle.addEventListener('mousedown', this._onResize);\r\n handle.addEventListener('touchstart', this._onResize);\r\n // done\r\n this._handle = handle;\r\n }\r\n /**\r\n * @return {?}\r\n */\r\n ResizeHandle.prototype.dispose = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this._handle.removeEventListener('mousedown', this._onResize);\r\n this._handle.removeEventListener('touchstart', this._onResize);\r\n if (this.parent) {\r\n this.parent.removeChild(this._handle);\r\n }\r\n this._handle = null;\r\n this._onResize = null;\r\n };\r\n Object.defineProperty(ResizeHandle.prototype, \"el\", {\r\n get: /**\r\n * @return {?}\r\n */\r\n function () {\r\n return this._handle;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return ResizeHandle;\r\n}());\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\r\nvar Size = /** @class */ (function () {\r\n function Size(width, height) {\r\n this.width = width;\r\n this.height = height;\r\n }\r\n /**\r\n * @param {?} el\r\n * @return {?}\r\n */\r\n Size.getCurrent = /**\r\n * @param {?} el\r\n * @return {?}\r\n */\r\n function (el) {\r\n var /** @type {?} */ size = new Size(0, 0);\r\n if (window) {\r\n var /** @type {?} */ computed = window.getComputedStyle(el);\r\n if (computed) {\r\n size.width = parseInt(computed.getPropertyValue('width'), 10);\r\n size.height = parseInt(computed.getPropertyValue('height'), 10);\r\n }\r\n return size;\r\n }\r\n else {\r\n console.error('Not Supported!');\r\n return null;\r\n }\r\n };\r\n /**\r\n * @param {?} s\r\n * @return {?}\r\n */\r\n Size.copy = /**\r\n * @param {?} s\r\n * @return {?}\r\n */\r\n function (s) {\r\n return new Size(0, 0).set(s);\r\n };\r\n /**\r\n * @param {?} s\r\n * @return {?}\r\n */\r\n Size.prototype.set = /**\r\n * @param {?} s\r\n * @return {?}\r\n */\r\n function (s) {\r\n this.width = s.width;\r\n this.height = s.height;\r\n return this;\r\n };\r\n return Size;\r\n}());\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\r\nvar AngularResizableDirective = /** @class */ (function () {\r\n function AngularResizableDirective(el, renderer) {\r\n this.el = el;\r\n this.renderer = renderer;\r\n this._resizable = true;\r\n this._handles = {};\r\n this._handleType = [];\r\n this._handleResizing = null;\r\n this._direction = null;\r\n this._aspectRatio = 0;\r\n this._containment = null;\r\n this._origMousePos = null;\r\n /**\r\n * Original Size and Position\r\n */\r\n this._origSize = null;\r\n this._origPos = null;\r\n /**\r\n * Current Size and Position\r\n */\r\n this._currSize = null;\r\n this._currPos = null;\r\n /**\r\n * Initial Size and Position\r\n */\r\n this._initSize = null;\r\n this._initPos = null;\r\n /**\r\n * Snap to gird\r\n */\r\n this._gridSize = null;\r\n this._bounding = null;\r\n /**\r\n * Bugfix: iFrames, and context unrelated elements block all events, and are unusable\r\n * https://github.com/xieziyu/angular2-draggable/issues/84\r\n */\r\n this._helperBlock = null;\r\n /**\r\n * Which handles can be used for resizing.\r\n * \\@example\r\n * [rzHandles] = \"'n,e,s,w,se,ne,sw,nw'\"\r\n * equals to: [rzHandles] = \"'all'\"\r\n *\r\n *\r\n */\r\n this.rzHandles = 'e,s,se';\r\n /**\r\n * Whether the element should be constrained to a specific aspect ratio.\r\n * Multiple types supported:\r\n * boolean: When set to true, the element will maintain its original aspect ratio.\r\n * number: Force the element to maintain a specific aspect ratio during resizing.\r\n */\r\n this.rzAspectRatio = false;\r\n /**\r\n * Constrains resizing to within the bounds of the specified element or region.\r\n * Multiple types supported:\r\n * Selector: The resizable element will be contained to the bounding box of the first element found by the selector.\r\n * If no element is found, no containment will be set.\r\n * Element: The resizable element will be contained to the bounding box of this element.\r\n * String: Possible values: \"parent\".\r\n */\r\n this.rzContainment = null;\r\n /**\r\n * Snaps the resizing element to a grid, every x and y pixels.\r\n * A number for both width and height or an array values like [ x, y ]\r\n */\r\n this.rzGrid = null;\r\n /**\r\n * The minimum width the resizable should be allowed to resize to.\r\n */\r\n this.rzMinWidth = null;\r\n /**\r\n * The minimum height the resizable should be allowed to resize to.\r\n */\r\n this.rzMinHeight = null;\r\n /**\r\n * The maximum width the resizable should be allowed to resize to.\r\n */\r\n this.rzMaxWidth = null;\r\n /**\r\n * The maximum height the resizable should be allowed to resize to.\r\n */\r\n this.rzMaxHeight = null;\r\n /**\r\n * Whether to prevent default event\r\n */\r\n this.preventDefaultEvent = true;\r\n /**\r\n * emitted when start resizing\r\n */\r\n this.rzStart = new EventEmitter();\r\n /**\r\n * emitted when start resizing\r\n */\r\n this.rzResizing = new EventEmitter();\r\n /**\r\n * emitted when stop resizing\r\n */\r\n this.rzStop = new EventEmitter();\r\n this._helperBlock = new HelperBlock(el.nativeElement, renderer);\r\n }\r\n Object.defineProperty(AngularResizableDirective.prototype, \"ngResizable\", {\r\n /** Disables the resizable if set to false. */\r\n set: /**\r\n * Disables the resizable if set to false.\r\n * @param {?} v\r\n * @return {?}\r\n */\r\n function (v) {\r\n if (v !== undefined && v !== null && v !== '') {\r\n this._resizable = !!v;\r\n this.updateResizable();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {?} changes\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.ngOnChanges = /**\r\n * @param {?} changes\r\n * @return {?}\r\n */\r\n function (changes) {\r\n if (changes['rzHandles'] && !changes['rzHandles'].isFirstChange()) {\r\n this.updateResizable();\r\n }\r\n if (changes['rzAspectRatio'] && !changes['rzAspectRatio'].isFirstChange()) {\r\n this.updateAspectRatio();\r\n }\r\n if (changes['rzContainment'] && !changes['rzContainment'].isFirstChange()) {\r\n this.updateContainment();\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.ngOnInit = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this.updateResizable();\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.ngOnDestroy = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this.removeHandles();\r\n this._containment = null;\r\n this._helperBlock.dispose();\r\n this._helperBlock = null;\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.ngAfterViewInit = /**\r\n * @return {?}\r\n */\r\n function () {\r\n var /** @type {?} */ elm = this.el.nativeElement;\r\n this._initSize = Size.getCurrent(elm);\r\n this._initPos = Position.getCurrent(elm);\r\n this._currSize = Size.copy(this._initSize);\r\n this._currPos = Position.copy(this._initPos);\r\n this.updateAspectRatio();\r\n this.updateContainment();\r\n };\r\n /**\r\n * A method to reset size\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.resetSize = /**\r\n * A method to reset size\r\n * @return {?}\r\n */\r\n function () {\r\n this._currSize = Size.copy(this._initSize);\r\n this._currPos = Position.copy(this._initPos);\r\n this.doResize();\r\n };\r\n /**\r\n * A method to get current status\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.getStatus = /**\r\n * A method to get current status\r\n * @return {?}\r\n */\r\n function () {\r\n if (!this._currPos || !this._currSize) {\r\n return null;\r\n }\r\n return {\r\n size: {\r\n width: this._currSize.width,\r\n height: this._currSize.height\r\n },\r\n position: {\r\n top: this._currPos.y,\r\n left: this._currPos.x\r\n }\r\n };\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.updateResizable = /**\r\n * @return {?}\r\n */\r\n function () {\r\n var /** @type {?} */ element = this.el.nativeElement;\r\n // clear handles:\r\n this.renderer.removeClass(element, 'ng-resizable');\r\n this.removeHandles();\r\n // create new ones:\r\n if (this._resizable) {\r\n this.renderer.addClass(element, 'ng-resizable');\r\n this.createHandles();\r\n }\r\n };\r\n /**\r\n * Use it to update aspect\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.updateAspectRatio = /**\r\n * Use it to update aspect\r\n * @return {?}\r\n */\r\n function () {\r\n if (typeof this.rzAspectRatio === 'boolean') {\r\n if (this.rzAspectRatio && this._currSize.height) {\r\n this._aspectRatio = (this._currSize.width / this._currSize.height);\r\n }\r\n else {\r\n this._aspectRatio = 0;\r\n }\r\n }\r\n else {\r\n var /** @type {?} */ r = Number(this.rzAspectRatio);\r\n this._aspectRatio = isNaN(r) ? 0 : r;\r\n }\r\n };\r\n /**\r\n * Use it to update containment\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.updateContainment = /**\r\n * Use it to update containment\r\n * @return {?}\r\n */\r\n function () {\r\n if (!this.rzContainment) {\r\n this._containment = null;\r\n return;\r\n }\r\n if (typeof this.rzContainment === 'string') {\r\n if (this.rzContainment === 'parent') {\r\n this._containment = this.el.nativeElement.parentElement;\r\n }\r\n else {\r\n this._containment = document.querySelector(this.rzContainment);\r\n }\r\n }\r\n else {\r\n this._containment = this.rzContainment;\r\n }\r\n };\r\n /**\r\n * Use it to create handle divs\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.createHandles = /**\r\n * Use it to create handle divs\r\n * @return {?}\r\n */\r\n function () {\r\n if (!this.rzHandles) {\r\n return;\r\n }\r\n var /** @type {?} */ tmpHandleTypes;\r\n if (typeof this.rzHandles === 'string') {\r\n if (this.rzHandles === 'all') {\r\n tmpHandleTypes = ['n', 'e', 's', 'w', 'ne', 'se', 'nw', 'sw'];\r\n }\r\n else {\r\n tmpHandleTypes = this.rzHandles.replace(/ /g, '').toLowerCase().split(',');\r\n }\r\n try {\r\n for (var tmpHandleTypes_1 = __values(tmpHandleTypes), tmpHandleTypes_1_1 = tmpHandleTypes_1.next(); !tmpHandleTypes_1_1.done; tmpHandleTypes_1_1 = tmpHandleTypes_1.next()) {\r\n var type = tmpHandleTypes_1_1.value;\r\n // default handle theme: ng-resizable-$type.\r\n var /** @type {?} */ handle = this.createHandleByType(type, \"ng-resizable-\" + type);\r\n if (handle) {\r\n this._handleType.push(type);\r\n this._handles[type] = handle;\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (tmpHandleTypes_1_1 && !tmpHandleTypes_1_1.done && (_a = tmpHandleTypes_1.return)) _a.call(tmpHandleTypes_1);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n }\r\n else {\r\n tmpHandleTypes = Object.keys(this.rzHandles);\r\n try {\r\n for (var tmpHandleTypes_2 = __values(tmpHandleTypes), tmpHandleTypes_2_1 = tmpHandleTypes_2.next(); !tmpHandleTypes_2_1.done; tmpHandleTypes_2_1 = tmpHandleTypes_2.next()) {\r\n var type = tmpHandleTypes_2_1.value;\r\n // custom handle theme.\r\n var /** @type {?} */ handle = this.createHandleByType(type, this.rzHandles[type]);\r\n if (handle) {\r\n this._handleType.push(type);\r\n this._handles[type] = handle;\r\n }\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (tmpHandleTypes_2_1 && !tmpHandleTypes_2_1.done && (_b = tmpHandleTypes_2.return)) _b.call(tmpHandleTypes_2);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n }\r\n var e_1, _a, e_2, _b;\r\n };\r\n /**\r\n * Use it to create a handle\r\n * @param {?} type\r\n * @param {?} css\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.createHandleByType = /**\r\n * Use it to create a handle\r\n * @param {?} type\r\n * @param {?} css\r\n * @return {?}\r\n */\r\n function (type, css) {\r\n var /** @type {?} */ _el = this.el.nativeElement;\r\n if (!type.match(/^(se|sw|ne|nw|n|e|s|w)$/)) {\r\n console.error('Invalid handle type:', type);\r\n return null;\r\n }\r\n return new ResizeHandle(_el, this.renderer, type, css, this.onMouseDown.bind(this));\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.removeHandles = /**\r\n * @return {?}\r\n */\r\n function () {\r\n try {\r\n for (var _a = __values(this._handleType), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var type = _b.value;\r\n this._handles[type].dispose();\r\n }\r\n }\r\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_3) throw e_3.error; }\r\n }\r\n this._handleType = [];\r\n this._handles = {};\r\n var e_3, _c;\r\n };\r\n /**\r\n * @param {?} event\r\n * @param {?} handle\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.onMouseDown = /**\r\n * @param {?} event\r\n * @param {?} handle\r\n * @return {?}\r\n */\r\n function (event, handle) {\r\n // skip right click;\r\n if (event instanceof MouseEvent && event.button === 2) {\r\n return;\r\n }\r\n if (this.preventDefaultEvent) {\r\n // prevent default events\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n if (!this._handleResizing) {\r\n this._origMousePos = Position.fromEvent(event);\r\n this.startResize(handle);\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.onMouseLeave = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this._handleResizing) {\r\n this.stopResize();\r\n this._origMousePos = null;\r\n }\r\n };\r\n /**\r\n * @param {?} event\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.onMouseMove = /**\r\n * @param {?} event\r\n * @return {?}\r\n */\r\n function (event) {\r\n if (this._handleResizing && this._resizable && this._origMousePos && this._origPos && this._origSize) {\r\n this.resizeTo(Position.fromEvent(event));\r\n this.onResizing();\r\n }\r\n };\r\n /**\r\n * @param {?} handle\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.startResize = /**\r\n * @param {?} handle\r\n * @return {?}\r\n */\r\n function (handle) {\r\n var /** @type {?} */ elm = this.el.nativeElement;\r\n this._origSize = Size.getCurrent(elm);\r\n this._origPos = Position.getCurrent(elm); // x: left, y: top\r\n this._currSize = Size.copy(this._origSize);\r\n this._currPos = Position.copy(this._origPos);\r\n if (this._containment) {\r\n this.getBounding();\r\n }\r\n this.getGridSize();\r\n // Add a transparent helper div:\r\n this._helperBlock.add();\r\n this._handleResizing = handle;\r\n this.updateDirection();\r\n this.rzStart.emit(this.getResizingEvent());\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.stopResize = /**\r\n * @return {?}\r\n */\r\n function () {\r\n // Remove the helper div:\r\n this._helperBlock.remove();\r\n this.rzStop.emit(this.getResizingEvent());\r\n this._handleResizing = null;\r\n this._direction = null;\r\n this._origSize = null;\r\n this._origPos = null;\r\n if (this._containment) {\r\n this.resetBounding();\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.onResizing = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this.rzResizing.emit(this.getResizingEvent());\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.getResizingEvent = /**\r\n * @return {?}\r\n */\r\n function () {\r\n return {\r\n host: this.el.nativeElement,\r\n handle: this._handleResizing ? this._handleResizing.el : null,\r\n size: {\r\n width: this._currSize.width,\r\n height: this._currSize.height\r\n },\r\n position: {\r\n top: this._currPos.y,\r\n left: this._currPos.x\r\n }\r\n };\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.updateDirection = /**\r\n * @return {?}\r\n */\r\n function () {\r\n this._direction = {\r\n n: !!this._handleResizing.type.match(/n/),\r\n s: !!this._handleResizing.type.match(/s/),\r\n w: !!this._handleResizing.type.match(/w/),\r\n e: !!this._handleResizing.type.match(/e/)\r\n };\r\n };\r\n /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.resizeTo = /**\r\n * @param {?} p\r\n * @return {?}\r\n */\r\n function (p) {\r\n p.subtract(this._origMousePos);\r\n var /** @type {?} */ tmpX = Math.round(p.x / this._gridSize.x) * this._gridSize.x;\r\n var /** @type {?} */ tmpY = Math.round(p.y / this._gridSize.y) * this._gridSize.y;\r\n if (this._direction.n) {\r\n // n, ne, nw\r\n this._currPos.y = this._origPos.y + tmpY;\r\n this._currSize.height = this._origSize.height - tmpY;\r\n }\r\n else if (this._direction.s) {\r\n // s, se, sw\r\n this._currSize.height = this._origSize.height + tmpY;\r\n }\r\n if (this._direction.e) {\r\n // e, ne, se\r\n this._currSize.width = this._origSize.width + tmpX;\r\n }\r\n else if (this._direction.w) {\r\n // w, nw, sw\r\n this._currSize.width = this._origSize.width - tmpX;\r\n this._currPos.x = this._origPos.x + tmpX;\r\n }\r\n this.checkBounds();\r\n this.checkSize();\r\n this.adjustByRatio();\r\n this.doResize();\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.doResize = /**\r\n * @return {?}\r\n */\r\n function () {\r\n var /** @type {?} */ container = this.el.nativeElement;\r\n if (this._direction.n || this._direction.s || this._aspectRatio) {\r\n this.renderer.setStyle(container, 'height', this._currSize.height + 'px');\r\n }\r\n if (this._direction.w || this._direction.e || this._aspectRatio) {\r\n this.renderer.setStyle(container, 'width', this._currSize.width + 'px');\r\n }\r\n this.renderer.setStyle(container, 'left', this._currPos.x + 'px');\r\n this.renderer.setStyle(container, 'top', this._currPos.y + 'px');\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.adjustByRatio = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this._aspectRatio) {\r\n if (this._direction.e || this._direction.w) {\r\n this._currSize.height = this._currSize.width / this._aspectRatio;\r\n }\r\n else {\r\n this._currSize.width = this._aspectRatio * this._currSize.height;\r\n }\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.checkBounds = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this._containment) {\r\n var /** @type {?} */ maxWidth = this._bounding.width - this._bounding.pr - this.el.nativeElement.offsetLeft - this._bounding.translateX;\r\n var /** @type {?} */ maxHeight = this._bounding.height - this._bounding.pb - this.el.nativeElement.offsetTop - this._bounding.translateY;\r\n if (this._direction.n && (this._currPos.y + this._bounding.translateY) < 0) {\r\n this._currPos.y = -this._bounding.translateY;\r\n this._currSize.height = this._origSize.height + this._origPos.y + this._bounding.translateY;\r\n }\r\n if (this._direction.w && (this._currPos.x + this._bounding.translateX) < 0) {\r\n this._currPos.x = -this._bounding.translateX;\r\n this._currSize.width = this._origSize.width + this._origPos.x + this._bounding.translateX;\r\n }\r\n if (this._currSize.width > maxWidth) {\r\n this._currSize.width = maxWidth;\r\n }\r\n if (this._currSize.height > maxHeight) {\r\n this._currSize.height = maxHeight;\r\n }\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.checkSize = /**\r\n * @return {?}\r\n */\r\n function () {\r\n var /** @type {?} */ minHeight = !this.rzMinHeight ? 1 : this.rzMinHeight;\r\n var /** @type {?} */ minWidth = !this.rzMinWidth ? 1 : this.rzMinWidth;\r\n if (this._currSize.height < minHeight) {\r\n this._currSize.height = minHeight;\r\n if (this._direction.n) {\r\n this._currPos.y = this._origPos.y + (this._origSize.height - minHeight);\r\n }\r\n }\r\n if (this._currSize.width < minWidth) {\r\n this._currSize.width = minWidth;\r\n if (this._direction.w) {\r\n this._currPos.x = this._origPos.x + (this._origSize.width - minWidth);\r\n }\r\n }\r\n if (this.rzMaxHeight && this._currSize.height > this.rzMaxHeight) {\r\n this._currSize.height = this.rzMaxHeight;\r\n if (this._direction.n) {\r\n this._currPos.y = this._origPos.y + (this._origSize.height - this.rzMaxHeight);\r\n }\r\n }\r\n if (this.rzMaxWidth && this._currSize.width > this.rzMaxWidth) {\r\n this._currSize.width = this.rzMaxWidth;\r\n if (this._direction.w) {\r\n this._currPos.x = this._origPos.x + (this._origSize.width - this.rzMaxWidth);\r\n }\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.getBounding = /**\r\n * @return {?}\r\n */\r\n function () {\r\n var /** @type {?} */ el = this._containment;\r\n var /** @type {?} */ computed = window.getComputedStyle(el);\r\n if (computed) {\r\n var /** @type {?} */ p = computed.getPropertyValue('position');\r\n var /** @type {?} */ nativeEl = window.getComputedStyle(this.el.nativeElement);\r\n var /** @type {?} */ transforms = nativeEl.getPropertyValue('transform').replace(/[^-\\d,]/g, '').split(',');\r\n this._bounding = {};\r\n this._bounding.width = el.clientWidth;\r\n this._bounding.height = el.clientHeight;\r\n this._bounding.pr = parseInt(computed.getPropertyValue('padding-right'), 10);\r\n this._bounding.pb = parseInt(computed.getPropertyValue('padding-bottom'), 10);\r\n if (transforms.length >= 6) {\r\n this._bounding.translateX = parseInt(transforms[4], 10);\r\n this._bounding.translateY = parseInt(transforms[5], 10);\r\n }\r\n else {\r\n this._bounding.translateX = 0;\r\n this._bounding.translateY = 0;\r\n }\r\n this._bounding.position = computed.getPropertyValue('position');\r\n if (p === 'static') {\r\n this.renderer.setStyle(el, 'position', 'relative');\r\n }\r\n }\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.resetBounding = /**\r\n * @return {?}\r\n */\r\n function () {\r\n if (this._bounding && this._bounding.position === 'static') {\r\n this.renderer.setStyle(this._containment, 'position', 'relative');\r\n }\r\n this._bounding = null;\r\n };\r\n /**\r\n * @return {?}\r\n */\r\n AngularResizableDirective.prototype.getGridSize = /**\r\n * @return {?}\r\n */\r\n function () {\r\n // set default value:\r\n this._gridSize = { x: 1, y: 1 };\r\n if (this.rzGrid) {\r\n if (typeof this.rzGrid === 'number') {\r\n this._gridSize = { x: this.rzGrid, y: this.rzGrid };\r\n }\r\n else if (Array.isArray(this.rzGrid)) {\r\n this._gridSize = { x: this.rzGrid[0], y: this.rzGrid[1] };\r\n }\r\n }\r\n };\r\n AngularResizableDirective.decorators = [\r\n { type: Directive, args: [{\r\n selector: '[ngResizable]',\r\n exportAs: 'ngResizable'\r\n },] },\r\n ];\r\n /** @nocollapse */\r\n AngularResizableDirective.ctorParameters = function () { return [\r\n { type: ElementRef },\r\n { type: Renderer2 }\r\n ]; };\r\n AngularResizableDirective.propDecorators = {\r\n ngResizable: [{ type: Input }],\r\n rzHandles: [{ type: Input }],\r\n rzAspectRatio: [{ type: Input }],\r\n rzContainment: [{ type: Input }],\r\n rzGrid: [{ type: Input }],\r\n rzMinWidth: [{ type: Input }],\r\n rzMinHeight: [{ type: Input }],\r\n rzMaxWidth: [{ type: Input }],\r\n rzMaxHeight: [{ type: Input }],\r\n preventDefaultEvent: [{ type: Input }],\r\n rzStart: [{ type: Output }],\r\n rzResizing: [{ type: Output }],\r\n rzStop: [{ type: Output }],\r\n onMouseLeave: [{ type: HostListener, args: ['document:mouseup',] }, { type: HostListener, args: ['document:mouseleave',] }, { type: HostListener, args: ['document:touchend',] }, { type: HostListener, args: ['document:touchcancel',] }],\r\n onMouseMove: [{ type: HostListener, args: ['document:mousemove', ['$event'],] }, { type: HostListener, args: ['document:touchmove', ['$event'],] }]\r\n };\r\n return AngularResizableDirective;\r\n}());\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\r\nvar AngularDraggableModule = /** @class */ (function () {\r\n function AngularDraggableModule() {\r\n }\r\n AngularDraggableModule.decorators = [\r\n { type: NgModule, args: [{\r\n imports: [],\r\n declarations: [\r\n AngularDraggableDirective,\r\n AngularResizableDirective\r\n ],\r\n exports: [\r\n AngularDraggableDirective,\r\n AngularResizableDirective\r\n ]\r\n },] },\r\n ];\r\n return AngularDraggableModule;\r\n}());\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\n\n/**\r\n * @fileoverview added by tsickle\r\n * @suppress {checkTypes} checked by tsc\r\n */\n\nexport { AngularDraggableDirective, AngularResizableDirective, AngularDraggableModule, Position };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhcjItZHJhZ2dhYmxlLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9hbmd1bGFyMi1kcmFnZ2FibGUvbGliL21vZGVscy9wb3NpdGlvbi50cyIsIm5nOi8vYW5ndWxhcjItZHJhZ2dhYmxlL2xpYi93aWRnZXRzL2hlbHBlci1ibG9jay50cyIsIm5nOi8vYW5ndWxhcjItZHJhZ2dhYmxlL2xpYi9hbmd1bGFyLWRyYWdnYWJsZS5kaXJlY3RpdmUudHMiLCJuZzovL2FuZ3VsYXIyLWRyYWdnYWJsZS9saWIvd2lkZ2V0cy9yZXNpemUtaGFuZGxlLnRzIiwibmc6Ly9hbmd1bGFyMi1kcmFnZ2FibGUvbGliL21vZGVscy9zaXplLnRzIiwibmc6Ly9hbmd1bGFyMi1kcmFnZ2FibGUvbGliL2FuZ3VsYXItcmVzaXphYmxlLmRpcmVjdGl2ZS50cyIsIm5nOi8vYW5ndWxhcjItZHJhZ2dhYmxlL2xpYi9hbmd1bGFyLWRyYWdnYWJsZS5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJUG9zaXRpb24ge1xyXG4gIHg6IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQb3NpdGlvbiBpbXBsZW1lbnRzIElQb3NpdGlvbiB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHg6IG51bWJlciwgcHVibGljIHk6IG51bWJlcikgeyB9XHJcblxyXG4gIHN0YXRpYyBmcm9tRXZlbnQoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcclxuICAgIGlmIChlIGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xyXG4gICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgUG9zaXRpb24oZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLCBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzSVBvc2l0aW9uKG9iaik6IG9iaiBpcyBJUG9zaXRpb24ge1xyXG4gICAgcmV0dXJuICEhb2JqICYmICgneCcgaW4gb2JqKSAmJiAoJ3knIGluIG9iaik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0Q3VycmVudChlbDogRWxlbWVudCkge1xyXG4gICAgbGV0IHBvcyA9IG5ldyBQb3NpdGlvbigwLCAwKTtcclxuXHJcbiAgICBpZiAod2luZG93KSB7XHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xyXG4gICAgICBpZiAoY29tcHV0ZWQpIHtcclxuICAgICAgICBsZXQgeCA9IHBhcnNlSW50KGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoJ2xlZnQnKSwgMTApO1xyXG4gICAgICAgIGxldCB5ID0gcGFyc2VJbnQoY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSgndG9wJyksIDEwKTtcclxuICAgICAgICBwb3MueCA9IGlzTmFOKHgpID8gMCA6IHg7XHJcbiAgICAgICAgcG9zLnkgPSBpc05hTih5KSA/IDAgOiB5O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwb3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdOb3QgU3VwcG9ydGVkIScpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb3B5KHA6IElQb3NpdGlvbikge1xyXG4gICAgcmV0dXJuIG5ldyBQb3NpdGlvbigwLCAwKS5zZXQocCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogSVBvc2l0aW9uIHtcclxuICAgIHJldHVybiB7IHg6IHRoaXMueCwgeTogdGhpcy55IH07XHJcbiAgfVxyXG5cclxuICBhZGQocDogSVBvc2l0aW9uKSB7XHJcbiAgICB0aGlzLnggKz0gcC54O1xyXG4gICAgdGhpcy55ICs9IHAueTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc3VidHJhY3QocDogSVBvc2l0aW9uKSB7XHJcbiAgICB0aGlzLnggLT0gcC54O1xyXG4gICAgdGhpcy55IC09IHAueTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcmVzZXQoKSB7XHJcbiAgICB0aGlzLnggPSAwO1xyXG4gICAgdGhpcy55ID0gMDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2V0KHA6IElQb3NpdGlvbikge1xyXG4gICAgdGhpcy54ID0gcC54O1xyXG4gICAgdGhpcy55ID0gcC55O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEhlbHBlckJsb2NrIHtcclxuICBwcm90ZWN0ZWQgX2hlbHBlcjogRWxlbWVudDtcclxuICBwcml2YXRlIF9hZGRlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBwYXJlbnQ6IEVsZW1lbnQsXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMlxyXG4gICkge1xyXG4gICAgLy8gZ2VuZXJhdGUgaGVscGVyIGRpdlxyXG4gICAgbGV0IGhlbHBlciA9IHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgcmVuZGVyZXIuc2V0U3R5bGUoaGVscGVyLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHJlbmRlcmVyLnNldFN0eWxlKGhlbHBlciwgJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgIHJlbmRlcmVyLnNldFN0eWxlKGhlbHBlciwgJ2hlaWdodCcsICcxMDAlJyk7XHJcbiAgICByZW5kZXJlci5zZXRTdHlsZShoZWxwZXIsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ3RyYW5zcGFyZW50Jyk7XHJcbiAgICByZW5kZXJlci5zZXRTdHlsZShoZWxwZXIsICd0b3AnLCAnMCcpO1xyXG4gICAgcmVuZGVyZXIuc2V0U3R5bGUoaGVscGVyLCAnbGVmdCcsICcwJyk7XHJcblxyXG4gICAgLy8gZG9uZVxyXG4gICAgdGhpcy5faGVscGVyID0gaGVscGVyO1xyXG4gIH1cclxuXHJcbiAgYWRkKCkge1xyXG4gICAgLy8gYXBwZW5kIGRpdiB0byBwYXJlbnRcclxuICAgIGlmICh0aGlzLnBhcmVudCAmJiAhdGhpcy5fYWRkZWQpIHtcclxuICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVscGVyKTtcclxuICAgICAgdGhpcy5fYWRkZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKCkge1xyXG4gICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMuX2FkZGVkKSB7XHJcbiAgICAgIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX2hlbHBlcik7XHJcbiAgICAgIHRoaXMuX2FkZGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5faGVscGVyID0gbnVsbDtcclxuICAgIHRoaXMuX2FkZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgZWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faGVscGVyO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLFxyXG4gIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgSG9zdExpc3RlbmVyLFxyXG4gIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IElQb3NpdGlvbiwgUG9zaXRpb24gfSBmcm9tICcuL21vZGVscy9wb3NpdGlvbic7XHJcbmltcG9ydCB7IEhlbHBlckJsb2NrIH0gZnJvbSAnLi93aWRnZXRzL2hlbHBlci1ibG9jayc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuZ0RyYWdnYWJsZV0nLFxyXG4gIGV4cG9ydEFzOiAnbmdEcmFnZ2FibGUnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRHJhZ2dhYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHJpdmF0ZSBhbGxvd0RyYWcgPSB0cnVlO1xyXG4gIHByaXZhdGUgbW92aW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBvcmlnbmFsOiBQb3NpdGlvbiA9IG51bGw7XHJcbiAgcHJpdmF0ZSBvbGRUcmFucyA9IG5ldyBQb3NpdGlvbigwLCAwKTtcclxuICBwcml2YXRlIHRlbXBUcmFucyA9IG5ldyBQb3NpdGlvbigwLCAwKTtcclxuICBwcml2YXRlIGN1cnJUcmFucyA9IG5ldyBQb3NpdGlvbigwLCAwKTtcclxuICBwcml2YXRlIG9sZFpJbmRleCA9ICcnO1xyXG4gIHByaXZhdGUgX3pJbmRleCA9ICcnO1xyXG4gIHByaXZhdGUgbmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBCdWdmaXg6IGlGcmFtZXMsIGFuZCBjb250ZXh0IHVucmVsYXRlZCBlbGVtZW50cyBibG9jayBhbGwgZXZlbnRzLCBhbmQgYXJlIHVudXNhYmxlXHJcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3hpZXppeXUvYW5ndWxhcjItZHJhZ2dhYmxlL2lzc3Vlcy84NFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hlbHBlckJsb2NrOiBIZWxwZXJCbG9jayA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZWxlbWVudCBpcyBkcmFnZ2VkIG9uY2UgYWZ0ZXIgYmVpbmcgaW5pdGlhbGlzZWRcclxuICAgKi9cclxuICBwcml2YXRlIGlzRHJhZ2dlZCA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgc3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzdG9wcGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGVkZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIE1ha2UgdGhlIGhhbmRsZSBIVE1MRWxlbWVudCBkcmFnZ2FibGUgKi9cclxuICBASW5wdXQoKSBoYW5kbGU6IEhUTUxFbGVtZW50O1xyXG5cclxuICAvKiogU2V0IHRoZSBib3VuZHMgSFRNTEVsZW1lbnQgKi9cclxuICBASW5wdXQoKSBib3VuZHM6IEhUTUxFbGVtZW50O1xyXG5cclxuICAvKiogTGlzdCBvZiBhbGxvd2VkIG91dCBvZiBib3VuZHMgZWRnZXMgKiovXHJcbiAgQElucHV0KCkgb3V0T2ZCb3VuZHMgPSB7XHJcbiAgICB0b3A6IGZhbHNlLFxyXG4gICAgcmlnaHQ6IGZhbHNlLFxyXG4gICAgYm90dG9tOiBmYWxzZSxcclxuICAgIGxlZnQ6IGZhbHNlXHJcbiAgfTtcclxuXHJcbiAgLyoqIFJvdW5kIHRoZSBwb3NpdGlvbiB0byBuZWFyZXN0IGdyaWQgKi9cclxuICBASW5wdXQoKSBncmlkU2l6ZSA9IDE7XHJcblxyXG4gIC8qKiBTZXQgei1pbmRleCB3aGVuIGRyYWdnaW5nICovXHJcbiAgQElucHV0KCkgekluZGV4TW92aW5nOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBTZXQgei1pbmRleCB3aGVuIG5vdCBkcmFnZ2luZyAqL1xyXG4gIEBJbnB1dCgpIHNldCB6SW5kZXgoc2V0dGluZzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3otaW5kZXgnLCBzZXR0aW5nKTtcclxuICAgIHRoaXMuX3pJbmRleCA9IHNldHRpbmc7XHJcbiAgfVxyXG4gIC8qKiBXaGV0aGVyIHRvIGxpbWl0IHRoZSBlbGVtZW50IHN0YXkgaW4gdGhlIGJvdW5kcyAqL1xyXG4gIEBJbnB1dCgpIGluQm91bmRzID0gZmFsc2U7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBlbGVtZW50IHNob3VsZCB1c2UgaXQncyBwcmV2aW91cyBkcmFnIHBvc2l0aW9uIG9uIGEgbmV3IGRyYWcgZXZlbnQuICovXHJcbiAgQElucHV0KCkgdHJhY2tQb3NpdGlvbiA9IHRydWU7XHJcblxyXG4gIC8qKiBJbnB1dCBjc3Mgc2NhbGUgdHJhbnNmb3JtIG9mIGVsZW1lbnQgc28gdHJhbnNsYXRpb25zIGFyZSBjb3JyZWN0ICovXHJcbiAgQElucHV0KCkgc2NhbGUgPSAxO1xyXG5cclxuICAvKiogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgZXZlbnQgKi9cclxuICBASW5wdXQoKSBwcmV2ZW50RGVmYXVsdEV2ZW50ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBTZXQgaW5pdGlhbCBwb3NpdGlvbiBieSBvZmZzZXRzICovXHJcbiAgQElucHV0KCkgcG9zaXRpb246IElQb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuICAvKiogRW1pdCBwb3NpdGlvbiBvZmZzZXRzIHdoZW4gbW92aW5nICovXHJcbiAgQE91dHB1dCgpIG1vdmluZ09mZnNldCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBvc2l0aW9uPigpO1xyXG5cclxuICAvKiogRW1pdCBwb3NpdGlvbiBvZmZzZXRzIHdoZW4gcHV0IGJhY2sgKi9cclxuICBAT3V0cHV0KCkgZW5kT2Zmc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjxJUG9zaXRpb24+KCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5nRHJhZ2dhYmxlKHNldHRpbmc6IGFueSkge1xyXG4gICAgaWYgKHNldHRpbmcgIT09IHVuZGVmaW5lZCAmJiBzZXR0aW5nICE9PSBudWxsICYmIHNldHRpbmcgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuYWxsb3dEcmFnID0gISFzZXR0aW5nO1xyXG5cclxuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmhhbmRsZSA/IHRoaXMuaGFuZGxlIDogdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgaWYgKHRoaXMuYWxsb3dEcmFnKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnbmctZHJhZ2dhYmxlJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnbmctZHJhZ2dhYmxlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG4gICAgdGhpcy5faGVscGVyQmxvY2sgPSBuZXcgSGVscGVyQmxvY2soZWwubmF0aXZlRWxlbWVudCwgcmVuZGVyZXIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5hbGxvd0RyYWcpIHtcclxuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmhhbmRsZSA/IHRoaXMuaGFuZGxlIDogdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICduZy1kcmFnZ2FibGUnKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVzZXRQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmJvdW5kcyA9IG51bGw7XHJcbiAgICB0aGlzLmhhbmRsZSA9IG51bGw7XHJcbiAgICB0aGlzLm9yaWduYWwgPSBudWxsO1xyXG4gICAgdGhpcy5vbGRUcmFucyA9IG51bGw7XHJcbiAgICB0aGlzLnRlbXBUcmFucyA9IG51bGw7XHJcbiAgICB0aGlzLmN1cnJUcmFucyA9IG51bGw7XHJcbiAgICB0aGlzLl9oZWxwZXJCbG9jay5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLl9oZWxwZXJCbG9jayA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlc1sncG9zaXRpb24nXSAmJiAhY2hhbmdlc1sncG9zaXRpb24nXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgbGV0IHAgPSBjaGFuZ2VzWydwb3NpdGlvbiddLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5tb3ZpbmcpIHtcclxuICAgICAgICBpZiAoUG9zaXRpb24uaXNJUG9zaXRpb24ocCkpIHtcclxuICAgICAgICAgIHRoaXMub2xkVHJhbnMuc2V0KHApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9sZFRyYW5zLnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRyYW5zZm9ybSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubmVlZFRyYW5zZm9ybSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1snc2NhbGUnXSAmJiAhY2hhbmdlc1snc2NhbGUnXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgdGhpcy5vbGRUcmFucy54ID0gdGhpcy5jdXJyVHJhbnMueCAqIHRoaXMuc2NhbGU7XHJcbiAgICAgIHRoaXMub2xkVHJhbnMueSA9IHRoaXMuY3VyclRyYW5zLnkgKiB0aGlzLnNjYWxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgaWYgKHRoaXMuaW5Cb3VuZHMpIHtcclxuICAgICAgdGhpcy5ib3VuZHNDaGVjaygpO1xyXG4gICAgICB0aGlzLm9sZFRyYW5zLmFkZCh0aGlzLnRlbXBUcmFucyk7XHJcbiAgICAgIHRoaXMudGVtcFRyYW5zLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldFBvc2l0aW9uKCkge1xyXG4gICAgaWYgKFBvc2l0aW9uLmlzSVBvc2l0aW9uKHRoaXMucG9zaXRpb24pKSB7XHJcbiAgICAgIHRoaXMub2xkVHJhbnMuc2V0KHRoaXMucG9zaXRpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vbGRUcmFucy5yZXNldCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50ZW1wVHJhbnMucmVzZXQoKTtcclxuICAgIHRoaXMudHJhbnNmb3JtKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1vdmVUbyhwOiBQb3NpdGlvbikge1xyXG4gICAgaWYgKHRoaXMub3JpZ25hbCkge1xyXG4gICAgICBwLnN1YnRyYWN0KHRoaXMub3JpZ25hbCk7XHJcbiAgICAgIHRoaXMudGVtcFRyYW5zLnNldChwKTtcclxuICAgICAgdGhpcy50cmFuc2Zvcm0oKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmJvdW5kcykge1xyXG4gICAgICAgIHRoaXMuZWRnZS5lbWl0KHRoaXMuYm91bmRzQ2hlY2soKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubW92aW5nT2Zmc2V0LmVtaXQodGhpcy5jdXJyVHJhbnMudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm0oKSB7XHJcblxyXG4gICAgbGV0IHRyYW5zbGF0ZVggPSB0aGlzLnRlbXBUcmFucy54ICsgdGhpcy5vbGRUcmFucy54O1xyXG4gICAgbGV0IHRyYW5zbGF0ZVkgPSB0aGlzLnRlbXBUcmFucy55ICsgdGhpcy5vbGRUcmFucy55O1xyXG5cclxuICAgIC8vIFNuYXAgdG8gZ3JpZDogYnkgZ3JpZCBzaXplXHJcbiAgICBpZiAodGhpcy5ncmlkU2l6ZSA+IDEpIHtcclxuICAgICAgdHJhbnNsYXRlWCA9IE1hdGgucm91bmQodHJhbnNsYXRlWCAvIHRoaXMuZ3JpZFNpemUpICogdGhpcy5ncmlkU2l6ZTtcclxuICAgICAgdHJhbnNsYXRlWSA9IE1hdGgucm91bmQodHJhbnNsYXRlWSAvIHRoaXMuZ3JpZFNpemUpICogdGhpcy5ncmlkU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkb25lIHRvIHByZXZlbnQgdGhlIGVsZW1lbnQgZnJvbSBib3VuY2luZyBvZmYgd2hlblxyXG4gICAgLy8gdGhlIHBhcmVudCBlbGVtZW50IGlzIHNjYWxlZCBhbmQgZWxlbWVudCBpcyBkcmFnZ2VkIGZvciBmaXJzdCB0aW1lXHJcbiAgICBpZiAodGhpcy50ZW1wVHJhbnMueCAhPT0gMCB8fCB0aGlzLnRlbXBUcmFucy55ICE9PSAwKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzRHJhZ2dlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLm9sZFRyYW5zLnggPSB0aGlzLmN1cnJUcmFucy54ICogdGhpcy5zY2FsZTtcclxuICAgICAgICB0aGlzLm9sZFRyYW5zLnkgPSB0aGlzLmN1cnJUcmFucy55ICogdGhpcy5zY2FsZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlzRHJhZ2dlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2NhbGUgJiYgdGhpcy5zY2FsZSAhPT0gMCAmJiB0aGlzLmlzRHJhZ2dlZCkge1xyXG4gICAgICB0cmFuc2xhdGVYID0gdHJhbnNsYXRlWCAvIHRoaXMuc2NhbGU7XHJcbiAgICAgIHRyYW5zbGF0ZVkgPSB0cmFuc2xhdGVZIC8gdGhpcy5zY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdmFsdWUgPSBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KWA7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0nLCB2YWx1ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJy13ZWJraXQtdHJhbnNmb3JtJywgdmFsdWUpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICctbXMtdHJhbnNmb3JtJywgdmFsdWUpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICctbW96LXRyYW5zZm9ybScsIHZhbHVlKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnLW8tdHJhbnNmb3JtJywgdmFsdWUpO1xyXG5cclxuICAgIC8vIHNhdmUgY3VycmVudCBwb3NpdGlvblxyXG4gICAgdGhpcy5jdXJyVHJhbnMueCA9IHRyYW5zbGF0ZVg7XHJcbiAgICB0aGlzLmN1cnJUcmFucy55ID0gdHJhbnNsYXRlWTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGlja1VwKCkge1xyXG4gICAgLy8gZ2V0IG9sZCB6LWluZGV4OlxyXG4gICAgdGhpcy5vbGRaSW5kZXggPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuekluZGV4ID8gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnpJbmRleCA6ICcnO1xyXG5cclxuICAgIGlmICh3aW5kb3cpIHtcclxuICAgICAgdGhpcy5vbGRaSW5kZXggPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ3otaW5kZXgnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy56SW5kZXhNb3ZpbmcpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd6LWluZGV4JywgdGhpcy56SW5kZXhNb3ZpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5tb3ZpbmcpIHtcclxuICAgICAgdGhpcy5zdGFydGVkLmVtaXQodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYm91bmRzQ2hlY2soKSB7XHJcbiAgICBpZiAodGhpcy5ib3VuZHMpIHtcclxuICAgICAgbGV0IGJvdW5kYXJ5ID0gdGhpcy5ib3VuZHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGxldCBlbGVtID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICd0b3AnOiB0aGlzLm91dE9mQm91bmRzLnRvcCA/IHRydWUgOiBib3VuZGFyeS50b3AgPCBlbGVtLnRvcCxcclxuICAgICAgICAncmlnaHQnOiB0aGlzLm91dE9mQm91bmRzLnJpZ2h0ID8gdHJ1ZSA6IGJvdW5kYXJ5LnJpZ2h0ID4gZWxlbS5yaWdodCxcclxuICAgICAgICAnYm90dG9tJzogdGhpcy5vdXRPZkJvdW5kcy5ib3R0b20gPyB0cnVlIDogYm91bmRhcnkuYm90dG9tID4gZWxlbS5ib3R0b20sXHJcbiAgICAgICAgJ2xlZnQnOiB0aGlzLm91dE9mQm91bmRzLmxlZnQgPyB0cnVlIDogYm91bmRhcnkubGVmdCA8IGVsZW0ubGVmdFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKHRoaXMuaW5Cb3VuZHMpIHtcclxuICAgICAgICBpZiAoIXJlc3VsdC50b3ApIHtcclxuICAgICAgICAgIHRoaXMudGVtcFRyYW5zLnkgLT0gZWxlbS50b3AgLSBib3VuZGFyeS50b3A7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJlc3VsdC5ib3R0b20pIHtcclxuICAgICAgICAgIHRoaXMudGVtcFRyYW5zLnkgLT0gZWxlbS5ib3R0b20gLSBib3VuZGFyeS5ib3R0b207XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJlc3VsdC5yaWdodCkge1xyXG4gICAgICAgICAgdGhpcy50ZW1wVHJhbnMueCAtPSBlbGVtLnJpZ2h0IC0gYm91bmRhcnkucmlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJlc3VsdC5sZWZ0KSB7XHJcbiAgICAgICAgICB0aGlzLnRlbXBUcmFucy54IC09IGVsZW0ubGVmdCAtIGJvdW5kYXJ5LmxlZnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRyYW5zZm9ybSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEdldCBjdXJyZW50IG9mZnNldCAqL1xyXG4gIGdldEN1cnJlbnRPZmZzZXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyVHJhbnMudmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHB1dEJhY2soKSB7XHJcbiAgICBpZiAodGhpcy5fekluZGV4KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsIHRoaXMuX3pJbmRleCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuekluZGV4TW92aW5nKSB7XHJcbiAgICAgIGlmICh0aGlzLm9sZFpJbmRleCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsIHRoaXMub2xkWkluZGV4KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3otaW5kZXgnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1vdmluZykge1xyXG4gICAgICB0aGlzLnN0b3BwZWQuZW1pdCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgLy8gUmVtb3ZlIHRoZSBoZWxwZXIgZGl2OlxyXG4gICAgICB0aGlzLl9oZWxwZXJCbG9jay5yZW1vdmUoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm5lZWRUcmFuc2Zvcm0pIHtcclxuICAgICAgICBpZiAoUG9zaXRpb24uaXNJUG9zaXRpb24odGhpcy5wb3NpdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMub2xkVHJhbnMuc2V0KHRoaXMucG9zaXRpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9sZFRyYW5zLnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRyYW5zZm9ybSgpO1xyXG4gICAgICAgIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5ib3VuZHMpIHtcclxuICAgICAgICB0aGlzLmVkZ2UuZW1pdCh0aGlzLmJvdW5kc0NoZWNrKCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmVuZE9mZnNldC5lbWl0KHRoaXMuY3VyclRyYW5zLnZhbHVlKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnRyYWNrUG9zaXRpb24pIHtcclxuICAgICAgICB0aGlzLm9sZFRyYW5zLmFkZCh0aGlzLnRlbXBUcmFucyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudGVtcFRyYW5zLnJlc2V0KCk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMudHJhY2tQb3NpdGlvbikge1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrSGFuZGxlVGFyZ2V0KHRhcmdldDogRXZlbnRUYXJnZXQsIGVsZW1lbnQ6IEVsZW1lbnQpIHtcclxuICAgIC8vIENoZWNrcyBpZiB0aGUgdGFyZ2V0IGlzIHRoZSBlbGVtZW50IGNsaWNrZWQsIHRoZW4gY2hlY2tzIGVhY2ggY2hpbGQgZWxlbWVudCBvZiBlbGVtZW50IGFzIHdlbGxcclxuICAgIC8vIElnbm9yZXMgYnV0dG9uIGNsaWNrc1xyXG5cclxuICAgIC8vIElnbm9yZSBlbGVtZW50cyBvZiB0eXBlIGJ1dHRvblxyXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSB0YXJnZXQgd2FzIGZvdW5kLCByZXR1cm4gdHJ1ZSAoaGFuZGxlIHdhcyBmb3VuZClcclxuICAgIGlmIChlbGVtZW50ID09PSB0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVjdXJzaXZlbHkgaXRlcmF0ZSB0aGlzIGVsZW1lbnRzIGNoaWxkcmVuXHJcbiAgICBmb3IgKGxldCBjaGlsZCBpbiBlbGVtZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuLmhhc093blByb3BlcnR5KGNoaWxkKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KHRhcmdldCwgZWxlbWVudC5jaGlsZHJlbltjaGlsZF0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGxpbmVhZ2VcclxuICAgIC8vIE5vdGU6IHJldHVybiBmYWxzZSBpcyBpZ25vcmUgdW5sZXNzIGl0IGlzIHRoZSBwYXJlbnQgZWxlbWVudFxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcclxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcclxuICAgIC8vIDEuIHNraXAgcmlnaHQgY2xpY2s7XHJcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmIGV2ZW50LmJ1dHRvbiA9PT0gMikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyAyLiBpZiBoYW5kbGUgaXMgc2V0LCB0aGUgZWxlbWVudCBjYW4gb25seSBiZSBtb3ZlZCBieSBoYW5kbGVcclxuICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcclxuICAgIGlmICh0aGlzLmhhbmRsZSAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KHRhcmdldCwgdGhpcy5oYW5kbGUpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3JpZ25hbCA9IFBvc2l0aW9uLmZyb21FdmVudChldmVudCk7XHJcbiAgICB0aGlzLnBpY2tVcCgpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcpXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2VsZWF2ZScpXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2hlbmQnKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNoY2FuY2VsJylcclxuICBvbk1vdXNlTGVhdmUoKSB7XHJcbiAgICB0aGlzLnB1dEJhY2soKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2htb3ZlJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLm1vdmluZyAmJiB0aGlzLmFsbG93RHJhZykge1xyXG4gICAgICBpZiAodGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIGEgdHJhbnNwYXJlbnQgaGVscGVyIGRpdjpcclxuICAgICAgdGhpcy5faGVscGVyQmxvY2suYWRkKCk7XHJcbiAgICAgIHRoaXMubW92ZVRvKFBvc2l0aW9uLmZyb21FdmVudChldmVudCkpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZXNpemVIYW5kbGUge1xyXG4gIHByb3RlY3RlZCBfaGFuZGxlOiBFbGVtZW50O1xyXG4gIHByaXZhdGUgX29uUmVzaXplO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBwYXJlbnQ6IEVsZW1lbnQsXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgY3NzOiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIG9uTW91c2VEb3duOiBhbnlcclxuICApIHtcclxuICAgIC8vIGdlbmVyYXRlIGhhbmRsZSBkaXZcclxuICAgIGxldCBoYW5kbGUgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHJlbmRlcmVyLmFkZENsYXNzKGhhbmRsZSwgJ25nLXJlc2l6YWJsZS1oYW5kbGUnKTtcclxuICAgIHJlbmRlcmVyLmFkZENsYXNzKGhhbmRsZSwgY3NzKTtcclxuXHJcbiAgICAvLyBhZGQgZGVmYXVsdCBkaWFnb25hbCBmb3Igc2UgaGFuZGxlXHJcbiAgICBpZiAodHlwZSA9PT0gJ3NlJykge1xyXG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhoYW5kbGUsICduZy1yZXNpemFibGUtZGlhZ29uYWwnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgZGl2IHRvIHBhcmVudFxyXG4gICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChoYW5kbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJcclxuICAgIHRoaXMuX29uUmVzaXplID0gKGV2ZW50KSA9PiB7IG9uTW91c2VEb3duKGV2ZW50LCB0aGlzKTsgfTtcclxuICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vblJlc2l6ZSk7XHJcbiAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uUmVzaXplKTtcclxuXHJcbiAgICAvLyBkb25lXHJcbiAgICB0aGlzLl9oYW5kbGUgPSBoYW5kbGU7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5faGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uUmVzaXplKTtcclxuICAgIHRoaXMuX2hhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25SZXNpemUpO1xyXG5cclxuICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLl9oYW5kbGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faGFuZGxlID0gbnVsbDtcclxuICAgIHRoaXMuX29uUmVzaXplID0gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBlbCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9oYW5kbGU7XHJcbiAgfVxyXG59XHJcbiIsImV4cG9ydCBpbnRlcmZhY2UgSVNpemUge1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTaXplIGltcGxlbWVudHMgSVNpemUge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB3aWR0aDogbnVtYmVyLCBwdWJsaWMgaGVpZ2h0OiBudW1iZXIpIHsgfVxyXG5cclxuICBzdGF0aWMgZ2V0Q3VycmVudChlbDogRWxlbWVudCkge1xyXG4gICAgbGV0IHNpemUgPSBuZXcgU2l6ZSgwLCAwKTtcclxuXHJcbiAgICBpZiAod2luZG93KSB7XHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xyXG4gICAgICBpZiAoY29tcHV0ZWQpIHtcclxuICAgICAgICBzaXplLndpZHRoID0gcGFyc2VJbnQoY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSwgMTApO1xyXG4gICAgICAgIHNpemUuaGVpZ2h0ID0gcGFyc2VJbnQoY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JyksIDEwKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gc2l6ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vdCBTdXBwb3J0ZWQhJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvcHkoczogU2l6ZSkge1xyXG4gICAgcmV0dXJuIG5ldyBTaXplKDAsIDApLnNldChzKTtcclxuICB9XHJcblxyXG4gIHNldChzOiBJU2l6ZSkge1xyXG4gICAgdGhpcy53aWR0aCA9IHMud2lkdGg7XHJcbiAgICB0aGlzLmhlaWdodCA9IHMuaGVpZ2h0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsXHJcbiAgSW5wdXQsIE91dHB1dCwgT25Jbml0LCBIb3N0TGlzdGVuZXIsXHJcbiAgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBIZWxwZXJCbG9jayB9IGZyb20gJy4vd2lkZ2V0cy9oZWxwZXItYmxvY2snO1xyXG5pbXBvcnQgeyBSZXNpemVIYW5kbGUgfSBmcm9tICcuL3dpZGdldHMvcmVzaXplLWhhbmRsZSc7XHJcbmltcG9ydCB7IFJlc2l6ZUhhbmRsZVR5cGUgfSBmcm9tICcuL21vZGVscy9yZXNpemUtaGFuZGxlLXR5cGUnO1xyXG5pbXBvcnQgeyBQb3NpdGlvbiwgSVBvc2l0aW9uIH0gZnJvbSAnLi9tb2RlbHMvcG9zaXRpb24nO1xyXG5pbXBvcnQgeyBTaXplIH0gZnJvbSAnLi9tb2RlbHMvc2l6ZSc7XHJcbmltcG9ydCB7IElSZXNpemVFdmVudCB9IGZyb20gJy4vbW9kZWxzL3Jlc2l6ZS1ldmVudCc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuZ1Jlc2l6YWJsZV0nLFxyXG4gIGV4cG9ydEFzOiAnbmdSZXNpemFibGUnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyUmVzaXphYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHJpdmF0ZSBfcmVzaXphYmxlID0gdHJ1ZTtcclxuICBwcml2YXRlIF9oYW5kbGVzOiB7IFtrZXk6IHN0cmluZ106IFJlc2l6ZUhhbmRsZSB9ID0ge307XHJcbiAgcHJpdmF0ZSBfaGFuZGxlVHlwZTogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIF9oYW5kbGVSZXNpemluZzogUmVzaXplSGFuZGxlID0gbnVsbDtcclxuICBwcml2YXRlIF9kaXJlY3Rpb246IHsgJ24nOiBib29sZWFuLCAncyc6IGJvb2xlYW4sICd3JzogYm9vbGVhbiwgJ2UnOiBib29sZWFuIH0gPSBudWxsO1xyXG4gIHByaXZhdGUgX2FzcGVjdFJhdGlvID0gMDtcclxuICBwcml2YXRlIF9jb250YWlubWVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xyXG4gIHByaXZhdGUgX29yaWdNb3VzZVBvczogUG9zaXRpb24gPSBudWxsO1xyXG5cclxuICAvKiogT3JpZ2luYWwgU2l6ZSBhbmQgUG9zaXRpb24gKi9cclxuICBwcml2YXRlIF9vcmlnU2l6ZTogU2l6ZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb3JpZ1BvczogUG9zaXRpb24gPSBudWxsO1xyXG5cclxuICAvKiogQ3VycmVudCBTaXplIGFuZCBQb3NpdGlvbiAqL1xyXG4gIHByaXZhdGUgX2N1cnJTaXplOiBTaXplID0gbnVsbDtcclxuICBwcml2YXRlIF9jdXJyUG9zOiBQb3NpdGlvbiA9IG51bGw7XHJcblxyXG4gIC8qKiBJbml0aWFsIFNpemUgYW5kIFBvc2l0aW9uICovXHJcbiAgcHJpdmF0ZSBfaW5pdFNpemU6IFNpemUgPSBudWxsO1xyXG4gIHByaXZhdGUgX2luaXRQb3M6IFBvc2l0aW9uID0gbnVsbDtcclxuXHJcbiAgLyoqIFNuYXAgdG8gZ2lyZCAqL1xyXG4gIHByaXZhdGUgX2dyaWRTaXplOiBJUG9zaXRpb24gPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9ib3VuZGluZzogYW55ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogQnVnZml4OiBpRnJhbWVzLCBhbmQgY29udGV4dCB1bnJlbGF0ZWQgZWxlbWVudHMgYmxvY2sgYWxsIGV2ZW50cywgYW5kIGFyZSB1bnVzYWJsZVxyXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS94aWV6aXl1L2FuZ3VsYXIyLWRyYWdnYWJsZS9pc3N1ZXMvODRcclxuICAgKi9cclxuICBwcml2YXRlIF9oZWxwZXJCbG9jazogSGVscGVyQmxvY2sgPSBudWxsO1xyXG5cclxuICAvKiogRGlzYWJsZXMgdGhlIHJlc2l6YWJsZSBpZiBzZXQgdG8gZmFsc2UuICovXHJcbiAgQElucHV0KCkgc2V0IG5nUmVzaXphYmxlKHY6IGFueSkge1xyXG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsICYmIHYgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuX3Jlc2l6YWJsZSA9ICEhdjtcclxuICAgICAgdGhpcy51cGRhdGVSZXNpemFibGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoaWNoIGhhbmRsZXMgY2FuIGJlIHVzZWQgZm9yIHJlc2l6aW5nLlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogW3J6SGFuZGxlc10gPSBcIiduLGUscyx3LHNlLG5lLHN3LG53J1wiXHJcbiAgICogZXF1YWxzIHRvOiBbcnpIYW5kbGVzXSA9IFwiJ2FsbCdcIlxyXG4gICAqXHJcbiAgICogKi9cclxuICBASW5wdXQoKSByekhhbmRsZXM6IFJlc2l6ZUhhbmRsZVR5cGUgPSAnZSxzLHNlJztcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZWxlbWVudCBzaG91bGQgYmUgY29uc3RyYWluZWQgdG8gYSBzcGVjaWZpYyBhc3BlY3QgcmF0aW8uXHJcbiAgICogIE11bHRpcGxlIHR5cGVzIHN1cHBvcnRlZDpcclxuICAgKiAgYm9vbGVhbjogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGVsZW1lbnQgd2lsbCBtYWludGFpbiBpdHMgb3JpZ2luYWwgYXNwZWN0IHJhdGlvLlxyXG4gICAqICBudW1iZXI6IEZvcmNlIHRoZSBlbGVtZW50IHRvIG1haW50YWluIGEgc3BlY2lmaWMgYXNwZWN0IHJhdGlvIGR1cmluZyByZXNpemluZy5cclxuICAgKi9cclxuICBASW5wdXQoKSByekFzcGVjdFJhdGlvOiBib29sZWFuIHwgbnVtYmVyID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cmFpbnMgcmVzaXppbmcgdG8gd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IG9yIHJlZ2lvbi5cclxuICAgKiAgTXVsdGlwbGUgdHlwZXMgc3VwcG9ydGVkOlxyXG4gICAqICBTZWxlY3RvcjogVGhlIHJlc2l6YWJsZSBlbGVtZW50IHdpbGwgYmUgY29udGFpbmVkIHRvIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGZpcnN0IGVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLlxyXG4gICAqICAgICAgICAgICAgSWYgbm8gZWxlbWVudCBpcyBmb3VuZCwgbm8gY29udGFpbm1lbnQgd2lsbCBiZSBzZXQuXHJcbiAgICogIEVsZW1lbnQ6IFRoZSByZXNpemFibGUgZWxlbWVudCB3aWxsIGJlIGNvbnRhaW5lZCB0byB0aGUgYm91bmRpbmcgYm94IG9mIHRoaXMgZWxlbWVudC5cclxuICAgKiAgU3RyaW5nOiBQb3NzaWJsZSB2YWx1ZXM6IFwicGFyZW50XCIuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcnpDb250YWlubWVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBTbmFwcyB0aGUgcmVzaXppbmcgZWxlbWVudCB0byBhIGdyaWQsIGV2ZXJ5IHggYW5kIHkgcGl4ZWxzLlxyXG4gICAqIEEgbnVtYmVyIGZvciBib3RoIHdpZHRoIGFuZCBoZWlnaHQgb3IgYW4gYXJyYXkgdmFsdWVzIGxpa2UgWyB4LCB5IF1cclxuICAgKi9cclxuICBASW5wdXQoKSByekdyaWQ6IG51bWJlciB8IG51bWJlcltdID0gbnVsbDtcclxuXHJcbiAgLyoqIFRoZSBtaW5pbXVtIHdpZHRoIHRoZSByZXNpemFibGUgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcmVzaXplIHRvLiAqL1xyXG4gIEBJbnB1dCgpIHJ6TWluV2lkdGg6IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8qKiBUaGUgbWluaW11bSBoZWlnaHQgdGhlIHJlc2l6YWJsZSBzaG91bGQgYmUgYWxsb3dlZCB0byByZXNpemUgdG8uICovXHJcbiAgQElucHV0KCkgcnpNaW5IZWlnaHQ6IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8qKiBUaGUgbWF4aW11bSB3aWR0aCB0aGUgcmVzaXphYmxlIHNob3VsZCBiZSBhbGxvd2VkIHRvIHJlc2l6ZSB0by4gKi9cclxuICBASW5wdXQoKSByek1heFdpZHRoOiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvKiogVGhlIG1heGltdW0gaGVpZ2h0IHRoZSByZXNpemFibGUgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcmVzaXplIHRvLiAqL1xyXG4gIEBJbnB1dCgpIHJ6TWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvKiogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgZXZlbnQgKi9cclxuICBASW5wdXQoKSBwcmV2ZW50RGVmYXVsdEV2ZW50ID0gdHJ1ZTtcclxuXHJcbiAgLyoqIGVtaXR0ZWQgd2hlbiBzdGFydCByZXNpemluZyAqL1xyXG4gIEBPdXRwdXQoKSByelN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxJUmVzaXplRXZlbnQ+KCk7XHJcblxyXG4gIC8qKiBlbWl0dGVkIHdoZW4gc3RhcnQgcmVzaXppbmcgKi9cclxuICBAT3V0cHV0KCkgcnpSZXNpemluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVJlc2l6ZUV2ZW50PigpO1xyXG5cclxuICAvKiogZW1pdHRlZCB3aGVuIHN0b3AgcmVzaXppbmcgKi9cclxuICBAT3V0cHV0KCkgcnpTdG9wID0gbmV3IEV2ZW50RW1pdHRlcjxJUmVzaXplRXZlbnQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgIHRoaXMuX2hlbHBlckJsb2NrID0gbmV3IEhlbHBlckJsb2NrKGVsLm5hdGl2ZUVsZW1lbnQsIHJlbmRlcmVyKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWydyekhhbmRsZXMnXSAmJiAhY2hhbmdlc1sncnpIYW5kbGVzJ10uaXNGaXJzdENoYW5nZSgpKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUmVzaXphYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ3J6QXNwZWN0UmF0aW8nXSAmJiAhY2hhbmdlc1sncnpBc3BlY3RSYXRpbyddLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUFzcGVjdFJhdGlvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ3J6Q29udGFpbm1lbnQnXSAmJiAhY2hhbmdlc1sncnpDb250YWlubWVudCddLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvbnRhaW5tZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudXBkYXRlUmVzaXphYmxlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMucmVtb3ZlSGFuZGxlcygpO1xyXG4gICAgdGhpcy5fY29udGFpbm1lbnQgPSBudWxsO1xyXG4gICAgdGhpcy5faGVscGVyQmxvY2suZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5faGVscGVyQmxvY2sgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgY29uc3QgZWxtID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5faW5pdFNpemUgPSBTaXplLmdldEN1cnJlbnQoZWxtKTtcclxuICAgIHRoaXMuX2luaXRQb3MgPSBQb3NpdGlvbi5nZXRDdXJyZW50KGVsbSk7XHJcbiAgICB0aGlzLl9jdXJyU2l6ZSA9IFNpemUuY29weSh0aGlzLl9pbml0U2l6ZSk7XHJcbiAgICB0aGlzLl9jdXJyUG9zID0gUG9zaXRpb24uY29weSh0aGlzLl9pbml0UG9zKTtcclxuICAgIHRoaXMudXBkYXRlQXNwZWN0UmF0aW8oKTtcclxuICAgIHRoaXMudXBkYXRlQ29udGFpbm1lbnQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBBIG1ldGhvZCB0byByZXNldCBzaXplICovXHJcbiAgcHVibGljIHJlc2V0U2l6ZSgpIHtcclxuICAgIHRoaXMuX2N1cnJTaXplID0gU2l6ZS5jb3B5KHRoaXMuX2luaXRTaXplKTtcclxuICAgIHRoaXMuX2N1cnJQb3MgPSBQb3NpdGlvbi5jb3B5KHRoaXMuX2luaXRQb3MpO1xyXG4gICAgdGhpcy5kb1Jlc2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgbWV0aG9kIHRvIGdldCBjdXJyZW50IHN0YXR1cyAqL1xyXG4gIHB1YmxpYyBnZXRTdGF0dXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2N1cnJQb3MgfHwgIXRoaXMuX2N1cnJTaXplKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNpemU6IHtcclxuICAgICAgICB3aWR0aDogdGhpcy5fY3VyclNpemUud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLl9jdXJyU2l6ZS5oZWlnaHRcclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICB0b3A6IHRoaXMuX2N1cnJQb3MueSxcclxuICAgICAgICBsZWZ0OiB0aGlzLl9jdXJyUG9zLnhcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUmVzaXphYmxlKCkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyBjbGVhciBoYW5kbGVzOlxyXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnbmctcmVzaXphYmxlJyk7XHJcbiAgICB0aGlzLnJlbW92ZUhhbmRsZXMoKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgbmV3IG9uZXM6XHJcbiAgICBpZiAodGhpcy5fcmVzaXphYmxlKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ25nLXJlc2l6YWJsZScpO1xyXG4gICAgICB0aGlzLmNyZWF0ZUhhbmRsZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBVc2UgaXQgdG8gdXBkYXRlIGFzcGVjdCAqL1xyXG4gIHByaXZhdGUgdXBkYXRlQXNwZWN0UmF0aW8oKSB7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMucnpBc3BlY3RSYXRpbyA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIGlmICh0aGlzLnJ6QXNwZWN0UmF0aW8gJiYgdGhpcy5fY3VyclNpemUuaGVpZ2h0KSB7XHJcbiAgICAgICAgdGhpcy5fYXNwZWN0UmF0aW8gPSAodGhpcy5fY3VyclNpemUud2lkdGggLyB0aGlzLl9jdXJyU2l6ZS5oZWlnaHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2FzcGVjdFJhdGlvID0gMDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHIgPSBOdW1iZXIodGhpcy5yekFzcGVjdFJhdGlvKTtcclxuICAgICAgdGhpcy5fYXNwZWN0UmF0aW8gPSBpc05hTihyKSA/IDAgOiByO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFVzZSBpdCB0byB1cGRhdGUgY29udGFpbm1lbnQgKi9cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRhaW5tZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLnJ6Q29udGFpbm1lbnQpIHtcclxuICAgICAgdGhpcy5fY29udGFpbm1lbnQgPSBudWxsO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLnJ6Q29udGFpbm1lbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGlmICh0aGlzLnJ6Q29udGFpbm1lbnQgPT09ICdwYXJlbnQnKSB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbm1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9jb250YWlubWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHRoaXMucnpDb250YWlubWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2NvbnRhaW5tZW50ID0gdGhpcy5yekNvbnRhaW5tZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFVzZSBpdCB0byBjcmVhdGUgaGFuZGxlIGRpdnMgKi9cclxuICBwcml2YXRlIGNyZWF0ZUhhbmRsZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMucnpIYW5kbGVzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdG1wSGFuZGxlVHlwZXM6IHN0cmluZ1tdO1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLnJ6SGFuZGxlcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKHRoaXMucnpIYW5kbGVzID09PSAnYWxsJykge1xyXG4gICAgICAgIHRtcEhhbmRsZVR5cGVzID0gWyduJywgJ2UnLCAncycsICd3JywgJ25lJywgJ3NlJywgJ253JywgJ3N3J107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG1wSGFuZGxlVHlwZXMgPSB0aGlzLnJ6SGFuZGxlcy5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpLnNwbGl0KCcsJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IHR5cGUgb2YgdG1wSGFuZGxlVHlwZXMpIHtcclxuICAgICAgICAvLyBkZWZhdWx0IGhhbmRsZSB0aGVtZTogbmctcmVzaXphYmxlLSR0eXBlLlxyXG4gICAgICAgIGxldCBoYW5kbGUgPSB0aGlzLmNyZWF0ZUhhbmRsZUJ5VHlwZSh0eXBlLCBgbmctcmVzaXphYmxlLSR7dHlwZX1gKTtcclxuICAgICAgICBpZiAoaGFuZGxlKSB7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVUeXBlLnB1c2godHlwZSk7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVzW3R5cGVdID0gaGFuZGxlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdG1wSGFuZGxlVHlwZXMgPSBPYmplY3Qua2V5cyh0aGlzLnJ6SGFuZGxlcyk7XHJcbiAgICAgIGZvciAobGV0IHR5cGUgb2YgdG1wSGFuZGxlVHlwZXMpIHtcclxuICAgICAgICAvLyBjdXN0b20gaGFuZGxlIHRoZW1lLlxyXG4gICAgICAgIGxldCBoYW5kbGUgPSB0aGlzLmNyZWF0ZUhhbmRsZUJ5VHlwZSh0eXBlLCB0aGlzLnJ6SGFuZGxlc1t0eXBlXSk7XHJcbiAgICAgICAgaWYgKGhhbmRsZSkge1xyXG4gICAgICAgICAgdGhpcy5faGFuZGxlVHlwZS5wdXNoKHR5cGUpO1xyXG4gICAgICAgICAgdGhpcy5faGFuZGxlc1t0eXBlXSA9IGhhbmRsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKiogVXNlIGl0IHRvIGNyZWF0ZSBhIGhhbmRsZSAqL1xyXG4gIHByaXZhdGUgY3JlYXRlSGFuZGxlQnlUeXBlKHR5cGU6IHN0cmluZywgY3NzOiBzdHJpbmcpOiBSZXNpemVIYW5kbGUge1xyXG4gICAgY29uc3QgX2VsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGlmICghdHlwZS5tYXRjaCgvXihzZXxzd3xuZXxud3xufGV8c3x3KSQvKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGhhbmRsZSB0eXBlOicsIHR5cGUpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFJlc2l6ZUhhbmRsZShfZWwsIHRoaXMucmVuZGVyZXIsIHR5cGUsIGNzcywgdGhpcy5vbk1vdXNlRG93bi5iaW5kKHRoaXMpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlSGFuZGxlcygpIHtcclxuICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy5faGFuZGxlVHlwZSkge1xyXG4gICAgICB0aGlzLl9oYW5kbGVzW3R5cGVdLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9oYW5kbGVUeXBlID0gW107XHJcbiAgICB0aGlzLl9oYW5kbGVzID0ge307XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsIGhhbmRsZTogUmVzaXplSGFuZGxlKSB7XHJcbiAgICAvLyBza2lwIHJpZ2h0IGNsaWNrO1xyXG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiBldmVudC5idXR0b24gPT09IDIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnByZXZlbnREZWZhdWx0RXZlbnQpIHtcclxuICAgICAgLy8gcHJldmVudCBkZWZhdWx0IGV2ZW50c1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2hhbmRsZVJlc2l6aW5nKSB7XHJcbiAgICAgIHRoaXMuX29yaWdNb3VzZVBvcyA9IFBvc2l0aW9uLmZyb21FdmVudChldmVudCk7XHJcbiAgICAgIHRoaXMuc3RhcnRSZXNpemUoaGFuZGxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbGVhdmUnKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNoZW5kJylcclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaGNhbmNlbCcpXHJcbiAgb25Nb3VzZUxlYXZlKCkge1xyXG4gICAgaWYgKHRoaXMuX2hhbmRsZVJlc2l6aW5nKSB7XHJcbiAgICAgIHRoaXMuc3RvcFJlc2l6ZSgpO1xyXG4gICAgICB0aGlzLl9vcmlnTW91c2VQb3MgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuX2hhbmRsZVJlc2l6aW5nICYmIHRoaXMuX3Jlc2l6YWJsZSAmJiB0aGlzLl9vcmlnTW91c2VQb3MgJiYgdGhpcy5fb3JpZ1BvcyAmJiB0aGlzLl9vcmlnU2l6ZSkge1xyXG4gICAgICB0aGlzLnJlc2l6ZVRvKFBvc2l0aW9uLmZyb21FdmVudChldmVudCkpO1xyXG4gICAgICB0aGlzLm9uUmVzaXppbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRSZXNpemUoaGFuZGxlOiBSZXNpemVIYW5kbGUpIHtcclxuICAgIGNvbnN0IGVsbSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuX29yaWdTaXplID0gU2l6ZS5nZXRDdXJyZW50KGVsbSk7XHJcbiAgICB0aGlzLl9vcmlnUG9zID0gUG9zaXRpb24uZ2V0Q3VycmVudChlbG0pOyAvLyB4OiBsZWZ0LCB5OiB0b3BcclxuICAgIHRoaXMuX2N1cnJTaXplID0gU2l6ZS5jb3B5KHRoaXMuX29yaWdTaXplKTtcclxuICAgIHRoaXMuX2N1cnJQb3MgPSBQb3NpdGlvbi5jb3B5KHRoaXMuX29yaWdQb3MpO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5tZW50KSB7XHJcbiAgICAgIHRoaXMuZ2V0Qm91bmRpbmcoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0R3JpZFNpemUoKTtcclxuXHJcbiAgICAvLyBBZGQgYSB0cmFuc3BhcmVudCBoZWxwZXIgZGl2OlxyXG4gICAgdGhpcy5faGVscGVyQmxvY2suYWRkKCk7XHJcbiAgICB0aGlzLl9oYW5kbGVSZXNpemluZyA9IGhhbmRsZTtcclxuICAgIHRoaXMudXBkYXRlRGlyZWN0aW9uKCk7XHJcbiAgICB0aGlzLnJ6U3RhcnQuZW1pdCh0aGlzLmdldFJlc2l6aW5nRXZlbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3BSZXNpemUoKSB7XHJcbiAgICAvLyBSZW1vdmUgdGhlIGhlbHBlciBkaXY6XHJcbiAgICB0aGlzLl9oZWxwZXJCbG9jay5yZW1vdmUoKTtcclxuICAgIHRoaXMucnpTdG9wLmVtaXQodGhpcy5nZXRSZXNpemluZ0V2ZW50KCkpO1xyXG4gICAgdGhpcy5faGFuZGxlUmVzaXppbmcgPSBudWxsO1xyXG4gICAgdGhpcy5fZGlyZWN0aW9uID0gbnVsbDtcclxuICAgIHRoaXMuX29yaWdTaXplID0gbnVsbDtcclxuICAgIHRoaXMuX29yaWdQb3MgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5tZW50KSB7XHJcbiAgICAgIHRoaXMucmVzZXRCb3VuZGluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblJlc2l6aW5nKCkge1xyXG4gICAgdGhpcy5yelJlc2l6aW5nLmVtaXQodGhpcy5nZXRSZXNpemluZ0V2ZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSZXNpemluZ0V2ZW50KCk6IElSZXNpemVFdmVudCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBob3N0OiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgIGhhbmRsZTogdGhpcy5faGFuZGxlUmVzaXppbmcgPyB0aGlzLl9oYW5kbGVSZXNpemluZy5lbCA6IG51bGwsXHJcbiAgICAgIHNpemU6IHtcclxuICAgICAgICB3aWR0aDogdGhpcy5fY3VyclNpemUud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLl9jdXJyU2l6ZS5oZWlnaHRcclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICB0b3A6IHRoaXMuX2N1cnJQb3MueSxcclxuICAgICAgICBsZWZ0OiB0aGlzLl9jdXJyUG9zLnhcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGlyZWN0aW9uKCkge1xyXG4gICAgdGhpcy5fZGlyZWN0aW9uID0ge1xyXG4gICAgICBuOiAhIXRoaXMuX2hhbmRsZVJlc2l6aW5nLnR5cGUubWF0Y2goL24vKSxcclxuICAgICAgczogISF0aGlzLl9oYW5kbGVSZXNpemluZy50eXBlLm1hdGNoKC9zLyksXHJcbiAgICAgIHc6ICEhdGhpcy5faGFuZGxlUmVzaXppbmcudHlwZS5tYXRjaCgvdy8pLFxyXG4gICAgICBlOiAhIXRoaXMuX2hhbmRsZVJlc2l6aW5nLnR5cGUubWF0Y2goL2UvKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzaXplVG8ocDogUG9zaXRpb24pIHtcclxuICAgIHAuc3VidHJhY3QodGhpcy5fb3JpZ01vdXNlUG9zKTtcclxuXHJcbiAgICBjb25zdCB0bXBYID0gTWF0aC5yb3VuZChwLnggLyB0aGlzLl9ncmlkU2l6ZS54KSAqIHRoaXMuX2dyaWRTaXplLng7XHJcbiAgICBjb25zdCB0bXBZID0gTWF0aC5yb3VuZChwLnkgLyB0aGlzLl9ncmlkU2l6ZS55KSAqIHRoaXMuX2dyaWRTaXplLnk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbi5uKSB7XHJcbiAgICAgIC8vIG4sIG5lLCBud1xyXG4gICAgICB0aGlzLl9jdXJyUG9zLnkgPSB0aGlzLl9vcmlnUG9zLnkgKyB0bXBZO1xyXG4gICAgICB0aGlzLl9jdXJyU2l6ZS5oZWlnaHQgPSB0aGlzLl9vcmlnU2l6ZS5oZWlnaHQgLSB0bXBZO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9kaXJlY3Rpb24ucykge1xyXG4gICAgICAvLyBzLCBzZSwgc3dcclxuICAgICAgdGhpcy5fY3VyclNpemUuaGVpZ2h0ID0gdGhpcy5fb3JpZ1NpemUuaGVpZ2h0ICsgdG1wWTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZGlyZWN0aW9uLmUpIHtcclxuICAgICAgLy8gZSwgbmUsIHNlXHJcbiAgICAgIHRoaXMuX2N1cnJTaXplLndpZHRoID0gdGhpcy5fb3JpZ1NpemUud2lkdGggKyB0bXBYO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9kaXJlY3Rpb24udykge1xyXG4gICAgICAvLyB3LCBudywgc3dcclxuICAgICAgdGhpcy5fY3VyclNpemUud2lkdGggPSB0aGlzLl9vcmlnU2l6ZS53aWR0aCAtIHRtcFg7XHJcbiAgICAgIHRoaXMuX2N1cnJQb3MueCA9IHRoaXMuX29yaWdQb3MueCArIHRtcFg7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGVja0JvdW5kcygpO1xyXG4gICAgdGhpcy5jaGVja1NpemUoKTtcclxuICAgIHRoaXMuYWRqdXN0QnlSYXRpbygpO1xyXG4gICAgdGhpcy5kb1Jlc2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb1Jlc2l6ZSgpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICh0aGlzLl9kaXJlY3Rpb24ubiB8fCB0aGlzLl9kaXJlY3Rpb24ucyB8fCB0aGlzLl9hc3BlY3RSYXRpbykge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ2hlaWdodCcsIHRoaXMuX2N1cnJTaXplLmhlaWdodCArICdweCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbi53IHx8IHRoaXMuX2RpcmVjdGlvbi5lIHx8IHRoaXMuX2FzcGVjdFJhdGlvKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnd2lkdGgnLCB0aGlzLl9jdXJyU2l6ZS53aWR0aCArICdweCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICdsZWZ0JywgdGhpcy5fY3VyclBvcy54ICsgJ3B4Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ3RvcCcsIHRoaXMuX2N1cnJQb3MueSArICdweCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGp1c3RCeVJhdGlvKCkge1xyXG4gICAgaWYgKHRoaXMuX2FzcGVjdFJhdGlvKSB7XHJcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24uZSB8fCB0aGlzLl9kaXJlY3Rpb24udykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJTaXplLmhlaWdodCA9IHRoaXMuX2N1cnJTaXplLndpZHRoIC8gdGhpcy5fYXNwZWN0UmF0aW87XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fY3VyclNpemUud2lkdGggPSB0aGlzLl9hc3BlY3RSYXRpbyAqIHRoaXMuX2N1cnJTaXplLmhlaWdodDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0JvdW5kcygpIHtcclxuICAgIGlmICh0aGlzLl9jb250YWlubWVudCkge1xyXG4gICAgICBjb25zdCBtYXhXaWR0aCA9IHRoaXMuX2JvdW5kaW5nLndpZHRoIC0gdGhpcy5fYm91bmRpbmcucHIgLSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCAtIHRoaXMuX2JvdW5kaW5nLnRyYW5zbGF0ZVg7XHJcbiAgICAgIGNvbnN0IG1heEhlaWdodCA9IHRoaXMuX2JvdW5kaW5nLmhlaWdodCAtIHRoaXMuX2JvdW5kaW5nLnBiIC0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCAtIHRoaXMuX2JvdW5kaW5nLnRyYW5zbGF0ZVk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZGlyZWN0aW9uLm4gJiYgKHRoaXMuX2N1cnJQb3MueSArIHRoaXMuX2JvdW5kaW5nLnRyYW5zbGF0ZVkpIDwgMCkge1xyXG4gICAgICAgIHRoaXMuX2N1cnJQb3MueSA9IC10aGlzLl9ib3VuZGluZy50cmFuc2xhdGVZO1xyXG4gICAgICAgIHRoaXMuX2N1cnJTaXplLmhlaWdodCA9IHRoaXMuX29yaWdTaXplLmhlaWdodCArIHRoaXMuX29yaWdQb3MueSArIHRoaXMuX2JvdW5kaW5nLnRyYW5zbGF0ZVk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24udyAmJiAodGhpcy5fY3VyclBvcy54ICsgdGhpcy5fYm91bmRpbmcudHJhbnNsYXRlWCkgPCAwKSB7XHJcbiAgICAgICAgdGhpcy5fY3VyclBvcy54ID0gLXRoaXMuX2JvdW5kaW5nLnRyYW5zbGF0ZVg7XHJcbiAgICAgICAgdGhpcy5fY3VyclNpemUud2lkdGggPSB0aGlzLl9vcmlnU2l6ZS53aWR0aCArIHRoaXMuX29yaWdQb3MueCArIHRoaXMuX2JvdW5kaW5nLnRyYW5zbGF0ZVg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9jdXJyU2l6ZS53aWR0aCA+IG1heFdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5fY3VyclNpemUud2lkdGggPSBtYXhXaWR0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX2N1cnJTaXplLmhlaWdodCA+IG1heEhlaWdodCkge1xyXG4gICAgICAgIHRoaXMuX2N1cnJTaXplLmhlaWdodCA9IG1heEhlaWdodDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NpemUoKSB7XHJcbiAgICBjb25zdCBtaW5IZWlnaHQgPSAhdGhpcy5yek1pbkhlaWdodCA/IDEgOiB0aGlzLnJ6TWluSGVpZ2h0O1xyXG4gICAgY29uc3QgbWluV2lkdGggPSAhdGhpcy5yek1pbldpZHRoID8gMSA6IHRoaXMucnpNaW5XaWR0aDtcclxuXHJcbiAgICBpZiAodGhpcy5fY3VyclNpemUuaGVpZ2h0IDwgbWluSGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuX2N1cnJTaXplLmhlaWdodCA9IG1pbkhlaWdodDtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24ubikge1xyXG4gICAgICAgIHRoaXMuX2N1cnJQb3MueSA9IHRoaXMuX29yaWdQb3MueSArICh0aGlzLl9vcmlnU2l6ZS5oZWlnaHQgLSBtaW5IZWlnaHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2N1cnJTaXplLndpZHRoIDwgbWluV2lkdGgpIHtcclxuICAgICAgdGhpcy5fY3VyclNpemUud2lkdGggPSBtaW5XaWR0aDtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24udykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJQb3MueCA9IHRoaXMuX29yaWdQb3MueCArICh0aGlzLl9vcmlnU2l6ZS53aWR0aCAtIG1pbldpZHRoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJ6TWF4SGVpZ2h0ICYmIHRoaXMuX2N1cnJTaXplLmhlaWdodCA+IHRoaXMucnpNYXhIZWlnaHQpIHtcclxuICAgICAgdGhpcy5fY3VyclNpemUuaGVpZ2h0ID0gdGhpcy5yek1heEhlaWdodDtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24ubikge1xyXG4gICAgICAgIHRoaXMuX2N1cnJQb3MueSA9IHRoaXMuX29yaWdQb3MueSArICh0aGlzLl9vcmlnU2l6ZS5oZWlnaHQgLSB0aGlzLnJ6TWF4SGVpZ2h0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJ6TWF4V2lkdGggJiYgdGhpcy5fY3VyclNpemUud2lkdGggPiB0aGlzLnJ6TWF4V2lkdGgpIHtcclxuICAgICAgdGhpcy5fY3VyclNpemUud2lkdGggPSB0aGlzLnJ6TWF4V2lkdGg7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZGlyZWN0aW9uLncpIHtcclxuICAgICAgICB0aGlzLl9jdXJyUG9zLnggPSB0aGlzLl9vcmlnUG9zLnggKyAodGhpcy5fb3JpZ1NpemUud2lkdGggLSB0aGlzLnJ6TWF4V2lkdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJvdW5kaW5nKCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLl9jb250YWlubWVudDtcclxuICAgIGNvbnN0IGNvbXB1dGVkID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xyXG4gICAgaWYgKGNvbXB1dGVkKSB7XHJcbiAgICAgIGxldCBwID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSgncG9zaXRpb24nKTtcclxuXHJcbiAgICAgIGNvbnN0IG5hdGl2ZUVsID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgbGV0IHRyYW5zZm9ybXMgPSBuYXRpdmVFbC5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKS5yZXBsYWNlKC9bXi1cXGQsXS9nLCAnJykuc3BsaXQoJywnKTtcclxuXHJcbiAgICAgIHRoaXMuX2JvdW5kaW5nID0ge307XHJcbiAgICAgIHRoaXMuX2JvdW5kaW5nLndpZHRoID0gZWwuY2xpZW50V2lkdGg7XHJcbiAgICAgIHRoaXMuX2JvdW5kaW5nLmhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcclxuICAgICAgdGhpcy5fYm91bmRpbmcucHIgPSBwYXJzZUludChjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JyksIDEwKTtcclxuICAgICAgdGhpcy5fYm91bmRpbmcucGIgPSBwYXJzZUludChjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpLCAxMCk7XHJcblxyXG4gICAgICBpZiAodHJhbnNmb3Jtcy5sZW5ndGggPj0gNikge1xyXG4gICAgICAgIHRoaXMuX2JvdW5kaW5nLnRyYW5zbGF0ZVggPSBwYXJzZUludCh0cmFuc2Zvcm1zWzRdLCAxMCk7XHJcbiAgICAgICAgdGhpcy5fYm91bmRpbmcudHJhbnNsYXRlWSA9IHBhcnNlSW50KHRyYW5zZm9ybXNbNV0sIDEwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9ib3VuZGluZy50cmFuc2xhdGVYID0gMDtcclxuICAgICAgICB0aGlzLl9ib3VuZGluZy50cmFuc2xhdGVZID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fYm91bmRpbmcucG9zaXRpb24gPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCdwb3NpdGlvbicpO1xyXG5cclxuICAgICAgaWYgKHAgPT09ICdzdGF0aWMnKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRCb3VuZGluZygpIHtcclxuICAgIGlmICh0aGlzLl9ib3VuZGluZyAmJiB0aGlzLl9ib3VuZGluZy5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9jb250YWlubWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ib3VuZGluZyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRTaXplKCkge1xyXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWU6XHJcbiAgICB0aGlzLl9ncmlkU2l6ZSA9IHsgeDogMSwgeTogMSB9O1xyXG5cclxuICAgIGlmICh0aGlzLnJ6R3JpZCkge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMucnpHcmlkID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHRoaXMuX2dyaWRTaXplID0geyB4OiB0aGlzLnJ6R3JpZCwgeTogdGhpcy5yekdyaWQgfTtcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMucnpHcmlkKSkge1xyXG4gICAgICAgIHRoaXMuX2dyaWRTaXplID0geyB4OiB0aGlzLnJ6R3JpZFswXSwgeTogdGhpcy5yekdyaWRbMV0gfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBbmd1bGFyRHJhZ2dhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi9hbmd1bGFyLWRyYWdnYWJsZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBBbmd1bGFyUmVzaXphYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi9hbmd1bGFyLXJlc2l6YWJsZS5kaXJlY3RpdmUnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIEFuZ3VsYXJEcmFnZ2FibGVEaXJlY3RpdmUsXHJcbiAgICBBbmd1bGFyUmVzaXphYmxlRGlyZWN0aXZlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBBbmd1bGFyRHJhZ2dhYmxlRGlyZWN0aXZlLFxyXG4gICAgQW5ndWxhclJlc2l6YWJsZURpcmVjdGl2ZVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJEcmFnZ2FibGVNb2R1bGUgeyB9XHJcbiJdLCJuYW1lcyI6WyJ0c2xpYl8xLl9fdmFsdWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0lBS0E7SUFDRSxrQkFBbUIsQ0FBUyxFQUFTLENBQVM7UUFBM0IsTUFBQyxHQUFELENBQUMsQ0FBUTtRQUFTLE1BQUMsR0FBRCxDQUFDLENBQVE7S0FBSzs7Ozs7SUFFNUMsa0JBQVM7Ozs7SUFBaEIsVUFBaUIsQ0FBMEI7UUFDekMsSUFBSSxDQUFDLFlBQVksVUFBVSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0M7YUFBTTtZQUNMLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvRTtLQUNGOzs7OztJQUVNLG9CQUFXOzs7O0lBQWxCLFVBQW1CLEdBQUc7UUFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7S0FDOUM7Ozs7O0lBRU0sbUJBQVU7Ozs7SUFBakIsVUFBa0IsRUFBVztRQUMzQixxQkFBSSxHQUFHLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTdCLElBQUksTUFBTSxFQUFFO1lBQ1YscUJBQU0sUUFBUSxH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QyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUN6SCxxQkFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBRTFILElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUU7Z0JBQzFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO2FBQzdGO1lBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRTtnQkFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7YUFDM0Y7WUFFRCxJQUFJLElBQUks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"],"sourceRoot":""}