@seniorsistemas/angular-components 17.26.10 → 17.26.12-bugfix-sds-312-2e0a9036

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/bundles/seniorsistemas-angular-components.umd.js +53 -26
  2. package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
  3. package/bundles/seniorsistemas-angular-components.umd.min.js +1 -1
  4. package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
  5. package/components/code-editor/infra/cores/codemirror-6/languages/json/json.language.d.ts +2 -0
  6. package/components/code-editor/models/enums/languages.d.ts +2 -1
  7. package/components/dynamic-form/configurations/form-field.d.ts +3 -1
  8. package/components/tooltip/tooltip.directive.d.ts +0 -3
  9. package/esm2015/components/code-editor/code-editor.component.js +1 -1
  10. package/esm2015/components/code-editor/infra/cores/codemirror-6/languages/editor-languages.js +4 -2
  11. package/esm2015/components/code-editor/infra/cores/codemirror-6/languages/json/json.language.js +67 -0
  12. package/esm2015/components/code-editor/models/enums/languages.js +2 -1
  13. package/esm2015/components/dynamic-form/components/lookup/lookup.component.js +2 -2
  14. package/esm2015/components/dynamic-form/configurations/form-field.js +1 -1
  15. package/esm2015/components/tooltip/tooltip.component.js +1 -1
  16. package/esm2015/components/tooltip/tooltip.directive.js +28 -25
  17. package/esm5/components/code-editor/code-editor.component.js +1 -1
  18. package/esm5/components/code-editor/infra/cores/codemirror-6/languages/editor-languages.js +4 -2
  19. package/esm5/components/code-editor/infra/cores/codemirror-6/languages/json/json.language.js +25 -0
  20. package/esm5/components/code-editor/models/enums/languages.js +2 -1
  21. package/esm5/components/dynamic-form/components/lookup/lookup.component.js +2 -2
  22. package/esm5/components/dynamic-form/configurations/form-field.js +1 -1
  23. package/esm5/components/tooltip/tooltip.component.js +1 -1
  24. package/esm5/components/tooltip/tooltip.directive.js +28 -25
  25. package/fesm2015/seniorsistemas-angular-components.js +95 -26
  26. package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
  27. package/fesm5/seniorsistemas-angular-components.js +53 -26
  28. package/fesm5/seniorsistemas-angular-components.js.map +1 -1
  29. package/package.json +1 -1
  30. package/seniorsistemas-angular-components.metadata.json +1 -1
@@ -1,10 +1,11 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { ApplicationRef, ComponentFactoryResolver, ComponentRef, Directive, ElementRef, EmbeddedViewRef, HostListener, Injector, Input, OnDestroy, OnInit, Renderer2, } from "@angular/core";
3
3
  import { DebounceUtils } from "../utils/debouce";
4
- import { getElementLeftoverContentAvailable, getElementPositionInfo, isMousePositionOutsideOfElement, isNullOrUndefined } from './../utils/utils';
4
+ import { getElementLeftoverContentAvailable, getElementPositionInfo, isNullOrUndefined } from './../utils/utils';
5
5
  import { MobileBehavior, TooltipEvent, TooltipPosition } from "./models";
6
6
  import { TooltipComponent } from "./tooltip.component";
7
7
  var TooltipDirective = /** @class */ (function () {
8
+ // private inputRefHasFocus = false;
8
9
  function TooltipDirective(elementRef, appRef, componentFactoryResolver, injector, debounceUtils, renderer) {
9
10
  var _this = this;
10
11
  this.elementRef = elementRef;
@@ -20,8 +21,7 @@ var TooltipDirective = /** @class */ (function () {
20
21
  this.visible = true;
21
22
  this.mobileBehavior = MobileBehavior.Pressing;
22
23
  this.componentRef = null;
23
- this.existFocusedInputRefTooltip = false;
24
- this.boundOnWindowMouseMoveFunction = this.onWindowMouseMove.bind(this);
24
+ // this.boundOnWindowMouseMoveFunction = this.onWindowMouseMove.bind(this);
25
25
  this.debounceCreateTooltipFunction = this.debounceUtils.debounceLeading(function () { return _this._createTooltip(true, true); });
26
26
  }
27
27
  TooltipDirective.prototype.ngOnInit = function () {
@@ -31,22 +31,24 @@ var TooltipDirective = /** @class */ (function () {
31
31
  TooltipDirective.prototype.ngOnDestroy = function () {
32
32
  this.destroy();
33
33
  };
34
- TooltipDirective.prototype.onWindowMouseMove = function (event) {
35
- if (!this.componentRef) {
36
- return;
37
- }
38
- var elementRect = this.elementRef.nativeElement.getBoundingClientRect();
39
- var toolTipRect = this.tooltipDivElement.getBoundingClientRect();
40
- var totalElementArea = {
41
- top: Math.min(elementRect.top, toolTipRect.top),
42
- right: Math.max(elementRect.right, toolTipRect.right),
43
- left: Math.min(elementRect.left, toolTipRect.left),
44
- bottom: Math.max(elementRect.bottom, toolTipRect.bottom),
45
- };
46
- if (isMousePositionOutsideOfElement(event, totalElementArea) && !this.existFocusedInputRefTooltip) {
47
- this.destroy();
48
- }
49
- };
34
+ // private onWindowMouseMove(event: MouseEvent) {
35
+ // if (!this.componentRef) {
36
+ // return;
37
+ // }
38
+ // const elementRect = this.elementRef.nativeElement.getBoundingClientRect();
39
+ // const toolTipRect = this.tooltipDivElement.getBoundingClientRect();
40
+ // const totalElementArea = {
41
+ // top: Math.min(elementRect.top, toolTipRect.top),
42
+ // right: Math.max(elementRect.right, toolTipRect.right),
43
+ // left: Math.min(elementRect.left, toolTipRect.left),
44
+ // bottom: Math.max(elementRect.bottom, toolTipRect.bottom),
45
+ // };
46
+ // const isMouseOutsidePosition = isMousePositionOutsideOfElement(event, totalElementArea);
47
+ // const isHoverEvent = this.tooltipEvent === TooltipEvent.Hover;
48
+ // if (isMouseOutsidePosition && !this.inputRefHasFocus && isHoverEvent) {
49
+ // this.destroy();
50
+ // }
51
+ // }
50
52
  /**
51
53
  * Manipula a visibilidade do tooltip quando houver uma referência de input.
52
54
  */
@@ -57,7 +59,7 @@ var TooltipDirective = /** @class */ (function () {
57
59
  var icon_1 = this.getIconFromFocusedInput();
58
60
  this.renderer.listen(inputFocus, "focus", function () {
59
61
  if (icon_1) {
60
- _this.existFocusedInputRefTooltip = true;
62
+ // this.inputRefHasFocus = true;
61
63
  _this._createTooltip(false, false);
62
64
  }
63
65
  });
@@ -65,7 +67,7 @@ var TooltipDirective = /** @class */ (function () {
65
67
  if (icon_1) {
66
68
  _this.removeTooltip(icon_1);
67
69
  _this.destroy();
68
- _this.existFocusedInputRefTooltip = false;
70
+ // this.inputRefHasFocus = false;
69
71
  }
70
72
  });
71
73
  }
@@ -110,7 +112,8 @@ var TooltipDirective = /** @class */ (function () {
110
112
  }
111
113
  };
112
114
  TooltipDirective.prototype.onMouseLeave = function () {
113
- if (this.tooltipEvent === TooltipEvent.Hover && !this.existFocusedInputRefTooltip) {
115
+ // && !this.inputRefHasFocus
116
+ if (this.tooltipEvent === TooltipEvent.Hover) {
114
117
  this.destroy();
115
118
  }
116
119
  };
@@ -176,7 +179,7 @@ var TooltipDirective = /** @class */ (function () {
176
179
  if (this.componentRef !== null) {
177
180
  this.componentRef.instance.visible = this.visible;
178
181
  this.setTooltipPositionProperty();
179
- window.addEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
182
+ // window.addEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
180
183
  }
181
184
  };
182
185
  TooltipDirective.prototype.setTooltipPositionProperty = function () {
@@ -287,7 +290,7 @@ var TooltipDirective = /** @class */ (function () {
287
290
  this.componentRef = null;
288
291
  this.tooltipDivElement = null;
289
292
  }
290
- window.removeEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
293
+ // window.removeEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
291
294
  };
292
295
  TooltipDirective.ctorParameters = function () { return [
293
296
  { type: ElementRef },
@@ -355,4 +358,4 @@ var TooltipDirective = /** @class */ (function () {
355
358
  return TooltipDirective;
356
359
  }());
357
360
  export { TooltipDirective };
358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxzQkFBc0IsRUFBRSwrQkFBK0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xKLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUt2RDtJQW9DSSwwQkFDcUIsVUFBc0IsRUFDdEIsTUFBc0IsRUFDdEIsd0JBQWtELEVBQ2xELFFBQWtCLEVBQ2xCLGFBQTRCLEVBQzVCLFFBQW1CO1FBTnhDLGlCQVVDO1FBVG9CLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFyQ2pDLGFBQVEsR0FBb0IsZUFBZSxDQUFDLEdBQUcsQ0FBQztRQUdoRCxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBTWhCLGlCQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUdsQyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2YsWUFBTyxHQUFHLElBQUksQ0FBQztRQUdmLG1CQUFjLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUt4QyxpQkFBWSxHQUFtQyxJQUFJLENBQUM7UUFNcEQsZ0NBQTJCLEdBQUcsS0FBSyxDQUFDO1FBVXhDLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQS9CLENBQStCLENBQUMsQ0FBQztJQUNuSCxDQUFDO0lBRU0sbUNBQVEsR0FBZjtRQUNJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFTSxzQ0FBVyxHQUFsQjtRQUNJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sNENBQWlCLEdBQXpCLFVBQTBCLEtBQWlCO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3BCLE9BQU87U0FDVjtRQUNELElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDMUUsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFbkUsSUFBTSxnQkFBZ0IsR0FBRztZQUNyQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUM7WUFDL0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3JELElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNsRCxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUM7U0FDM0QsQ0FBQztRQUVGLElBQUksK0JBQStCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7WUFDL0YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0VBQXVDLEdBQS9DO1FBQUEsaUJBa0JDO1FBakJHLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3hDLElBQU0sTUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUU7Z0JBQ3RDLElBQUksTUFBSSxFQUFFO29CQUNOLEtBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUM7b0JBQ3hDLEtBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO2lCQUNwQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRTtnQkFDckMsSUFBSSxNQUFJLEVBQUU7b0JBQ04sS0FBSSxDQUFDLGFBQWEsQ0FBQyxNQUFJLENBQUMsQ0FBQztvQkFDekIsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNmLEtBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7aUJBQzVDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxrREFBdUIsR0FBL0I7UUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7O09BR0c7SUFDSyx3Q0FBYSxHQUFyQixVQUFzQixJQUFpQjtRQUNuQyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBZ0IsQ0FBQztRQUM5RCxJQUFJLE9BQU8sRUFBRTtZQUNULE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNwQjtJQUNMLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUscUZBQXFGO0lBRzlFLGtDQUFPLEdBQWQ7UUFDSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztJQUdNLGtDQUFPLEdBQWQ7UUFDSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBRTtZQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNsQztJQUNMLENBQUM7SUFHTSxpQ0FBTSxHQUFiO1FBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztJQUdNLHVDQUFZLEdBQW5CO1FBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDMUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBSU0sdUNBQVksR0FBbkI7UUFDSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtZQUMvRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbEI7SUFDTCxDQUFDO0lBR00sdUNBQVksR0FBbkI7UUFEQSxpQkFTQztRQVBHLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ25GLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDbEMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1NBQ2I7SUFDTCxDQUFDO0lBR00scUNBQVUsR0FBakI7UUFDSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBRTtZQUMxQyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLFFBQVEsRUFBRTtnQkFDakQsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNsQjtTQUNKO0lBQ0wsQ0FBQztJQUVPLDJDQUFnQixHQUF4QjtRQUNJLElBQU0sZ0JBQWdCLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUN4SCxJQUFJLENBQUMsUUFBUSxDQUNoQixDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGFBQVcsSUFBSSxDQUFDLFFBQVEsNEJBQXlCLENBQUMsQ0FBQztTQUN0RTtJQUNMLENBQUM7SUFFTyx3Q0FBYSxHQUFyQjtRQUNJLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakcsSUFBSSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsT0FBUSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQWlDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQztJQUM1RixDQUFDO0lBRU8seUNBQWMsR0FBdEIsVUFBdUIsWUFBb0IsRUFBRSxXQUFrQjtRQUEvRCxpQkEyQkM7UUEzQnNCLDZCQUFBLEVBQUEsb0JBQW9CO1FBQUUsNEJBQUEsRUFBQSxrQkFBa0I7O1FBQzNELElBQU0sT0FBTyxHQUFHLE9BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsTUFBTSxJQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQztRQUNuRCxJQUFJLENBQUMsT0FBTyxJQUFJLGVBQWUsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7UUFDckMsSUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsVUFBVSxDQUFDO1lBQ1AsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ3RCLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUlkLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7WUFDbkMsS0FBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2pDLFVBQVUsQ0FBQztnQkFDUCxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtTQUN2QjtJQUVMLENBQUM7SUFFTyxzQ0FBVyxHQUFuQjtRQUNJLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFFbEQsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFFbEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUM3RTtJQUNMLENBQUM7SUFFTyxxREFBMEIsR0FBbEM7UUFBQSxpQkEyR0M7UUExR0csSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsT0FBTTtTQUNUO1FBQ0QsSUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBQSwwREFBdUUsRUFBckUsY0FBSSxFQUFFLGdCQUErRCxDQUFDO1FBRTlFLElBQU0sc0JBQXNCLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUUsSUFBTSxlQUFlLEdBQUcsa0NBQWtDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRixJQUFNLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckYsSUFBTSxvQkFBb0IsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkcsSUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQztRQUN0SSxJQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsaUJBQWlCLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDO1FBQzdGLElBQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztRQUM1RSxJQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsbUJBQW1CLEdBQUcsaUJBQWlCLENBQUM7UUFDOUUsSUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQztRQUNuRyxJQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLENBQUMscUJBQXFCLENBQUM7UUFDOUYsSUFBTSxnQkFBZ0IsR0FBRztZQUNyQixPQUFPLFdBQVcsSUFBSSxZQUFZLElBQUksYUFBYSxDQUFDO1FBQ3hELENBQUMsQ0FBQTtRQUNELElBQU0sbUJBQW1CLEdBQUc7WUFDeEIsT0FBTyxjQUFjLElBQUksWUFBWSxJQUFJLGFBQWEsQ0FBQztRQUMzRCxDQUFDLENBQUE7UUFDRCxJQUFNLGlCQUFpQixHQUFHO1lBQ3RCLE9BQU8sWUFBWSxJQUFJLFdBQVcsSUFBSSxjQUFjLENBQUM7UUFDekQsQ0FBQyxDQUFBO1FBRUQsSUFBTSxrQkFBa0IsR0FBRztZQUN2QixPQUFPLGFBQWEsSUFBSSxXQUFXLElBQUksY0FBYyxDQUFDO1FBQzFELENBQUMsQ0FBQTtRQUVELElBQU0sY0FBYyxHQUFHO1lBQ25CLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUMvQixHQUFHLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxHQUFHLFVBQVU7YUFDL0MsQ0FBQTtRQUNMLENBQUMsQ0FBQTtRQUVELElBQU0saUJBQWlCLEdBQUc7WUFDdEIsT0FBTztnQkFDSCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLENBQUMsYUFBYTthQUN6RSxDQUFDO1FBQ04sQ0FBQyxDQUFBO1FBRUQsSUFBTSxlQUFlLEdBQUc7WUFDcEIsT0FBTztnQkFDSCxJQUFJLEVBQUUsSUFBSTtnQkFDVixHQUFHLEVBQUUsV0FBVzthQUNuQixDQUFDO1FBQ04sQ0FBQyxDQUFBO1FBRUQsSUFBTSxnQkFBZ0IsR0FBRztZQUNyQixPQUFPO2dCQUNILElBQUksRUFBRSxLQUFLO2dCQUNYLEdBQUcsRUFBRSxXQUFXO2FBQ25CLENBQUM7UUFDTixDQUFDLENBQUE7UUFRRCxJQUFNLFNBQVMsR0FBZTtZQUMxQjtnQkFDSSxHQUFHLEVBQUUsZUFBZSxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLEdBQUcsRUFBRSxjQUFjO2FBQ3RCO1lBQ0Q7Z0JBQ0ksR0FBRyxFQUFFLGVBQWUsQ0FBQyxNQUFNO2dCQUMzQixLQUFLLEVBQUUsbUJBQW1CO2dCQUMxQixHQUFHLEVBQUUsaUJBQWlCO2FBQ3pCO1lBQ0Q7Z0JBQ0ksR0FBRyxFQUFFLGVBQWUsQ0FBQyxJQUFJO2dCQUN6QixLQUFLLEVBQUUsaUJBQWlCO2dCQUN4QixHQUFHLEVBQUUsZUFBZTthQUN2QjtZQUNEO2dCQUNJLEdBQUcsRUFBRSxlQUFlLENBQUMsS0FBSztnQkFDMUIsS0FBSyxFQUFFLGtCQUFrQjtnQkFDekIsR0FBRyxFQUFFLGdCQUFnQjthQUV4QjtTQUNKLENBQUM7UUFFRixJQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQUMsUUFBUSxJQUFLLE9BQUEsUUFBUSxDQUFDLEdBQUcsS0FBSyxLQUFJLENBQUMsUUFBUSxFQUE5QixDQUE4QixDQUFDLENBQUM7UUFDckYsSUFBSSxhQUFhLEdBQWEsZUFBZSxDQUFDO1FBQzlDLElBQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RELElBQUkscUJBQXFCLEVBQUU7WUFDdkIsYUFBYSxHQUFHLGVBQWUsQ0FBQztTQUNuQzthQUFNLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixJQUFNLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBQyxRQUFRLElBQUssT0FBQSxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQWhCLENBQWdCLENBQUMsQ0FBQztZQUNoRixJQUFJLHdCQUF3QixFQUFFO2dCQUMxQixhQUFhLEdBQUcsd0JBQXdCLENBQUM7YUFDNUM7U0FDSjtRQUNELElBQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ3BDLElBQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7SUFFNUQsQ0FBQztJQUNPLHdEQUE2QixHQUFyQztRQUNJLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDbkQ7SUFDTCxDQUFDO0lBRU8sa0NBQU8sR0FBZjtRQUNJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDdkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDakM7UUFFRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7O2dCQW5VZ0MsVUFBVTtnQkFDZCxjQUFjO2dCQUNJLHdCQUF3QjtnQkFDeEMsUUFBUTtnQkFDSCxhQUFhO2dCQUNsQixTQUFTOztJQXhDeEM7UUFEQyxLQUFLLENBQUMsVUFBVSxDQUFDO3FEQUNLO0lBR3ZCO1FBREMsS0FBSyxDQUFDLGlCQUFpQixDQUFDO3NEQUM4QjtJQUd2RDtRQURDLEtBQUssRUFBRTt1REFDZTtJQUd2QjtRQURDLEtBQUssRUFBRTt5REFDbUI7SUFHM0I7UUFEQyxLQUFLLEVBQUU7MERBQ2lDO0lBR3pDO1FBREMsS0FBSyxFQUFFO29EQUNjO0lBR3RCO1FBREMsS0FBSyxFQUFFO3FEQUNjO0lBR3RCO1FBREMsS0FBSyxFQUFFOzREQUN3QztJQUdoRDtRQURDLEtBQUssRUFBRTs2REFDaUM7SUFnR3pDO1FBRkMsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUNyQixZQUFZLENBQUMsU0FBUyxDQUFDO21EQUt2QjtJQUdEO1FBREMsWUFBWSxDQUFDLE9BQU8sQ0FBQzttREFLckI7SUFHRDtRQURDLFlBQVksQ0FBQyxNQUFNLENBQUM7a0RBS3BCO0lBR0Q7UUFEQyxZQUFZLENBQUMsWUFBWSxDQUFDO3dEQUsxQjtJQUlEO1FBRkMsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUMxQixZQUFZLENBQUMsT0FBTyxDQUFDO3dEQUtyQjtJQUdEO1FBREMsWUFBWSxDQUFDLFlBQVksQ0FBQzt3REFTMUI7SUFHRDtRQURDLFlBQVksQ0FBQyxVQUFVLENBQUM7c0RBUXhCO0lBaExRLGdCQUFnQjtRQUg1QixTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsWUFBWTtTQUN6QixDQUFDO09BQ1csZ0JBQWdCLENBeVc1QjtJQUFELHVCQUFDO0NBQUEsQUF6V0QsSUF5V0M7U0F6V1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEVtYmVkZGVkVmlld1JlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBEZWJvdW5jZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL2RlYm91Y2VcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRMZWZ0b3ZlckNvbnRlbnRBdmFpbGFibGUsIGdldEVsZW1lbnRQb3NpdGlvbkluZm8sIGlzTW91c2VQb3NpdGlvbk91dHNpZGVPZkVsZW1lbnQsIGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgeyBNb2JpbGVCZWhhdmlvciwgVG9vbHRpcEV2ZW50LCBUb29sdGlwUG9zaXRpb24gfSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IFRvb2x0aXBDb21wb25lbnQgfSBmcm9tIFwiLi90b29sdGlwLmNvbXBvbmVudFwiO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbc1Rvb2x0aXBdXCIsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KFwic1Rvb2x0aXBcIilcbiAgICBwdWJsaWMgdG9vbHRpcDogc3RyaW5nO1xuXG4gICAgQElucHV0KFwidG9vbHRpcFBvc2l0aW9uXCIpXG4gICAgcHVibGljIHBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb24uVG9wO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvd0RlbGF5ID0gNTAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzcGxheVRpbWU6IG51bWJlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRvb2x0aXBFdmVudCA9IFRvb2x0aXBFdmVudC5Ib3ZlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVzY2FwZSA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdmlzaWJsZSA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtb2JpbGVCZWhhdmlvciA9IE1vYmlsZUJlaGF2aW9yLlByZXNzaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZm9jdXNlZElucHV0UmVmOiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUb29sdGlwQ29tcG9uZW50PiA9IG51bGw7XG4gICAgcHJpdmF0ZSBzaG93VGltZW91dD86IG51bWJlcjtcbiAgICBwcml2YXRlIHRvdWNoVGltZW91dD86IG51bWJlcjtcbiAgICBwcml2YXRlIHRvb2x0aXBEaXZFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBib3VuZE9uV2luZG93TW91c2VNb3ZlRnVuY3Rpb246IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYm91bmNlQ3JlYXRlVG9vbHRpcEZ1bmN0aW9uOiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgZXhpc3RGb2N1c2VkSW5wdXRSZWZUb29sdGlwID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRlYm91bmNlVXRpbHM6IERlYm91bmNlVXRpbHMsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICAgICkge1xuICAgICAgICB0aGlzLmJvdW5kT25XaW5kb3dNb3VzZU1vdmVGdW5jdGlvbiA9IHRoaXMub25XaW5kb3dNb3VzZU1vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWJvdW5jZUNyZWF0ZVRvb2x0aXBGdW5jdGlvbiA9IHRoaXMuZGVib3VuY2VVdGlscy5kZWJvdW5jZUxlYWRpbmcoKCkgPT4gdGhpcy5fY3JlYXRlVG9vbHRpcCh0cnVlLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbGlkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwVmlzaWJpbGl0eVdoZW5Gb2N1c09uSW5wdXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25XaW5kb3dNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRvb2xUaXBSZWN0ID0gdGhpcy50b29sdGlwRGl2RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCB0b3RhbEVsZW1lbnRBcmVhID0ge1xuICAgICAgICAgICAgdG9wOiBNYXRoLm1pbihlbGVtZW50UmVjdC50b3AsIHRvb2xUaXBSZWN0LnRvcCksXG4gICAgICAgICAgICByaWdodDogTWF0aC5tYXgoZWxlbWVudFJlY3QucmlnaHQsIHRvb2xUaXBSZWN0LnJpZ2h0KSxcbiAgICAgICAgICAgIGxlZnQ6IE1hdGgubWluKGVsZW1lbnRSZWN0LmxlZnQsIHRvb2xUaXBSZWN0LmxlZnQpLFxuICAgICAgICAgICAgYm90dG9tOiBNYXRoLm1heChlbGVtZW50UmVjdC5ib3R0b20sIHRvb2xUaXBSZWN0LmJvdHRvbSksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGlzTW91c2VQb3NpdGlvbk91dHNpZGVPZkVsZW1lbnQoZXZlbnQsIHRvdGFsRWxlbWVudEFyZWEpICYmICF0aGlzLmV4aXN0Rm9jdXNlZElucHV0UmVmVG9vbHRpcCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBhIHZpc2liaWxpZGFkZSBkbyB0b29sdGlwIHF1YW5kbyBob3V2ZXIgdW1hIHJlZmVyw6puY2lhIGRlIGlucHV0LlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlVG9vbHRpcFZpc2liaWxpdHlXaGVuRm9jdXNPbklucHV0KCkge1xuICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5wdXRSZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0Rm9jdXMgPSB0aGlzLmZvY3VzZWRJbnB1dFJlZjtcbiAgICAgICAgICAgIGNvbnN0IGljb24gPSB0aGlzLmdldEljb25Gcm9tRm9jdXNlZElucHV0KCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihpbnB1dEZvY3VzLCBcImZvY3VzXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaWNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXN0Rm9jdXNlZElucHV0UmVmVG9vbHRpcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVRvb2x0aXAoZmFsc2UsIGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oaW5wdXRGb2N1cywgXCJibHVyXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaWNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVRvb2x0aXAoaWNvbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXN0Rm9jdXNlZElucHV0UmVmVG9vbHRpcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0w6ltIG8gZWxlbWVudG8gZG8gw61jb25lIGFzc29jaWFkbyBhbyBsYWJlbCBkbyBpbnB1dCBlbSBmb2N1cy5cbiAgICAgKiBAcmV0dXJucyBPIMOtY29uZSBkbyBpbnB1dCBlbSBmb2N1cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEljb25Gcm9tRm9jdXNlZElucHV0KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBvIHRvb2x0aXAgYXNzb2NpYWRvIGFvIMOtY29uZSBkbyBpbnB1dCBlbSBmb2N1cy5cbiAgICAgKiBAcGFyYW0gaWNvbiBPIMOtY29uZSBkbyBpbnB1dCBlbSBmb2N1cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZVRvb2x0aXAoaWNvbjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IGljb24ucXVlcnlTZWxlY3RvcihcIi50b29sdGlwXCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodG9vbHRpcCkge1xuICAgICAgICAgICAgdG9vbHRpcC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgd2l0aCB0aGUgdG9vbHRpcCBpcyBjbGlja2VkIEkgZGVzdHJveSB0aGUgdG9vbHRpcC5cbiAgICAvLyB3aGVuZXZlciBhIGtleSBpcyBwcmVzc2VkIG9uIHRoZSBjb21wb25lbnQgd2l0aCB0aGUgdG9vbHRpcCBJIGRlc3Ryb3kgdGhlIHRvb2x0aXAuXG4gICAgQEhvc3RMaXN0ZW5lcihcImNsaWNrXCIpXG4gICAgQEhvc3RMaXN0ZW5lcihcImtleWRvd25cIilcbiAgICBwdWJsaWMgb25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcEV2ZW50ID09PSBUb29sdGlwRXZlbnQuSG92ZXIgJiYgIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSkgJiYgIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZS9pKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZm9jdXNcIilcbiAgICBwdWJsaWMgb25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcEV2ZW50ID09PSBUb29sdGlwRXZlbnQuRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVRvb2x0aXAodHJ1ZSwgdHJ1ZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJibHVyXCIpXG4gICAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcEV2ZW50ID09PSBUb29sdGlwRXZlbnQuRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIilcbiAgICBwdWJsaWMgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50b29sdGlwRXZlbnQgPT09IFRvb2x0aXBFdmVudC5Ib3Zlcikge1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZUNyZWF0ZVRvb2x0aXBGdW5jdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIilcbiAgICBASG9zdExpc3RlbmVyKFwid2hlZWxcIilcbiAgICBwdWJsaWMgb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50b29sdGlwRXZlbnQgPT09IFRvb2x0aXBFdmVudC5Ib3ZlciAmJiAhdGhpcy5leGlzdEZvY3VzZWRJbnB1dFJlZlRvb2x0aXApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcInRvdWNoc3RhcnRcIilcbiAgICBwdWJsaWMgb25Ub3VjaFN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50b29sdGlwRXZlbnQgPT09IFRvb2x0aXBFdmVudC5Ib3Zlcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dCk7XG4gICAgICAgICAgICBjb25zdCBfZGVsYXkgPSB0aGlzLm1vYmlsZUJlaGF2aW9yID09PSBNb2JpbGVCZWhhdmlvci5QcmVzc2luZyA/IHRoaXMuc2hvd0RlbGF5IDogMFxuICAgICAgICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlVG9vbHRpcCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIH0sIF9kZWxheSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJ0b3VjaGVuZFwiKVxuICAgIHB1YmxpYyBvblRvdWNoRW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50b29sdGlwRXZlbnQgPT09IFRvb2x0aXBFdmVudC5Ib3Zlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9iaWxlQmVoYXZpb3IgPT09IE1vYmlsZUJlaGF2aW9yLlByZXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zUG9zaXRpb24gPSBbVG9vbHRpcFBvc2l0aW9uLlRvcCwgVG9vbHRpcFBvc2l0aW9uLlJpZ2h0LCBUb29sdGlwUG9zaXRpb24uQm90dG9tLCBUb29sdGlwUG9zaXRpb24uTGVmdF0uaW5jbHVkZXMoXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFjb250YWluc1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gVG9vbHRpcFBvc2l0aW9uLlRvcDtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9vbHRpcCAke3RoaXMucG9zaXRpb259IHBvc2l0aW9uIGlzIHVuZXhwZWN0ZWRgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RG9tRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShUb29sdGlwQ29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcbiAgICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyh0aGlzLmNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgICAgIHJldHVybiAodGhpcy5jb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVUb29sdGlwKHVzZVNob3dEZWxheSA9IGZhbHNlLCBhdXRvRGVzdHJveSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgaGFzVGV4dCA9IHRoaXMudG9vbHRpcD8ubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgaGFzQ29tcG9uZW50UmVmID0gdGhpcy5jb21wb25lbnRSZWYgIT09IG51bGw7XG4gICAgICAgIGlmICghaGFzVGV4dCB8fCBoYXNDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy5nZXREb21FbGVtZW50KCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9tRWxlbWVudCk7XG4gICAgICAgIHRoaXMudG9vbHRpcERpdkVsZW1lbnQgPSBkb21FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIudG9vbHRpcFwiKTtcbiAgICAgICAgdGhpcy5zZXRUb29sdGlwQ29tcG9uZW50UHJvcGVydGllcygpO1xuICAgICAgICBjb25zdCBfc2hvd0RlbGF5ID0gdXNlU2hvd0RlbGF5ID8gdGhpcy5zaG93RGVsYXkgOiAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1Rvb2x0aXAoKVxuICAgICAgICB9LCBfc2hvd0RlbGF5KVxuXG5cblxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih3aW5kb3csIFwic2Nyb2xsXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VG9vbHRpcFBvc2l0aW9uUHJvcGVydHkoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGF1dG9EZXN0cm95ICYmIHRoaXMuZGlzcGxheVRpbWUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5kaXNwbGF5VGltZSlcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93VG9vbHRpcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS52aXNpYmxlID0gdGhpcy52aXNpYmxlO1xuXG4gICAgICAgICAgICB0aGlzLnNldFRvb2x0aXBQb3NpdGlvblByb3BlcnR5KCk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuYm91bmRPbldpbmRvd01vdXNlTW92ZUZ1bmN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VG9vbHRpcFBvc2l0aW9uUHJvcGVydHkoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFuY2hvclNpemUgPSA1O1xuICAgICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCB0b29sdGlwRWxlbWVudFBvc2l0aW9uID0gZ2V0RWxlbWVudFBvc2l0aW9uSW5mbyh0aGlzLnRvb2x0aXBEaXZFbGVtZW50KTtcbiAgICAgICAgY29uc3QgZWxlbWVudExlZnRvdmVyID0gZ2V0RWxlbWVudExlZnRvdmVyQ29udGVudEF2YWlsYWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUcmlnZ2VyUG9zaXRpb24gPSBnZXRFbGVtZW50UG9zaXRpb25JbmZvKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgaXNQb3NpdGlvbkhvcml6b250YWwgPSBbVG9vbHRpcFBvc2l0aW9uLkxlZnQsIFRvb2x0aXBQb3NpdGlvbi5SaWdodF0uaW5jbHVkZXModGhpcy5wb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlVG9Cb3JkZXJzID0gaXNQb3NpdGlvbkhvcml6b250YWwgPyB0b29sdGlwRWxlbWVudFBvc2l0aW9uLmVsZW1lbnRXaWR0aCA6IHRvb2x0aXBFbGVtZW50UG9zaXRpb24uZWxlbWVudEhvcml6b250YWxDZW50ZXI7XG4gICAgICAgIGNvbnN0IGNhblNldEF0VG9wID0gZWxlbWVudExlZnRvdmVyLmZyZWVEaXN0YW5jZVRvVG9wID4gdG9vbHRpcEVsZW1lbnRQb3NpdGlvbi5lbGVtZW50SGVpZ2h0O1xuICAgICAgICBjb25zdCBjYW5TZXRBdExlZnQgPSBlbGVtZW50TGVmdG92ZXIuZnJlZURpc3RhbmNlVG9MZWZ0ID4gZGlzdGFuY2VUb0JvcmRlcnM7XG4gICAgICAgIGNvbnN0IGNhblNldEF0UmlnaHQgPSBlbGVtZW50TGVmdG92ZXIuZnJlZURpc3RhbmNlVG9SaWdodCA+IGRpc3RhbmNlVG9Cb3JkZXJzO1xuICAgICAgICBjb25zdCBjYW5TZXRBdEJvdHRvbSA9IGVsZW1lbnRMZWZ0b3Zlci5mcmVlRGlzdGFuY2VUb0JvdHRvbSA+IHRvb2x0aXBFbGVtZW50UG9zaXRpb24uZWxlbWVudEhlaWdodDtcbiAgICAgICAgY29uc3QgdG9wVmVydGljYWwgPSBlbGVtZW50VHJpZ2dlclBvc2l0aW9uLnRvcCArIGVsZW1lbnRUcmlnZ2VyUG9zaXRpb24uZWxlbWVudFZlcnRpY2FsQ2VudGVyO1xuICAgICAgICBjb25zdCBjaGVja1RvcFBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNhblNldEF0VG9wICYmIGNhblNldEF0TGVmdCAmJiBjYW5TZXRBdFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrQm90dG9tUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FuU2V0QXRCb3R0b20gJiYgY2FuU2V0QXRMZWZ0ICYmIGNhblNldEF0UmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hlY2tMZWZ0UG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FuU2V0QXRMZWZ0ICYmIGNhblNldEF0VG9wICYmIGNhblNldEF0Qm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tSaWdodFBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNhblNldEF0UmlnaHQgJiYgY2FuU2V0QXRUb3AgJiYgY2FuU2V0QXRCb3R0b207XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXRUb3BQb3NpdGlvbiA9ICgpOiB7IGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIgfSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQgKyAocmlnaHQgLSBsZWZ0KSAvIDIsXG4gICAgICAgICAgICAgICAgdG9wOiBlbGVtZW50VHJpZ2dlclBvc2l0aW9uLnRvcCAtIGFuY2hvclNpemVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNldEJvdHRvbVBvc2l0aW9uID0gKCk6IHsgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciB9ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGVmdDogbGVmdCArIChyaWdodCAtIGxlZnQpIC8gMixcbiAgICAgICAgICAgICAgICB0b3A6IGVsZW1lbnRUcmlnZ2VyUG9zaXRpb24udG9wICsgZWxlbWVudFRyaWdnZXJQb3NpdGlvbi5lbGVtZW50SGVpZ2h0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2V0TGVmdFBvc2l0aW9uID0gKCk6IHsgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciB9ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgICAgICAgICB0b3A6IHRvcFZlcnRpY2FsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2V0UmlnaHRQb3NpdGlvbiA9ICgpOiB7IGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIgfSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxlZnQ6IHJpZ2h0LFxuICAgICAgICAgICAgICAgIHRvcDogdG9wVmVydGljYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0eXBlIFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgcG9zOiBUb29sdGlwUG9zaXRpb24sXG4gICAgICAgICAgICBjaGVjazogKCkgPT4gYm9vbGVhbixcbiAgICAgICAgICAgIHNldDogKCkgPT4geyBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uczogUG9zaXRpb25bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwb3M6IFRvb2x0aXBQb3NpdGlvbi5Ub3AsXG4gICAgICAgICAgICAgICAgY2hlY2s6IGNoZWNrVG9wUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2V0OiBzZXRUb3BQb3NpdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwb3M6IFRvb2x0aXBQb3NpdGlvbi5Cb3R0b20sXG4gICAgICAgICAgICAgICAgY2hlY2s6IGNoZWNrQm90dG9tUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2V0OiBzZXRCb3R0b21Qb3NpdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwb3M6IFRvb2x0aXBQb3NpdGlvbi5MZWZ0LFxuICAgICAgICAgICAgICAgIGNoZWNrOiBjaGVja0xlZnRQb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzZXQ6IHNldExlZnRQb3NpdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwb3M6IFRvb2x0aXBQb3NpdGlvbi5SaWdodCxcbiAgICAgICAgICAgICAgICBjaGVjazogY2hlY2tSaWdodFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNldDogc2V0UmlnaHRQb3NpdGlvblxuXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25EZWZpbmVkID0gcG9zaXRpb25zLmZpbmQoKHBvc2l0aW9uKSA9PiBwb3NpdGlvbi5wb3MgPT09IHRoaXMucG9zaXRpb24pO1xuICAgICAgICBsZXQgdmFsaWRQb3NpdGlvbjogUG9zaXRpb24gPSBwb3NpdGlvbkRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNhblVzZURlZmluZWRQb3NpdGlvbiA9IHBvc2l0aW9uRGVmaW5lZC5jaGVjaygpO1xuICAgICAgICBpZiAoY2FuVXNlRGVmaW5lZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICB2YWxpZFBvc2l0aW9uID0gcG9zaXRpb25EZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKCFjYW5Vc2VEZWZpbmVkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkQWx0ZXJuYXRpdmVQb3NpdGlvbiA9IHBvc2l0aW9ucy5maW5kKChwb3NpdGlvbikgPT4gcG9zaXRpb24uY2hlY2soKSk7XG4gICAgICAgICAgICBpZiAodmFsaWRBbHRlcm5hdGl2ZVBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRQb3NpdGlvbiA9IHZhbGlkQWx0ZXJuYXRpdmVQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfcG9zaXRpb24gPSB2YWxpZFBvc2l0aW9uLnNldCgpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbkxlZnQgPSBfcG9zaXRpb24ubGVmdDtcbiAgICAgICAgY29uc3QgcG9zaXRpb25Ub3AgPSBfcG9zaXRpb24udG9wO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5sZWZ0ID0gTWF0aC5yb3VuZChwb3NpdGlvbkxlZnQpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS50b3AgPSBNYXRoLnJvdW5kKHBvc2l0aW9uVG9wKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UucG9zaXRpb24gPSB2YWxpZFBvc2l0aW9uLnBvcztcblxuICAgIH1cbiAgICBwcml2YXRlIHNldFRvb2x0aXBDb21wb25lbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLnRvb2x0aXAgPSB0aGlzLnRvb2x0aXA7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lc2NhcGUgPSB0aGlzLmVzY2FwZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZCh0aGlzLmNvbXBvbmVudFJlZikpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zaG93VGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KHRoaXMuY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcERpdkVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5ib3VuZE9uV2luZG93TW91c2VNb3ZlRnVuY3Rpb24pO1xuICAgIH1cbn1cbiJdfQ==
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxzQkFBc0IsRUFBbUMsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsSixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFLdkQ7SUFrQ0ksb0NBQW9DO0lBRXBDLDBCQUNxQixVQUFzQixFQUN0QixNQUFzQixFQUN0Qix3QkFBa0QsRUFDbEQsUUFBa0IsRUFDbEIsYUFBNEIsRUFDNUIsUUFBbUI7UUFOeEMsaUJBVUM7UUFUb0IsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXJDakMsYUFBUSxHQUFvQixlQUFlLENBQUMsR0FBRyxDQUFDO1FBR2hELGNBQVMsR0FBRyxHQUFHLENBQUM7UUFNaEIsaUJBQVks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O1FBREMsS0FBSyxFQUFFO3VEQUNlO0lBR3ZCO1FBREMsS0FBSyxFQUFFO3lEQUNtQjtJQUczQjtRQURDLEtBQUssRUFBRTswREFDaUM7SUFHekM7UUFEQyxLQUFLLEVBQUU7b0RBQ2M7SUFHdEI7UUFEQyxLQUFLLEVBQUU7cURBQ2M7SUFHdEI7UUFEQyxLQUFLLEVBQUU7NERBQ3dDO0lBR2hEO1FBREMsS0FBSyxFQUFFOzZEQUNpQztJQW1HekM7UUFGQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ3JCLFlBQVksQ0FBQyxTQUFTLENBQUM7bURBS3ZCO0lBR0Q7UUFEQyxZQUFZLENBQUMsT0FBTyxDQUFDO21EQUtyQjtJQUdEO1FBREMsWUFBWSxDQUFDLE1BQU0sQ0FBQztrREFLcEI7SUFHRDtRQURDLFlBQVksQ0FBQyxZQUFZLENBQUM7d0RBSzFCO0lBSUQ7UUFGQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQzFCLFlBQVksQ0FBQyxPQUFPLENBQUM7d0RBTXJCO0lBR0Q7UUFEQyxZQUFZLENBQUMsWUFBWSxDQUFDO3dEQVMxQjtJQUdEO1FBREMsWUFBWSxDQUFDLFVBQVUsQ0FBQztzREFReEI7SUFwTFEsZ0JBQWdCO1FBSDVCLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxZQUFZO1NBQ3pCLENBQUM7T0FDVyxnQkFBZ0IsQ0E2VzVCO0lBQUQsdUJBQUM7Q0FBQSxBQTdXRCxJQTZXQztTQTdXWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBDb21wb25lbnRSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRW1iZWRkZWRWaWV3UmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFJlbmRlcmVyMixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERlYm91bmNlVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvZGVib3VjZVwiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudExlZnRvdmVyQ29udGVudEF2YWlsYWJsZSwgZ2V0RWxlbWVudFBvc2l0aW9uSW5mbywgaXNNb3VzZVBvc2l0aW9uT3V0c2lkZU9mRWxlbWVudCwgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICcuLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7IE1vYmlsZUJlaGF2aW9yLCBUb29sdGlwRXZlbnQsIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gXCIuL21vZGVsc1wiO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gXCIuL3Rvb2x0aXAuY29tcG9uZW50XCI7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiBcIltzVG9vbHRpcF1cIixcbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoXCJzVG9vbHRpcFwiKVxuICAgIHB1YmxpYyB0b29sdGlwOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoXCJ0b29sdGlwUG9zaXRpb25cIilcbiAgICBwdWJsaWMgcG9zaXRpb246IFRvb2x0aXBQb3NpdGlvbiA9IFRvb2x0aXBQb3NpdGlvbi5Ub3A7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93RGVsYXkgPSA1MDA7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNwbGF5VGltZTogbnVtYmVyO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdG9vbHRpcEV2ZW50ID0gVG9vbHRpcEV2ZW50LkhvdmVyO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZXNjYXBlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2aXNpYmxlID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vYmlsZUJlaGF2aW9yID0gTW9iaWxlQmVoYXZpb3IuUHJlc3Npbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmb2N1c2VkSW5wdXRSZWY6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFRvb2x0aXBDb21wb25lbnQ+ID0gbnVsbDtcbiAgICBwcml2YXRlIHNob3dUaW1lb3V0PzogbnVtYmVyO1xuICAgIHByaXZhdGUgdG91Y2hUaW1lb3V0PzogbnVtYmVyO1xuICAgIHByaXZhdGUgdG9vbHRpcERpdkVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IGJvdW5kT25XaW5kb3dNb3VzZU1vdmVGdW5jdGlvbjogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VDcmVhdGVUb29sdGlwRnVuY3Rpb246ICgpID0+IHZvaWQ7XG4gICAgLy8gcHJpdmF0ZSBpbnB1dFJlZkhhc0ZvY3VzID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRlYm91bmNlVXRpbHM6IERlYm91bmNlVXRpbHMsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICAgICkge1xuICAgICAgICAvLyB0aGlzLmJvdW5kT25XaW5kb3dNb3VzZU1vdmVGdW5jdGlvbiA9IHRoaXMub25XaW5kb3dNb3VzZU1vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWJvdW5jZUNyZWF0ZVRvb2x0aXBGdW5jdGlvbiA9IHRoaXMuZGVib3VuY2VVdGlscy5kZWJvdW5jZUxlYWRpbmcoKCkgPT4gdGhpcy5fY3JlYXRlVG9vbHRpcCh0cnVlLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbGlkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwVmlzaWJpbGl0eVdoZW5Gb2N1c09uSW5wdXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgb25XaW5kb3dNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvLyAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgIC8vICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGNvbnN0IHRvb2xUaXBSZWN0ID0gdGhpcy50b29sdGlwRGl2RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIC8vICAgICBjb25zdCB0b3RhbEVsZW1lbnRBcmVhID0ge1xuICAgIC8vICAgICAgICAgdG9wOiBNYXRoLm1pbihlbGVtZW50UmVjdC50b3AsIHRvb2xUaXBSZWN0LnRvcCksXG4gICAgLy8gICAgICAgICByaWdodDogTWF0aC5tYXgoZWxlbWVudFJlY3QucmlnaHQsIHRvb2xUaXBSZWN0LnJpZ2h0KSxcbiAgICAvLyAgICAgICAgIGxlZnQ6IE1hdGgubWluKGVsZW1lbnRSZWN0LmxlZnQsIHRvb2xUaXBSZWN0LmxlZnQpLFxuICAgIC8vICAgICAgICAgYm90dG9tOiBNYXRoLm1heChlbGVtZW50UmVjdC5ib3R0b20sIHRvb2xUaXBSZWN0LmJvdHRvbSksXG4gICAgLy8gICAgIH07XG5cbiAgICAvLyAgICAgY29uc3QgaXNNb3VzZU91dHNpZGVQb3NpdGlvbiA9IGlzTW91c2VQb3NpdGlvbk91dHNpZGVPZkVsZW1lbnQoZXZlbnQsIHRvdGFsRWxlbWVudEFyZWEpO1xuICAgIC8vICAgICBjb25zdCBpc0hvdmVyRXZlbnQgPSB0aGlzLnRvb2x0aXBFdmVudCA9PT0gVG9vbHRpcEV2ZW50LkhvdmVyO1xuXG4gICAgLy8gICAgIGlmIChpc01vdXNlT3V0c2lkZVBvc2l0aW9uICYmICF0aGlzLmlucHV0UmVmSGFzRm9jdXMgJiYgaXNIb3ZlckV2ZW50KSB7XG4gICAgLy8gICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGEgdmlzaWJpbGlkYWRlIGRvIHRvb2x0aXAgcXVhbmRvIGhvdXZlciB1bWEgcmVmZXLDqm5jaWEgZGUgaW5wdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwVmlzaWJpbGl0eVdoZW5Gb2N1c09uSW5wdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbnB1dFJlZikge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRGb2N1cyA9IHRoaXMuZm9jdXNlZElucHV0UmVmO1xuICAgICAgICAgICAgY29uc3QgaWNvbiA9IHRoaXMuZ2V0SWNvbkZyb21Gb2N1c2VkSW5wdXQoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGlucHV0Rm9jdXMsIFwiZm9jdXNcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5wdXRSZWZIYXNGb2N1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVRvb2x0aXAoZmFsc2UsIGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oaW5wdXRGb2N1cywgXCJibHVyXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaWNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVRvb2x0aXAoaWNvbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmlucHV0UmVmSGFzRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9idMOpbSBvIGVsZW1lbnRvIGRvIMOtY29uZSBhc3NvY2lhZG8gYW8gbGFiZWwgZG8gaW5wdXQgZW0gZm9jdXMuXG4gICAgICogQHJldHVybnMgTyDDrWNvbmUgZG8gaW5wdXQgZW0gZm9jdXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRJY29uRnJvbUZvY3VzZWRJbnB1dCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgbyB0b29sdGlwIGFzc29jaWFkbyBhbyDDrWNvbmUgZG8gaW5wdXQgZW0gZm9jdXMuXG4gICAgICogQHBhcmFtIGljb24gTyDDrWNvbmUgZG8gaW5wdXQgZW0gZm9jdXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVUb29sdGlwKGljb246IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSBpY29uLnF1ZXJ5U2VsZWN0b3IoXCIudG9vbHRpcFwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRvb2x0aXApIHtcbiAgICAgICAgICAgIHRvb2x0aXAucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB3aGVuZXZlciB0aGUgY29tcG9uZW50IHdpdGggdGhlIHRvb2x0aXAgaXMgY2xpY2tlZCBJIGRlc3Ryb3kgdGhlIHRvb2x0aXAuXG4gICAgLy8gd2hlbmV2ZXIgYSBrZXkgaXMgcHJlc3NlZCBvbiB0aGUgY29tcG9uZW50IHdpdGggdGhlIHRvb2x0aXAgSSBkZXN0cm95IHRoZSB0b29sdGlwLlxuICAgIEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiKVxuICAgIEBIb3N0TGlzdGVuZXIoXCJrZXlkb3duXCIpXG4gICAgcHVibGljIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBFdmVudCA9PT0gVG9vbHRpcEV2ZW50LkhvdmVyICYmICFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpICYmICFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmUvaSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImZvY3VzXCIpXG4gICAgcHVibGljIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBFdmVudCA9PT0gVG9vbHRpcEV2ZW50LkZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVUb29sdGlwKHRydWUsIHRydWUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiYmx1clwiKVxuICAgIHB1YmxpYyBvbkJsdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBFdmVudCA9PT0gVG9vbHRpcEV2ZW50LkZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIpXG4gICAgcHVibGljIG9uTW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcEV2ZW50ID09PSBUb29sdGlwRXZlbnQuSG92ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVib3VuY2VDcmVhdGVUb29sdGlwRnVuY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIpXG4gICAgQEhvc3RMaXN0ZW5lcihcIndoZWVsXCIpXG4gICAgcHVibGljIG9uTW91c2VMZWF2ZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gJiYgIXRoaXMuaW5wdXRSZWZIYXNGb2N1c1xuICAgICAgICBpZiAodGhpcy50b29sdGlwRXZlbnQgPT09IFRvb2x0aXBFdmVudC5Ib3Zlcikge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwidG91Y2hzdGFydFwiKVxuICAgIHB1YmxpYyBvblRvdWNoU3RhcnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBFdmVudCA9PT0gVG9vbHRpcEV2ZW50LkhvdmVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hUaW1lb3V0KTtcbiAgICAgICAgICAgIGNvbnN0IF9kZWxheSA9IHRoaXMubW9iaWxlQmVoYXZpb3IgPT09IE1vYmlsZUJlaGF2aW9yLlByZXNzaW5nID8gdGhpcy5zaG93RGVsYXkgOiAwXG4gICAgICAgICAgICB0aGlzLnRvdWNoVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVUb29sdGlwKHRydWUsIHRydWUpO1xuICAgICAgICAgICAgfSwgX2RlbGF5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcInRvdWNoZW5kXCIpXG4gICAgcHVibGljIG9uVG91Y2hFbmQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBFdmVudCA9PT0gVG9vbHRpcEV2ZW50LkhvdmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2JpbGVCZWhhdmlvciA9PT0gTW9iaWxlQmVoYXZpb3IuUHJlc3NpbmcpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3QgY29udGFpbnNQb3NpdGlvbiA9IFtUb29sdGlwUG9zaXRpb24uVG9wLCBUb29sdGlwUG9zaXRpb24uUmlnaHQsIFRvb2x0aXBQb3NpdGlvbi5Cb3R0b20sIFRvb2x0aXBQb3NpdGlvbi5MZWZ0XS5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWNvbnRhaW5zUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb24uVG9wO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb29sdGlwICR7dGhpcy5wb3NpdGlvbn0gcG9zaXRpb24gaXMgdW5leHBlY3RlZGApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREb21FbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFRvb2x0aXBDb21wb25lbnQpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHRoaXMuY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZVRvb2x0aXAodXNlU2hvd0RlbGF5ID0gZmFsc2UsIGF1dG9EZXN0cm95ID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBoYXNUZXh0ID0gdGhpcy50b29sdGlwPy5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBoYXNDb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudFJlZiAhPT0gbnVsbDtcbiAgICAgICAgaWYgKCFoYXNUZXh0IHx8IGhhc0NvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSB0aGlzLmdldERvbUVsZW1lbnQoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb21FbGVtZW50KTtcbiAgICAgICAgdGhpcy50b29sdGlwRGl2RWxlbWVudCA9IGRvbUVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi50b29sdGlwXCIpO1xuICAgICAgICB0aGlzLnNldFRvb2x0aXBDb21wb25lbnRQcm9wZXJ0aWVzKCk7XG4gICAgICAgIGNvbnN0IF9zaG93RGVsYXkgPSB1c2VTaG93RGVsYXkgPyB0aGlzLnNob3dEZWxheSA6IDA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93VG9vbHRpcCgpXG4gICAgICAgIH0sIF9zaG93RGVsYXkpXG5cblxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHdpbmRvdywgXCJzY3JvbGxcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRUb29sdGlwUG9zaXRpb25Qcm9wZXJ0eSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXV0b0Rlc3Ryb3kgJiYgdGhpcy5kaXNwbGF5VGltZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9LCB0aGlzLmRpc3BsYXlUaW1lKVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dUb29sdGlwKCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLnZpc2libGUgPSB0aGlzLnZpc2libGU7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0VG9vbHRpcFBvc2l0aW9uUHJvcGVydHkoKTtcblxuICAgICAgICAgICAgLy8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5ib3VuZE9uV2luZG93TW91c2VNb3ZlRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRUb29sdGlwUG9zaXRpb25Qcm9wZXJ0eSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW5jaG9yU2l6ZSA9IDU7XG4gICAgICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IHRvb2x0aXBFbGVtZW50UG9zaXRpb24gPSBnZXRFbGVtZW50UG9zaXRpb25JbmZvKHRoaXMudG9vbHRpcERpdkVsZW1lbnQpO1xuICAgICAgICBjb25zdCBlbGVtZW50TGVmdG92ZXIgPSBnZXRFbGVtZW50TGVmdG92ZXJDb250ZW50QXZhaWxhYmxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgZWxlbWVudFRyaWdnZXJQb3NpdGlvbiA9IGdldEVsZW1lbnRQb3NpdGlvbkluZm8odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCBpc1Bvc2l0aW9uSG9yaXpvbnRhbCA9IFtUb29sdGlwUG9zaXRpb24uTGVmdCwgVG9vbHRpcFBvc2l0aW9uLlJpZ2h0XS5pbmNsdWRlcyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VUb0JvcmRlcnMgPSBpc1Bvc2l0aW9uSG9yaXpvbnRhbCA/IHRvb2x0aXBFbGVtZW50UG9zaXRpb24uZWxlbWVudFdpZHRoIDogdG9vbHRpcEVsZW1lbnRQb3NpdGlvbi5lbGVtZW50SG9yaXpvbnRhbENlbnRlcjtcbiAgICAgICAgY29uc3QgY2FuU2V0QXRUb3AgPSBlbGVtZW50TGVmdG92ZXIuZnJlZURpc3RhbmNlVG9Ub3AgPiB0b29sdGlwRWxlbWVudFBvc2l0aW9uLmVsZW1lbnRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGNhblNldEF0TGVmdCA9IGVsZW1lbnRMZWZ0b3Zlci5mcmVlRGlzdGFuY2VUb0xlZnQgPiBkaXN0YW5jZVRvQm9yZGVycztcbiAgICAgICAgY29uc3QgY2FuU2V0QXRSaWdodCA9IGVsZW1lbnRMZWZ0b3Zlci5mcmVlRGlzdGFuY2VUb1JpZ2h0ID4gZGlzdGFuY2VUb0JvcmRlcnM7XG4gICAgICAgIGNvbnN0IGNhblNldEF0Qm90dG9tID0gZWxlbWVudExlZnRvdmVyLmZyZWVEaXN0YW5jZVRvQm90dG9tID4gdG9vbHRpcEVsZW1lbnRQb3NpdGlvbi5lbGVtZW50SGVpZ2h0O1xuICAgICAgICBjb25zdCB0b3BWZXJ0aWNhbCA9IGVsZW1lbnRUcmlnZ2VyUG9zaXRpb24udG9wICsgZWxlbWVudFRyaWdnZXJQb3NpdGlvbi5lbGVtZW50VmVydGljYWxDZW50ZXI7XG4gICAgICAgIGNvbnN0IGNoZWNrVG9wUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FuU2V0QXRUb3AgJiYgY2FuU2V0QXRMZWZ0ICYmIGNhblNldEF0UmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hlY2tCb3R0b21Qb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYW5TZXRBdEJvdHRvbSAmJiBjYW5TZXRBdExlZnQgJiYgY2FuU2V0QXRSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGVja0xlZnRQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYW5TZXRBdExlZnQgJiYgY2FuU2V0QXRUb3AgJiYgY2FuU2V0QXRCb3R0b207XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGVja1JpZ2h0UG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FuU2V0QXRSaWdodCAmJiBjYW5TZXRBdFRvcCAmJiBjYW5TZXRBdEJvdHRvbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNldFRvcFBvc2l0aW9uID0gKCk6IHsgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciB9ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGVmdDogbGVmdCArIChyaWdodCAtIGxlZnQpIC8gMixcbiAgICAgICAgICAgICAgICB0b3A6IGVsZW1lbnRUcmlnZ2VyUG9zaXRpb24udG9wIC0gYW5jaG9yU2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2V0Qm90dG9tUG9zaXRpb24gPSAoKTogeyBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyIH0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0ICsgKHJpZ2h0IC0gbGVmdCkgLyAyLFxuICAgICAgICAgICAgICAgIHRvcDogZWxlbWVudFRyaWdnZXJQb3NpdGlvbi50b3AgKyBlbGVtZW50VHJpZ2dlclBvc2l0aW9uLmVsZW1lbnRIZWlnaHRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXRMZWZ0UG9zaXRpb24gPSAoKTogeyBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyIH0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgICAgIHRvcDogdG9wVmVydGljYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXRSaWdodFBvc2l0aW9uID0gKCk6IHsgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciB9ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGVmdDogcmlnaHQsXG4gICAgICAgICAgICAgICAgdG9wOiB0b3BWZXJ0aWNhbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBwb3M6IFRvb2x0aXBQb3NpdGlvbixcbiAgICAgICAgICAgIGNoZWNrOiAoKSA9PiBib29sZWFuLFxuICAgICAgICAgICAgc2V0OiAoKSA9PiB7IGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25zOiBQb3NpdGlvbltdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBvczogVG9vbHRpcFBvc2l0aW9uLlRvcCxcbiAgICAgICAgICAgICAgICBjaGVjazogY2hlY2tUb3BQb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzZXQ6IHNldFRvcFBvc2l0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBvczogVG9vbHRpcFBvc2l0aW9uLkJvdHRvbSxcbiAgICAgICAgICAgICAgICBjaGVjazogY2hlY2tCb3R0b21Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzZXQ6IHNldEJvdHRvbVBvc2l0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBvczogVG9vbHRpcFBvc2l0aW9uLkxlZnQsXG4gICAgICAgICAgICAgICAgY2hlY2s6IGNoZWNrTGVmdFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNldDogc2V0TGVmdFBvc2l0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBvczogVG9vbHRpcFBvc2l0aW9uLlJpZ2h0LFxuICAgICAgICAgICAgICAgIGNoZWNrOiBjaGVja1JpZ2h0UG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2V0OiBzZXRSaWdodFBvc2l0aW9uXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBwb3NpdGlvbkRlZmluZWQgPSBwb3NpdGlvbnMuZmluZCgocG9zaXRpb24pID0+IHBvc2l0aW9uLnBvcyA9PT0gdGhpcy5wb3NpdGlvbik7XG4gICAgICAgIGxldCB2YWxpZFBvc2l0aW9uOiBQb3NpdGlvbiA9IHBvc2l0aW9uRGVmaW5lZDtcbiAgICAgICAgY29uc3QgY2FuVXNlRGVmaW5lZFBvc2l0aW9uID0gcG9zaXRpb25EZWZpbmVkLmNoZWNrKCk7XG4gICAgICAgIGlmIChjYW5Vc2VEZWZpbmVkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhbGlkUG9zaXRpb24gPSBwb3NpdGlvbkRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNhblVzZURlZmluZWRQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRBbHRlcm5hdGl2ZVBvc2l0aW9uID0gcG9zaXRpb25zLmZpbmQoKHBvc2l0aW9uKSA9PiBwb3NpdGlvbi5jaGVjaygpKTtcbiAgICAgICAgICAgIGlmICh2YWxpZEFsdGVybmF0aXZlUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YWxpZFBvc2l0aW9uID0gdmFsaWRBbHRlcm5hdGl2ZVBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9wb3NpdGlvbiA9IHZhbGlkUG9zaXRpb24uc2V0KCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uTGVmdCA9IF9wb3NpdGlvbi5sZWZ0O1xuICAgICAgICBjb25zdCBwb3NpdGlvblRvcCA9IF9wb3NpdGlvbi50b3A7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmxlZnQgPSBNYXRoLnJvdW5kKHBvc2l0aW9uTGVmdCk7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLnRvcCA9IE1hdGgucm91bmQocG9zaXRpb25Ub3ApO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5wb3NpdGlvbiA9IHZhbGlkUG9zaXRpb24ucG9zO1xuXG4gICAgfVxuICAgIHByaXZhdGUgc2V0VG9vbHRpcENvbXBvbmVudFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UudG9vbHRpcCA9IHRoaXMudG9vbHRpcDtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmVzY2FwZSA9IHRoaXMuZXNjYXBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuY29tcG9uZW50UmVmKSkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy50b29sdGlwRGl2RWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmJvdW5kT25XaW5kb3dNb3VzZU1vdmVGdW5jdGlvbik7XG4gICAgfVxufVxuIl19
@@ -376,7 +376,7 @@ let TooltipComponent = class TooltipComponent {
376
376
  TooltipComponent = __decorate([
377
377
  Component({
378
378
  template: "<div\n id=\"tooltip\"\n class=\"tooltip\"\n [ngClass]=\"['tooltip--' + position]\"\n [class.tooltip--visible]=\"visible\"\n [ngStyle]=\"{\n 'left': left + 'px',\n 'top': top + 'px'\n }\">\n <ng-template\n *ngIf=\"escape;\n then escapeTemplate;\n else noEscapeTemplate\">\n </ng-template> \n</div>\n\n<ng-template #noEscapeTemplate>\n <span\n class=\"tooltip__content\"\n [innerHTML]=\"tooltip\">\n </span>\n</ng-template>\n\n<ng-template #escapeTemplate>\n <span class=\"tooltip__content\">\n {{ tooltip }}\n </span>\n</ng-template>",
379
- styles: [".tooltip{background-color:#000;border-radius:2px;color:#fff;font-family:\"Open Sans\",sans-serif;font-size:14px;font-weight:400;line-height:21px;opacity:0;padding:8px;position:fixed;transform:translateX(-50%);text-align:center;max-width:220px;word-wrap:break-word;z-index:99999}.tooltip--visible{opacity:1;transition:opacity .3s}.tooltip::before{content:\"\";height:0;position:absolute;width:0}.tooltip--bottom{margin-top:5px;transform:translateX(-50%)}.tooltip--bottom::before{border:5px solid transparent;border-bottom:5px solid #000;left:calc(50% - 5px);top:-10px}.tooltip--top{margin-bottom:5px;transform:translate(-50%,-100%)}.tooltip--top::before{border:5px solid transparent;border-top:5px solid #000;left:calc(50% - 5px);bottom:-10px}.tooltip--left{margin-right:28px;transform:translate(calc(-100% - 7px),-50%)}.tooltip--left::before{border:5px solid transparent;border-left:5px solid #000;right:-10px;bottom:calc(50% - 5px)}.tooltip--right{margin-left:7px;transform:translateY(-50%)}.tooltip--right::before{border:5px solid transparent;border-right:5px solid #000;left:-10px;bottom:calc(50% - 5px)}"]
379
+ styles: [".tooltip{background-color:#000;border-radius:2px;color:#fff;font-family:\"Open Sans\",sans-serif;font-size:14px;font-weight:400;line-height:21px;opacity:0;padding:8px;transform:translateX(-50%);text-align:center;max-width:220px;word-wrap:break-word;z-index:99999;position:absolute}.tooltip--visible{opacity:1;transition:opacity .3s}.tooltip::before{content:\"\";height:0;position:absolute;width:0}.tooltip--bottom{margin-top:5px;transform:translateX(-50%)}.tooltip--bottom::before{border:5px solid transparent;border-bottom:5px solid #000;left:calc(50% - 5px);top:-10px}.tooltip--top{margin-bottom:5px;transform:translate(-50%,-100%)}.tooltip--top::before{border:5px solid transparent;border-top:5px solid #000;left:calc(50% - 5px);bottom:-10px}.tooltip--left{margin-right:28px;transform:translate(calc(-100% - 7px),-50%)}.tooltip--left::before{border:5px solid transparent;border-left:5px solid #000;right:-10px;bottom:calc(50% - 5px)}.tooltip--right{margin-left:7px;transform:translateY(-50%)}.tooltip--right::before{border:5px solid transparent;border-right:5px solid #000;left:-10px;bottom:calc(50% - 5px)}"]
380
380
  })
381
381
  ], TooltipComponent);
382
382
 
@@ -463,6 +463,7 @@ var TooltipEvent;
463
463
  })(TooltipEvent || (TooltipEvent = {}));
464
464
 
465
465
  let TooltipDirective = class TooltipDirective {
466
+ // private inputRefHasFocus = false;
466
467
  constructor(elementRef, appRef, componentFactoryResolver, injector, debounceUtils, renderer) {
467
468
  this.elementRef = elementRef;
468
469
  this.appRef = appRef;
@@ -477,8 +478,7 @@ let TooltipDirective = class TooltipDirective {
477
478
  this.visible = true;
478
479
  this.mobileBehavior = MobileBehavior.Pressing;
479
480
  this.componentRef = null;
480
- this.existFocusedInputRefTooltip = false;
481
- this.boundOnWindowMouseMoveFunction = this.onWindowMouseMove.bind(this);
481
+ // this.boundOnWindowMouseMoveFunction = this.onWindowMouseMove.bind(this);
482
482
  this.debounceCreateTooltipFunction = this.debounceUtils.debounceLeading(() => this._createTooltip(true, true));
483
483
  }
484
484
  ngOnInit() {
@@ -488,22 +488,24 @@ let TooltipDirective = class TooltipDirective {
488
488
  ngOnDestroy() {
489
489
  this.destroy();
490
490
  }
491
- onWindowMouseMove(event) {
492
- if (!this.componentRef) {
493
- return;
494
- }
495
- const elementRect = this.elementRef.nativeElement.getBoundingClientRect();
496
- const toolTipRect = this.tooltipDivElement.getBoundingClientRect();
497
- const totalElementArea = {
498
- top: Math.min(elementRect.top, toolTipRect.top),
499
- right: Math.max(elementRect.right, toolTipRect.right),
500
- left: Math.min(elementRect.left, toolTipRect.left),
501
- bottom: Math.max(elementRect.bottom, toolTipRect.bottom),
502
- };
503
- if (isMousePositionOutsideOfElement(event, totalElementArea) && !this.existFocusedInputRefTooltip) {
504
- this.destroy();
505
- }
506
- }
491
+ // private onWindowMouseMove(event: MouseEvent) {
492
+ // if (!this.componentRef) {
493
+ // return;
494
+ // }
495
+ // const elementRect = this.elementRef.nativeElement.getBoundingClientRect();
496
+ // const toolTipRect = this.tooltipDivElement.getBoundingClientRect();
497
+ // const totalElementArea = {
498
+ // top: Math.min(elementRect.top, toolTipRect.top),
499
+ // right: Math.max(elementRect.right, toolTipRect.right),
500
+ // left: Math.min(elementRect.left, toolTipRect.left),
501
+ // bottom: Math.max(elementRect.bottom, toolTipRect.bottom),
502
+ // };
503
+ // const isMouseOutsidePosition = isMousePositionOutsideOfElement(event, totalElementArea);
504
+ // const isHoverEvent = this.tooltipEvent === TooltipEvent.Hover;
505
+ // if (isMouseOutsidePosition && !this.inputRefHasFocus && isHoverEvent) {
506
+ // this.destroy();
507
+ // }
508
+ // }
507
509
  /**
508
510
  * Manipula a visibilidade do tooltip quando houver uma referência de input.
509
511
  */
@@ -513,7 +515,7 @@ let TooltipDirective = class TooltipDirective {
513
515
  const icon = this.getIconFromFocusedInput();
514
516
  this.renderer.listen(inputFocus, "focus", () => {
515
517
  if (icon) {
516
- this.existFocusedInputRefTooltip = true;
518
+ // this.inputRefHasFocus = true;
517
519
  this._createTooltip(false, false);
518
520
  }
519
521
  });
@@ -521,7 +523,7 @@ let TooltipDirective = class TooltipDirective {
521
523
  if (icon) {
522
524
  this.removeTooltip(icon);
523
525
  this.destroy();
524
- this.existFocusedInputRefTooltip = false;
526
+ // this.inputRefHasFocus = false;
525
527
  }
526
528
  });
527
529
  }
@@ -566,7 +568,8 @@ let TooltipDirective = class TooltipDirective {
566
568
  }
567
569
  }
568
570
  onMouseLeave() {
569
- if (this.tooltipEvent === TooltipEvent.Hover && !this.existFocusedInputRefTooltip) {
571
+ // && !this.inputRefHasFocus
572
+ if (this.tooltipEvent === TooltipEvent.Hover) {
570
573
  this.destroy();
571
574
  }
572
575
  }
@@ -628,7 +631,7 @@ let TooltipDirective = class TooltipDirective {
628
631
  if (this.componentRef !== null) {
629
632
  this.componentRef.instance.visible = this.visible;
630
633
  this.setTooltipPositionProperty();
631
- window.addEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
634
+ // window.addEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
632
635
  }
633
636
  }
634
637
  setTooltipPositionProperty() {
@@ -738,7 +741,7 @@ let TooltipDirective = class TooltipDirective {
738
741
  this.componentRef = null;
739
742
  this.tooltipDivElement = null;
740
743
  }
741
- window.removeEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
744
+ // window.removeEventListener("mousemove", this.boundOnWindowMouseMoveFunction);
742
745
  }
743
746
  };
744
747
  TooltipDirective.ctorParameters = () => [
@@ -3834,6 +3837,7 @@ CheckboxModule = __decorate([
3834
3837
  var Languages;
3835
3838
  (function (Languages) {
3836
3839
  Languages["TaxCalculation"] = "TaxCalculation";
3840
+ Languages["Json"] = "Json";
3837
3841
  })(Languages || (Languages = {}));
3838
3842
 
3839
3843
  var Themes;
@@ -4957,6 +4961,70 @@ function TaxCalculation() {
4957
4961
  ]);
4958
4962
  }
4959
4963
 
4964
+ const jsonGrammar = `
4965
+ @top JsonDocument { JsonValue }
4966
+
4967
+ JsonValue {
4968
+ JsonObject |
4969
+ JsonArray |
4970
+ JsonString |
4971
+ JsonNumber |
4972
+ JsonBoolean |
4973
+ JsonNull
4974
+ }
4975
+
4976
+ JsonObject {
4977
+ "{" (JsonPair ("," JsonPair)*)? "}"
4978
+ }
4979
+
4980
+ JsonPair {
4981
+ JsonString ":" JsonValue
4982
+ }
4983
+
4984
+ JsonArray {
4985
+ "[" (JsonValue ("," JsonValue)*)? "]"
4986
+ }
4987
+
4988
+ @tokens {
4989
+ JsonString { '"' (![\\n"])* '"'? }
4990
+ JsonNumber {
4991
+ '-'? std.digit+
4992
+ ('.' std.digit+)?
4993
+ (("e" | "E") ("+" | "-")? std.digit+)?
4994
+ }
4995
+ JsonBoolean { "true" | "false" }
4996
+ JsonNull { "null" }
4997
+ space { $[ \t\n\r]+ }
4998
+ "{" "}"
4999
+ "[" "]"
5000
+ ":" ","
5001
+ }
5002
+
5003
+ @skip { space }
5004
+
5005
+ @detectDelim
5006
+ `;
5007
+ const jsonLanguage = LRLanguage.define({
5008
+ parser: buildParser(jsonGrammar).configure({
5009
+ props: [
5010
+ styleTags({
5011
+ JsonString: tags.string,
5012
+ JsonNumber: tags.number,
5013
+ "JsonBoolean JsonNull": tags.keyword,
5014
+ '"{"': tags.brace,
5015
+ '"}"': tags.brace,
5016
+ '"["': tags.brace,
5017
+ '"]"': tags.brace,
5018
+ '":"': tags.operator,
5019
+ '","': tags.punctuation,
5020
+ }),
5021
+ ],
5022
+ }),
5023
+ });
5024
+ function Json() {
5025
+ return new LanguageSupport(jsonLanguage);
5026
+ }
5027
+
4960
5028
  class EditorLanguages {
4961
5029
  static getLanguage(language) {
4962
5030
  const languageSupportFactory = EditorLanguages._LANGUAGES.get(language);
@@ -4966,7 +5034,8 @@ class EditorLanguages {
4966
5034
  }
4967
5035
  }
4968
5036
  EditorLanguages._LANGUAGES = new Map([
4969
- [Languages.TaxCalculation, TaxCalculation]
5037
+ [Languages.TaxCalculation, TaxCalculation],
5038
+ [Languages.Json, Json]
4970
5039
  ]);
4971
5040
 
4972
5041
  /**
@@ -7347,7 +7416,7 @@ LookupComponent = LookupComponent_1 = __decorate([
7347
7416
  Injectable(),
7348
7417
  Component({
7349
7418
  selector: "s-lookup",
7350
- template: "<div [ngClass]=\"{ inputgroup: showSearch }\">\n <p-autoComplete\n #autocomplete\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [dataKey]=\"dataKey\"\n [multiple]=\"multiple\"\n [inputId]=\"id + '-autocomplete'\"\n [forceSelection]=\"autocompleteForceSelection\"\n [suggestions]=\"getLookupSuggestions()\"\n (completeMethod)=\"lazyLoadLookup($event)\"\n (onSelect)=\"onSelect.next($event)\"\n (onBlur)=\"onBlur.next($event)\"\n (onFocus)=\"onFocus.next($event)\"\n (onUnselect)=\"onUnselect.next($event)\"\n (onClear)=\"onClear.next($event)\"\n (onKeyUp)=\"onKeyUp.next($event)\"\n [field]=\"lookupDisplayField\"\n [emptyMessage]=\"lookupEmptyMessage\"\n [dropdown]=\"!showSearch\"\n [appendTo]=\"lookupAppendTo\"\n [placeholder]=\"placeholder || ' '\"\n [autoHighlight]=\"true\"\n inputStyleClass=\"mousetrap\">\n <ng-template let-item pTemplate=\"selectedItem\">\n <span\n class=\"ui-autocomplete-token-label ng-tns-c65-43 ng-star-inserted\"\n [sTooltip]=\"lookupDisplayFieldTooltip ? item[lookupDisplayField] : null\"\n tooltipPosition=\"top\">\n {{item[lookupDisplayField]}}\n </span>\n </ng-template>\n </p-autoComplete>\n <button\n *ngIf=\"showSearch\"\n pButton\n type=\"button\"\n icon=\"fa fa-search\"\n class=\"button-addon\"\n [disabled]=\"disabled\"\n (click)=\"showDialog()\">\n </button>\n</div>\n<p-dialog\n appendTo=\"body\"\n styleClass=\"s-lookup-modal\"\n [header]=\"searchTitle || 'platform.angular_components.advanced_search' | translate\"\n [(visible)]=\"dialogVisible\"\n [modal]=\"true\"\n (onHide)=\"hideDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n #dialog>\n <div\n *ngIf=\"dialogVisible\"\n class=\"s-lookup-modal-container\">\n <div\n *ngIf=\"searchFields && searchFields.length\"\n class=\"filter\"\n [@collapseContent]=\"collapsed\n ? { value: 'hidden', params: { transitionParams: transitionOptions } }\n : { value: 'visible', params: { transitionParams: transitionOptions } }\"\n (@collapseContent.done)=\"onToggleDone()\">\n <form\n [formGroup]=\"formGroupDialog\"\n novalidate\n autocomplete=\"off\">\n <div\n *ngIf=\"!collapsed\"\n class=\"form-content\"\n [@childCollapseContent]=\"collapsed\n ? { value: ':leave', params: { transitionParams: transitionOptions } }\n : { value: ':enter', params: { transitionParams: transitionOptions } }\">\n <div class=\"filter-title sds-section-title\">\n {{ filterTitle || \"platform.angular_components.filters\" | translate }}\n </div>\n <div class=\"form-fields\">\n <s-dynamic-form\n [fields]=\"searchFields\"\n [form]=\"formGroupDialog\">\n </s-dynamic-form>\n </div>\n <div class=\"ui-g\">\n <div class=\"ui-g-12 no-button-margin\">\n <s-button\n [id]=\"id + '-filter-button'\"\n type=\"submit\"\n [label]=\"filterLabel || 'platform.angular_components.filter' | translate\"\n (onClick)=\"search()\"\n sTooltip=\"(ALT + SHIFT + F)\"\n tooltipPosition=\"top\"\n showDelay=\"500\">\n </s-button>\n <s-button\n [id]=\"id + '-clear-button'\"\n type=\"button\"\n [label]=\"clearLabel || 'platform.angular_components.clear' | translate\"\n (onClick)=\"clear()\"\n priority=\"link\"\n sTooltip=\"(ALT + SHIFT + L)\"\n tooltipPosition=\"top\"\n showDelay=\"500\">\n </s-button>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div\n *ngIf=\"searchFields && searchFields.length\"\n class=\"filter-toggle\">\n <button\n [id]=\"id + '-filter-toggle-button'\"\n type=\"button\"\n (click)=\"filterToggle()\">\n <span\n class=\"fa\"\n [ngClass]=\"{'fa-chevron-left': !collapsed, 'fa-chevron-right': collapsed}\"\n aria-hidden=\"true\">\n </span>\n </button>\n </div>\n <div\n class=\"content\"\n [ngClass]=\"{'empty-content': !searchTotalRecords && !loading}\">\n <s-empty-state\n [id]=\"id + '-empty-state'\"\n *ngIf=\"!searchTotalRecords && !loading\"\n [title]=\"searchEmptyTitle || 'platform.angular_components.no_records_found' | translate\"\n [description]=\"searchEmptyDescription\"\n iconClass=\"fa fa-search\">\n </s-empty-state>\n\n <div class=\"content-child\">\n <p-table\n [dataKey]=\"dataKey\"\n [value]=\"getGridData()\"\n [columns]=\"searchGridFields\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n sortMode=\"multiple\"\n [totalRecords]=\"searchTotalRecords\"\n [rows]=\"10\"\n [selection]=\"selected\"\n (onLazyLoad)=\"lazyLoadGrid($event)\"\n *sLoadingState=\"{ loading: loading, indicator: 'logo' }\"\n [multiSortMeta]=\"multiSortMeta\"\n [attr.data-hidden]=\"!searchTotalRecords && !loading\"\n [selectionMode]=\"multiple ? 'multiple' : 'single'\"\n (selectionChange)=\"onSelectionChange($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"buttons-container no-button-margin\">\n <s-button\n *ngIf=\"showAddOption\"\n priority=\"default\"\n [label]=\"'platform.angular_components.add' | translate\"\n (onClick)=\"onAdd.emit()\">\n </s-button>\n <s-button\n *ngIf=\"showEditOption\"\n priority=\"default\"\n [label]=\"'platform.angular_components.edit' | translate\"\n [disabled]=\"selected.length !== 1\"\n (onClick)=\"onEdit.emit(this.selected[0])\">\n </s-button>\n <s-button\n *ngIf=\"showRemoveOption\"\n priority=\"default\"\n [label]=\"'platform.angular_components.remove' | translate\"\n [disabled]=\"!selected.length\"\n (onClick)=\"onRemove.emit(this.selected)\">\n </s-button>\n </div>\n </ng-template>\n <ng-template pTemplate=\"colgroup\" let-columns>\n <colgroup>\n <col\n *ngIf=\"multiple\"\n style=\"width: 50px\" />\n <col\n *ngFor=\"let col of columns\"\n [style.width]=\"col.width\" />\n </colgroup>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th\n *ngIf=\"multiple\"\n style=\"width: 50px\">\n <s-table-header-checkbox\n [useAllObject]=\"lookupRowProps ? false : true\"\n [rowProps]=\"lookupRowProps\">\n </s-table-header-checkbox>\n </th>\n <th\n [style.width]=\"col.width\"\n *ngFor=\"let col of columns\"\n [pSortableColumn]=\"col.sortableColumnName ? col.sortableColumnName : col.name\"\n [pSortableColumnDisabled]=\"sortableColumnsDisabled?.includes(col.name)\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.label }}</span>\n <p-sortIcon\n [field]=\"col.name\"\n *ngIf=\"!sortableColumnsDisabled?.includes(col.name)\">\n </p-sortIcon>\n </div>\n </th>\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-columns\n let-rowIndex=\"rowIndex\">\n <tr\n sNavigation\n [pSelectableRow]=\"rowData\"\n [pSelectableRowIndex]=\"rowIndex\"\n sDoubleClick (onDoubleClick)=\"onTableRowDoubleClick(rowData)\">\n <td\n *ngIf=\"multiple\"\n style=\"width: 50px\"\n tabindex=\"0\">\n <p-tableCheckbox\n [value]=\"rowData\"\n [pSelectableRow]=\"rowData\">\n </p-tableCheckbox>\n </td>\n <td\n [style.width]=\"col['width']\"\n *ngFor=\"let col of searchGridFields\"\n [ngSwitch]=\"col.type\"\n tabindex=\"0\">\n <ng-container *ngSwitchCase=\"'Boolean'\">\n <ng-container *ngIf=\"isBooleanValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getBooleanLabel(rowData, col.name, col.optionsLabel) }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedDate: col.calendarLocaleOptions?.dateFormat || \"L\" | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateTime'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedDate | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'LocalDateTime'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedDate | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedTime: col.calendarLocaleOptions?.dateFormat || \"LTS\" | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Integer'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getIntegerMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Double'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getDoubleMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Money'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getMoneyMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Number'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getNumberMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Enum'\">\n <ng-container *ngIf=\"getLabelForValue(getFieldValue(rowData, col.name), col.options); else emptyTemplate\">\n <ng-container *ngIf=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options); then withBadge; else withoutBadge\"></ng-container>\n <ng-template #withBadge>\n <s-badge\n [text]=\"getLabelForValue(getFieldValue(rowData, col.name), col.options)\"\n [color]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).color\"\n [type]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).type\"\n [iconClass]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).iconClass\"\n [iconPosition]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).iconPosition\">\n </s-badge>\n </ng-template>\n <ng-template #withoutBadge>\n <span> {{ getLabelForValue(getFieldValue(rowData, col.name), col.options) }} </span>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"col.mask && col.mask()\">\n <ng-container *ngIf=\"(isNumber(rowData, col.name) || getFieldValue(rowData, col.name))\">\n <span>{{ getFieldValue(rowData, col.name) | sMaskFormatter: col.mask() }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!(col.mask && col.mask())\">\n <ng-container *ngIf=\"(isNumber(rowData, col.name) || getFieldValue(rowData, col.name)); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) }}</span>\n </ng-container>\n </ng-container>\n </ng-container>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span [attr.data-hidden]=\"loading\">\n {{ printRecordTotalizer() }}\n </span>\n </ng-template>\n </p-table>\n </div>\n\n </div>\n </div>\n <p-footer>\n <s-button\n [id]=\"id + '-select-button'\"\n type=\"button\"\n [label]=\"selectLabel || 'platform.angular_components.select' | translate\"\n (onClick)=\"select()\"\n sTooltip=\"(ALT + SHIFT + S)\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [disabled]=\"!selected?.length\">\n </s-button>\n <s-button\n [id]=\"id + '-cancel-button'\"\n type=\"button\"\n priority=\"link\"\n [label]=\"cancelLabel || 'platform.angular_components.cancel' | translate\"\n (onClick)=\"hideDialog()\"\n sTooltip=\"(ALT + SHIFT + C)\"\n tooltipPosition=\"top\"\n showDelay=\"500\">\n </s-button>\n </p-footer>\n</p-dialog>\n<ng-template #emptyTemplate>\n <span [ngClass]=\"'sds-empty-value'\">\n {{ emptyFieldLabel || 'platform.angular_components.not_informed' | translate }}\n </span>\n</ng-template>\n",
7419
+ template: "<div [ngClass]=\"{ inputgroup: showSearch }\">\n <p-autoComplete\n #autocomplete\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [dataKey]=\"dataKey\"\n [multiple]=\"multiple\"\n [inputId]=\"id + '-autocomplete'\"\n [forceSelection]=\"autocompleteForceSelection\"\n [suggestions]=\"getLookupSuggestions()\"\n (completeMethod)=\"lazyLoadLookup($event)\"\n (onSelect)=\"onSelect.next($event)\"\n (onBlur)=\"onBlur.next($event)\"\n (onFocus)=\"onFocus.next($event)\"\n (onUnselect)=\"onUnselect.next($event)\"\n (onClear)=\"onClear.next($event)\"\n (onKeyUp)=\"onKeyUp.next($event)\"\n [field]=\"lookupDisplayField\"\n [emptyMessage]=\"lookupEmptyMessage\"\n [dropdown]=\"!showSearch\"\n [appendTo]=\"lookupAppendTo\"\n [placeholder]=\"placeholder || ' '\"\n [autoHighlight]=\"true\"\n inputStyleClass=\"mousetrap\">\n <ng-template let-item pTemplate=\"selectedItem\">\n <span\n class=\"ui-autocomplete-token-label ng-tns-c65-43 ng-star-inserted\"\n [sTooltip]=\"lookupDisplayFieldTooltip ? item[lookupDisplayField] : null\"\n tooltipPosition=\"top\">\n {{item[lookupDisplayField]}}\n </span>\n </ng-template>\n </p-autoComplete>\n <button\n *ngIf=\"showSearch\"\n pButton\n type=\"button\"\n icon=\"fa fa-search\"\n class=\"button-addon\"\n [disabled]=\"disabled\"\n (click)=\"showDialog()\">\n </button>\n</div>\n<p-dialog\n appendTo=\"body\"\n styleClass=\"s-lookup-modal\"\n [header]=\"searchTitle || 'platform.angular_components.advanced_search' | translate\"\n [(visible)]=\"dialogVisible\"\n [modal]=\"true\"\n (onHide)=\"hideDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n #dialog>\n <div\n *ngIf=\"dialogVisible\"\n class=\"s-lookup-modal-container\">\n <div\n *ngIf=\"searchFields && searchFields.length\"\n class=\"filter\"\n [@collapseContent]=\"collapsed\n ? { value: 'hidden', params: { transitionParams: transitionOptions } }\n : { value: 'visible', params: { transitionParams: transitionOptions } }\"\n (@collapseContent.done)=\"onToggleDone()\">\n <form\n [formGroup]=\"formGroupDialog\"\n novalidate\n autocomplete=\"off\">\n <div\n *ngIf=\"!collapsed\"\n class=\"form-content\"\n [@childCollapseContent]=\"collapsed\n ? { value: ':leave', params: { transitionParams: transitionOptions } }\n : { value: ':enter', params: { transitionParams: transitionOptions } }\">\n <div class=\"filter-title sds-section-title\">\n {{ filterTitle || \"platform.angular_components.filters\" | translate }}\n </div>\n <div class=\"form-fields\">\n <s-dynamic-form\n [fields]=\"searchFields\"\n [form]=\"formGroupDialog\">\n </s-dynamic-form>\n </div>\n <div class=\"ui-g\">\n <div class=\"ui-g-12 no-button-margin\">\n <s-button\n [id]=\"id + '-filter-button'\"\n type=\"submit\"\n [label]=\"filterLabel || 'platform.angular_components.filter' | translate\"\n (onClick)=\"search()\"\n sTooltip=\"(ALT + SHIFT + F)\"\n tooltipPosition=\"top\"\n showDelay=\"500\">\n </s-button>\n <s-button\n [id]=\"id + '-clear-button'\"\n type=\"button\"\n [label]=\"clearLabel || 'platform.angular_components.clear' | translate\"\n (onClick)=\"clear()\"\n priority=\"link\"\n sTooltip=\"(ALT + SHIFT + L)\"\n tooltipPosition=\"top\"\n showDelay=\"500\">\n </s-button>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div\n *ngIf=\"searchFields && searchFields.length\"\n class=\"filter-toggle\">\n <button\n [id]=\"id + '-filter-toggle-button'\"\n type=\"button\"\n (click)=\"filterToggle()\">\n <span\n class=\"fa\"\n [ngClass]=\"{'fa-chevron-left': !collapsed, 'fa-chevron-right': collapsed}\"\n aria-hidden=\"true\">\n </span>\n </button>\n </div>\n <div\n class=\"content\"\n [ngClass]=\"{'empty-content': !searchTotalRecords && !loading}\">\n <s-empty-state\n [id]=\"id + '-empty-state'\"\n *ngIf=\"!searchTotalRecords && !loading\"\n [title]=\"searchEmptyTitle || 'platform.angular_components.no_records_found' | translate\"\n [description]=\"searchEmptyDescription\"\n iconClass=\"fa fa-search\">\n </s-empty-state>\n\n <div class=\"content-child\">\n <p-table\n [dataKey]=\"dataKey\"\n [value]=\"getGridData()\"\n [columns]=\"searchGridFields\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n sortMode=\"multiple\"\n [totalRecords]=\"searchTotalRecords\"\n [rows]=\"10\"\n [selection]=\"selected\"\n (onLazyLoad)=\"lazyLoadGrid($event)\"\n *sLoadingState=\"{ loading: loading, indicator: 'logo' }\"\n [multiSortMeta]=\"multiSortMeta\"\n [attr.data-hidden]=\"!searchTotalRecords && !loading\"\n [selectionMode]=\"multiple ? 'multiple' : 'single'\"\n (selectionChange)=\"onSelectionChange($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"buttons-container no-button-margin\">\n <s-button\n *ngIf=\"showAddOption\"\n priority=\"default\"\n [label]=\"'platform.angular_components.add' | translate\"\n (onClick)=\"onAdd.emit()\">\n </s-button>\n <s-button\n *ngIf=\"showEditOption\"\n priority=\"default\"\n [label]=\"'platform.angular_components.edit' | translate\"\n [disabled]=\"selected.length !== 1\"\n (onClick)=\"onEdit.emit(this.selected[0])\">\n </s-button>\n <s-button\n *ngIf=\"showRemoveOption\"\n priority=\"default\"\n [label]=\"'platform.angular_components.remove' | translate\"\n [disabled]=\"!selected.length\"\n (onClick)=\"onRemove.emit(this.selected)\">\n </s-button>\n </div>\n </ng-template>\n <ng-template pTemplate=\"colgroup\" let-columns>\n <colgroup>\n <col\n *ngIf=\"multiple\"\n style=\"width: 50px\" />\n <col\n *ngFor=\"let col of columns\"\n [style.width]=\"col.width\" />\n </colgroup>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th\n *ngIf=\"multiple\"\n style=\"width: 50px\">\n <s-table-header-checkbox\n [useAllObject]=\"lookupRowProps ? false : true\"\n [rowProps]=\"lookupRowProps\">\n </s-table-header-checkbox>\n </th>\n <th\n [style.width]=\"col.width\"\n *ngFor=\"let col of columns\"\n [pSortableColumn]=\"col.sortableColumnName ? col.sortableColumnName : col.name\"\n [pSortableColumnDisabled]=\"sortableColumnsDisabled?.includes(col.name)\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.label }}</span>\n <p-sortIcon\n [field]=\"col.name\"\n *ngIf=\"!sortableColumnsDisabled?.includes(col.name)\">\n </p-sortIcon>\n </div>\n </th>\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-columns\n let-rowIndex=\"rowIndex\">\n <tr\n sNavigation\n [pSelectableRow]=\"rowData\"\n [pSelectableRowIndex]=\"rowIndex\"\n sDoubleClick (onDoubleClick)=\"onTableRowDoubleClick(rowData)\">\n <td\n *ngIf=\"multiple\"\n style=\"width: 50px\"\n tabindex=\"0\">\n <p-tableCheckbox\n [value]=\"rowData\"\n [pSelectableRow]=\"rowData\">\n </p-tableCheckbox>\n </td>\n <td\n [style.width]=\"col['width']\"\n *ngFor=\"let col of searchGridFields\"\n [ngSwitch]=\"col.type\"\n tabindex=\"0\">\n <ng-container *ngSwitchCase=\"'Boolean'\">\n <ng-container *ngIf=\"isBooleanValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getBooleanLabel(rowData, col.name, col.optionsLabel) }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedDate: col.calendarLocaleOptions?.dateFormat || \"L\" | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateTime'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedDate | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'LocalDateTime'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedDate | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <ng-container *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) | localizedTime: col.calendarLocaleOptions?.dateFormat || \"LTS\" | async }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Integer'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getIntegerMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Double'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getDoubleMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Money'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getMoneyMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Number'\">\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span> {{ getFieldValue(rowData, col.name) | localizedBignumber: getNumberMaskConfig(col) | async }} </span>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Enum'\">\n <ng-container *ngIf=\"getLabelForValue(getFieldValue(rowData, col.name), col.options); else emptyTemplate\">\n <ng-container *ngIf=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options); then withBadge; else withoutBadge\"></ng-container>\n <ng-template #withBadge>\n <s-badge\n [text]=\"getLabelForValue(getFieldValue(rowData, col.name), col.options)\"\n [color]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).color\"\n [type]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).type\"\n [iconClass]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).iconClass\"\n [iconPosition]=\"getBadgeFromValue(getFieldValue(rowData, col.name), col.options).iconPosition\">\n </s-badge>\n </ng-template>\n <ng-template #withoutBadge>\n <span> {{ getLabelForValue(getFieldValue(rowData, col.name), col.options) }} </span>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"col.mask && col.mask({ value: rowData })\">\n <ng-container *ngIf=\"(isNumber(rowData, col.name) || getFieldValue(rowData, col.name))\">\n <span>{{ getFieldValue(rowData, col.name) | sMaskFormatter: col.mask({ value: rowData }) }}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!(col.mask && col.mask({ value: rowData }))\">\n <ng-container *ngIf=\"(isNumber(rowData, col.name) || getFieldValue(rowData, col.name)); else emptyTemplate\">\n <span>{{ getFieldValue(rowData, col.name) }}</span>\n </ng-container>\n </ng-container>\n </ng-container>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span [attr.data-hidden]=\"loading\">\n {{ printRecordTotalizer() }}\n </span>\n </ng-template>\n </p-table>\n </div>\n\n </div>\n </div>\n <p-footer>\n <s-button\n [id]=\"id + '-select-button'\"\n type=\"button\"\n [label]=\"selectLabel || 'platform.angular_components.select' | translate\"\n (onClick)=\"select()\"\n sTooltip=\"(ALT + SHIFT + S)\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [disabled]=\"!selected?.length\">\n </s-button>\n <s-button\n [id]=\"id + '-cancel-button'\"\n type=\"button\"\n priority=\"link\"\n [label]=\"cancelLabel || 'platform.angular_components.cancel' | translate\"\n (onClick)=\"hideDialog()\"\n sTooltip=\"(ALT + SHIFT + C)\"\n tooltipPosition=\"top\"\n showDelay=\"500\">\n </s-button>\n </p-footer>\n</p-dialog>\n<ng-template #emptyTemplate>\n <span [ngClass]=\"'sds-empty-value'\">\n {{ emptyFieldLabel || 'platform.angular_components.not_informed' | translate }}\n </span>\n</ng-template>\n",
7351
7420
  providers: [
7352
7421
  {
7353
7422
  provide: NG_VALUE_ACCESSOR,