@firestitch/form 15.0.0 → 17.0.0

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 (131) hide show
  1. package/app/components/form-dialog-actions/form-dialog-actions.component.d.ts +1 -1
  2. package/app/components/form-template/form-template.component.d.ts +1 -1
  3. package/app/components/form-template-outlet/form-template-outlet.component.d.ts +1 -1
  4. package/app/directives/button.directive.d.ts +1 -1
  5. package/app/directives/form/form.directive.d.ts +1 -1
  6. package/app/directives/form-dialog-close.directive.d.ts +1 -1
  7. package/app/directives/validators/compare.directive.d.ts +1 -1
  8. package/app/directives/validators/control.directive.d.ts +1 -1
  9. package/app/directives/validators/daterange.directive.d.ts +1 -1
  10. package/app/directives/validators/email.directive.d.ts +1 -1
  11. package/app/directives/validators/emails.directive.d.ts +1 -1
  12. package/app/directives/validators/function.directive.d.ts +1 -1
  13. package/app/directives/validators/greater-equal.directive.d.ts +1 -1
  14. package/app/directives/validators/greater.directive.d.ts +1 -1
  15. package/app/directives/validators/integer.directive.d.ts +1 -1
  16. package/app/directives/validators/lesser-equal.directive.d.ts +1 -1
  17. package/app/directives/validators/lesser.directive.d.ts +1 -1
  18. package/app/directives/validators/max.directive.d.ts +1 -1
  19. package/app/directives/validators/maxlength.directive.d.ts +1 -1
  20. package/app/directives/validators/min.directive.d.ts +1 -1
  21. package/app/directives/validators/minlength.directive.d.ts +1 -1
  22. package/app/directives/validators/numeric.directive.d.ts +1 -1
  23. package/app/directives/validators/pattern.directive.d.ts +1 -1
  24. package/app/directives/validators/phone.directive.d.ts +1 -1
  25. package/app/directives/validators/required.directive.d.ts +1 -1
  26. package/app/directives/validators/url.directive.d.ts +1 -1
  27. package/app/directives/validators/validate.directive.d.ts +1 -1
  28. package/app/guards/form-deactivate.guard.d.ts +2 -2
  29. package/esm2022/app/components/confirm-unsaved/confirm-unsaved.component.mjs +51 -0
  30. package/esm2022/app/components/form-dialog-actions/form-dialog-actions.component.mjs +79 -0
  31. package/esm2022/app/components/form-template/form-template.component.mjs +34 -0
  32. package/{esm2020 → esm2022}/app/components/form-template/index.mjs +1 -1
  33. package/esm2022/app/components/form-template-outlet/form-template-outlet.component.mjs +32 -0
  34. package/{esm2020 → esm2022}/app/components/form-template-outlet/index.mjs +1 -1
  35. package/esm2022/app/directives/button.directive.mjs +172 -0
  36. package/esm2022/app/directives/form/form.directive.mjs +703 -0
  37. package/esm2022/app/directives/form-dialog-close.directive.mjs +57 -0
  38. package/esm2022/app/directives/form-template.directive.mjs +21 -0
  39. package/{esm2020 → esm2022}/app/directives/submit-button.directive.mjs +4 -4
  40. package/esm2022/app/directives/validators/compare.directive.mjs +48 -0
  41. package/esm2022/app/directives/validators/control.directive.mjs +269 -0
  42. package/esm2022/app/directives/validators/daterange.directive.mjs +42 -0
  43. package/esm2022/app/directives/validators/email.directive.mjs +42 -0
  44. package/esm2022/app/directives/validators/emails.directive.mjs +42 -0
  45. package/esm2022/app/directives/validators/function.directive.mjs +40 -0
  46. package/esm2022/app/directives/validators/greater-equal.directive.mjs +41 -0
  47. package/esm2022/app/directives/validators/greater.directive.mjs +41 -0
  48. package/esm2022/app/directives/validators/integer.directive.mjs +40 -0
  49. package/esm2022/app/directives/validators/lesser-equal.directive.mjs +41 -0
  50. package/esm2022/app/directives/validators/lesser.directive.mjs +41 -0
  51. package/esm2022/app/directives/validators/max.directive.mjs +37 -0
  52. package/esm2022/app/directives/validators/maxlength.directive.mjs +36 -0
  53. package/esm2022/app/directives/validators/min.directive.mjs +37 -0
  54. package/esm2022/app/directives/validators/minlength.directive.mjs +36 -0
  55. package/esm2022/app/directives/validators/no-fs-validators.directive.mjs +53 -0
  56. package/esm2022/app/directives/validators/numeric.directive.mjs +42 -0
  57. package/esm2022/app/directives/validators/pattern.directive.mjs +36 -0
  58. package/esm2022/app/directives/validators/phone.directive.mjs +42 -0
  59. package/esm2022/app/directives/validators/required.directive.mjs +66 -0
  60. package/esm2022/app/directives/validators/url.directive.mjs +43 -0
  61. package/esm2022/app/directives/validators/validate.directive.mjs +42 -0
  62. package/esm2022/app/fs-form.module.mjs +209 -0
  63. package/esm2022/app/guards/form-deactivate.guard.mjs +44 -0
  64. package/{esm2020 → esm2022}/app/helpers/get-active-route.mjs +1 -1
  65. package/esm2022/app/helpers/get-form-errors.mjs +25 -0
  66. package/esm2022/app/services/fsform.service.mjs +94 -0
  67. package/esm2022/app/validators/validators.mjs +93 -0
  68. package/{fesm2020 → fesm2022}/firestitch-form.mjs +383 -319
  69. package/fesm2022/firestitch-form.mjs.map +1 -0
  70. package/package.json +5 -11
  71. package/esm2020/app/components/confirm-unsaved/confirm-unsaved.component.mjs +0 -44
  72. package/esm2020/app/components/form-dialog-actions/form-dialog-actions.component.mjs +0 -75
  73. package/esm2020/app/components/form-template/form-template.component.mjs +0 -31
  74. package/esm2020/app/components/form-template-outlet/form-template-outlet.component.mjs +0 -30
  75. package/esm2020/app/directives/button.directive.mjs +0 -166
  76. package/esm2020/app/directives/form/form.directive.mjs +0 -689
  77. package/esm2020/app/directives/form-dialog-close.directive.mjs +0 -54
  78. package/esm2020/app/directives/form-template.directive.mjs +0 -20
  79. package/esm2020/app/directives/validators/compare.directive.mjs +0 -47
  80. package/esm2020/app/directives/validators/control.directive.mjs +0 -258
  81. package/esm2020/app/directives/validators/daterange.directive.mjs +0 -41
  82. package/esm2020/app/directives/validators/email.directive.mjs +0 -41
  83. package/esm2020/app/directives/validators/emails.directive.mjs +0 -41
  84. package/esm2020/app/directives/validators/function.directive.mjs +0 -41
  85. package/esm2020/app/directives/validators/greater-equal.directive.mjs +0 -40
  86. package/esm2020/app/directives/validators/greater.directive.mjs +0 -40
  87. package/esm2020/app/directives/validators/integer.directive.mjs +0 -39
  88. package/esm2020/app/directives/validators/lesser-equal.directive.mjs +0 -40
  89. package/esm2020/app/directives/validators/lesser.directive.mjs +0 -40
  90. package/esm2020/app/directives/validators/max.directive.mjs +0 -36
  91. package/esm2020/app/directives/validators/maxlength.directive.mjs +0 -35
  92. package/esm2020/app/directives/validators/min.directive.mjs +0 -36
  93. package/esm2020/app/directives/validators/minlength.directive.mjs +0 -35
  94. package/esm2020/app/directives/validators/no-fs-validators.directive.mjs +0 -53
  95. package/esm2020/app/directives/validators/numeric.directive.mjs +0 -41
  96. package/esm2020/app/directives/validators/pattern.directive.mjs +0 -35
  97. package/esm2020/app/directives/validators/phone.directive.mjs +0 -41
  98. package/esm2020/app/directives/validators/required.directive.mjs +0 -69
  99. package/esm2020/app/directives/validators/url.directive.mjs +0 -45
  100. package/esm2020/app/directives/validators/validate.directive.mjs +0 -43
  101. package/esm2020/app/fs-form.module.mjs +0 -209
  102. package/esm2020/app/guards/form-deactivate.guard.mjs +0 -42
  103. package/esm2020/app/helpers/get-form-errors.mjs +0 -25
  104. package/esm2020/app/services/fsform.service.mjs +0 -92
  105. package/esm2020/app/validators/validators.mjs +0 -93
  106. package/fesm2015/firestitch-form.mjs +0 -2579
  107. package/fesm2015/firestitch-form.mjs.map +0 -1
  108. package/fesm2020/firestitch-form.mjs.map +0 -1
  109. /package/{esm2020 → esm2022}/app/components/confirm-unsaved/index.mjs +0 -0
  110. /package/{esm2020 → esm2022}/app/components/form-dialog-actions/index.mjs +0 -0
  111. /package/{esm2020 → esm2022}/app/components/index.mjs +0 -0
  112. /package/{esm2020 → esm2022}/app/consts/error-messages.const.mjs +0 -0
  113. /package/{esm2020 → esm2022}/app/directives/form/index.mjs +0 -0
  114. /package/{esm2020 → esm2022}/app/directives/index.mjs +0 -0
  115. /package/{esm2020 → esm2022}/app/directives/validators/index.mjs +0 -0
  116. /package/{esm2020 → esm2022}/app/enums/confirm-result.mjs +0 -0
  117. /package/{esm2020 → esm2022}/app/enums/form-status.mjs +0 -0
  118. /package/{esm2020 → esm2022}/app/enums/index.mjs +0 -0
  119. /package/{esm2020 → esm2022}/app/helpers/confirm-result-continue.mjs +0 -0
  120. /package/{esm2020 → esm2022}/app/helpers/index.mjs +0 -0
  121. /package/{esm2020 → esm2022}/app/helpers/is-enabled.mjs +0 -0
  122. /package/{esm2020 → esm2022}/app/interfaces/async-validator.mjs +0 -0
  123. /package/{esm2020 → esm2022}/app/interfaces/confirm-config.mjs +0 -0
  124. /package/{esm2020 → esm2022}/app/interfaces/confirm-tab-group.mjs +0 -0
  125. /package/{esm2020 → esm2022}/app/interfaces/index.mjs +0 -0
  126. /package/{esm2020 → esm2022}/app/interfaces/submit-event.mjs +0 -0
  127. /package/{esm2020 → esm2022}/app/interfaces/submitted-event.mjs +0 -0
  128. /package/{esm2020 → esm2022}/app/interfaces/validator.mjs +0 -0
  129. /package/{esm2020 → esm2022}/app/providers/validate-messages.provider.mjs +0 -0
  130. /package/{esm2020 → esm2022}/firestitch-form.mjs +0 -0
  131. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
@@ -0,0 +1,172 @@
1
+ import { ChangeDetectorRef, Directive, ElementRef, Host, HostBinding, Input, Optional, } from '@angular/core';
2
+ import { MatButton } from '@angular/material/button';
3
+ import { fromEvent, Subject } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import { FsFormDirective } from './form/form.directive';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/button";
8
+ import * as i2 from "./form/form.directive";
9
+ export class FsButtonDirective {
10
+ _matButton;
11
+ _form;
12
+ _elementRef;
13
+ _cdRef;
14
+ name;
15
+ dirtySubmit = true;
16
+ form;
17
+ transitionStyle = null;
18
+ active = false;
19
+ submit = false;
20
+ _previousDisabled = false;
21
+ _destroy$ = new Subject();
22
+ constructor(_matButton, _form, _elementRef, _cdRef) {
23
+ this._matButton = _matButton;
24
+ this._form = _form;
25
+ this._elementRef = _elementRef;
26
+ this._cdRef = _cdRef;
27
+ }
28
+ ngOnInit() {
29
+ this.submit = this._elementRef.nativeElement.getAttribute('type') === 'submit';
30
+ this.form = this.form || this._form;
31
+ if (this.form) {
32
+ this.form.addButton(this);
33
+ if (this.submit) {
34
+ fromEvent(this.element, 'click')
35
+ .pipe(takeUntil(this._destroy$))
36
+ .subscribe(() => {
37
+ this.active = true;
38
+ });
39
+ if (this.dirtySubmit) {
40
+ if (this.form.dirtySubmitButton) {
41
+ if (!this.form.ngForm.dirty) {
42
+ this.disable();
43
+ }
44
+ }
45
+ }
46
+ this.transitionStyle = 'none';
47
+ setTimeout(() => {
48
+ this.transitionStyle = null;
49
+ }, 500);
50
+ }
51
+ }
52
+ }
53
+ disable() {
54
+ if (this._matButton && !this.active) {
55
+ this._previousDisabled = this._matButton.disabled;
56
+ this._matButton.disabled = true;
57
+ this._cdRef.markForCheck();
58
+ }
59
+ }
60
+ enable() {
61
+ if (this._matButton) {
62
+ this._matButton.disabled = false;
63
+ this._matButton.disableRipple = true;
64
+ this._cdRef.markForCheck();
65
+ }
66
+ }
67
+ process() {
68
+ this.setClass('process');
69
+ if (this._matButton) {
70
+ this._matButton.disableRipple = true;
71
+ }
72
+ }
73
+ success() {
74
+ this.setClass('success');
75
+ if (this._matButton) {
76
+ this._matButton.disableRipple = false;
77
+ }
78
+ }
79
+ error() {
80
+ this.setClass('error');
81
+ if (this._matButton) {
82
+ this._matButton.disableRipple = false;
83
+ }
84
+ }
85
+ setClass(cls) {
86
+ const svg = this._getSvg(cls);
87
+ this._resetClass();
88
+ this._disableShadowAnimation();
89
+ this.element.classList.add(`submit-${cls}`);
90
+ this.element.append(svg);
91
+ }
92
+ get element() {
93
+ return this._elementRef.nativeElement;
94
+ }
95
+ resetActive() {
96
+ this.active = false;
97
+ }
98
+ reset() {
99
+ if (!this._previousDisabled) {
100
+ this.enable();
101
+ }
102
+ this.element.querySelectorAll('.svg-icon')
103
+ .forEach((el) => {
104
+ el.remove();
105
+ });
106
+ if (this._matButton) {
107
+ this._matButton.disableRipple = false;
108
+ }
109
+ this._resetClass();
110
+ }
111
+ ngOnDestroy() {
112
+ this._destroy$.next(null);
113
+ this._destroy$.complete();
114
+ this.form?.removeButton(this);
115
+ }
116
+ _disableShadowAnimation() {
117
+ // .mat-elevation-z2 removes the click shadow animation
118
+ //this.element.classList.add('mat-elevation-z2');
119
+ }
120
+ _resetClass() {
121
+ this.element.classList.remove('submit-success', 'submit-error', 'submit-process', 'mat-elevation-z2');
122
+ }
123
+ _getSvg(type) {
124
+ if (type === 'success') {
125
+ return new DOMParser().parseFromString(`<svg class="svg-icon svg-icon-success" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 38 38" style="enable-background:new 0 0 38 38;" xml:space="preserve" width="38px" height="38px">
126
+ <g>
127
+ <g class="check">
128
+ <g>
129
+ <path d="M29.6,11.9c-0.5-0.5-1.3-0.5-1.8,0L16.3,23.4l-6.1-6.1c-0.5-0.5-1.3-0.5-1.8,0s-0.5,1.3,0,1.8l7,7c0.3,0.3,0.6,0.4,0.9,0.4s0.7-0.1,0.9-0.4l12.4-12.4C30.1,13.2,30.1,12.4,29.6,11.9z"/>
130
+ </g>
131
+ </g>
132
+ </g>
133
+ </svg>`, 'text/xml').firstChild;
134
+ }
135
+ if (type === 'process') {
136
+ return new DOMParser().parseFromString(`<svg class="svg-icon svg-icon-process" width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg">
137
+ <g fill="none" fill-rule="evenodd">
138
+ <g transform="translate(1 1)" stroke-width="2"><circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
139
+ <path d="M36 18c0-9.94-8.06-18-18-18"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur=".7s" repeatCount="indefinite"/></path>
140
+ </g>
141
+ </g>
142
+ </svg>`, 'text/xml').firstChild;
143
+ }
144
+ if (type === 'error') {
145
+ return new DOMParser().parseFromString('<svg class="svg-icon svg-icon-error" xmlns="http://www.w3.org/2000/svg" width="38px" height="38px" viewBox="0 0 16 16"><g><path d="M8 1c3.9 0 7 3.1 7 7s-3.1 7-7 7-7-3.1-7-7 3.1-7 7-7zM8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8v0z" data-original="#444444" data-old_color="#444444"/><path d="M12.2 10.8l-2.8-2.8 2.8-2.8-1.4-1.4-2.8 2.8-2.8-2.8-1.4 1.4 2.8 2.8-2.8 2.8 1.4 1.4 2.8-2.8 2.8 2.8z"/></g> </svg>', 'text/xml').firstChild;
146
+ }
147
+ }
148
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FsButtonDirective, deps: [{ token: i1.MatButton, host: true, optional: true }, { token: i2.FsFormDirective, optional: true }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
149
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: { name: "name", dirtySubmit: "dirtySubmit", form: "form" }, host: { properties: { "style.transition": "this.transitionStyle" } }, ngImport: i0 });
150
+ }
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FsButtonDirective, decorators: [{
152
+ type: Directive,
153
+ args: [{
154
+ selector: '[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])',
155
+ }]
156
+ }], ctorParameters: () => [{ type: i1.MatButton, decorators: [{
157
+ type: Optional
158
+ }, {
159
+ type: Host
160
+ }] }, { type: i2.FsFormDirective, decorators: [{
161
+ type: Optional
162
+ }] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { name: [{
163
+ type: Input
164
+ }], dirtySubmit: [{
165
+ type: Input
166
+ }], form: [{
167
+ type: Input
168
+ }], transitionStyle: [{
169
+ type: HostBinding,
170
+ args: ['style.transition']
171
+ }] } });
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvZGlyZWN0aXZlcy9idXR0b24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFxQixRQUFRLEdBQ2hHLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBTXhELE1BQU0sT0FBTyxpQkFBaUI7SUFxQkU7SUFDUjtJQUNaO0lBQ0E7SUFyQkgsSUFBSSxDQUFDO0lBR0wsV0FBVyxHQUFHLElBQUksQ0FBQztJQUduQixJQUFJLENBQWtCO0lBR3RCLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFFdkIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZCxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFbEMsWUFDOEIsVUFBcUIsRUFDN0IsS0FBc0IsRUFDbEMsV0FBdUIsRUFDdkIsTUFBeUI7UUFITCxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQzdCLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQW1CO0lBQ2hDLENBQUM7SUFFRyxRQUFRO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFD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LE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRU8sT0FBTyxDQUFDLElBQUk7UUFDbEIsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQzs7Ozs7Ozs7YUFRaEMsRUFBRSxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUM7Ozs7OzthQU1oQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDckIsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQyw4WkFBOFosRUFBRSxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDaGUsQ0FBQztJQUNILENBQUM7d0dBektVLGlCQUFpQjs0RkFBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUg3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpTUFBaU07aUJBQzVNOzswQkFzQkksUUFBUTs7MEJBQUksSUFBSTs7MEJBQ2hCLFFBQVE7a0dBbkJKLElBQUk7c0JBRFYsS0FBSztnQkFJQyxXQUFXO3NCQURqQixLQUFLO2dCQUlDLElBQUk7c0JBRFYsS0FBSztnQkFJQyxlQUFlO3NCQURyQixXQUFXO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3QsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcblxuXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRnNGb3JtRGlyZWN0aXZlIH0gZnJvbSAnLi9mb3JtL2Zvcm0uZGlyZWN0aXZlJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbWF0LXJhaXNlZC1idXR0b25dOm5vdChbZnNGb3JtQnV0dG9uU3RhbmRhbG9uZV0pLFttYXQtYnV0dG9uXTpub3QoW2ZzRm9ybUJ1dHRvblN0YW5kYWxvbmVdKSxbbWF0LWZsYXQtYnV0dG9uXTpub3QoW2ZzRm9ybUJ1dHRvblN0YW5kYWxvbmVdKSxbbWF0LXN0cm9rZWQtYnV0dG9uXTpub3QoW2ZzRm9ybUJ1dHRvblN0YW5kYWxvbmVdKScsXG59KVxuZXhwb3J0IGNsYXNzIEZzQnV0dG9uRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBuYW1lO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkaXJ0eVN1Ym1pdCA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZvcm06IEZzRm9ybURpcmVjdGl2ZTtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnRyYW5zaXRpb24nKVxuICBwdWJsaWMgdHJhbnNpdGlvblN0eWxlID0gbnVsbDtcblxuICBwdWJsaWMgYWN0aXZlID0gZmFsc2U7XG4gIHB1YmxpYyBzdWJtaXQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9wcmV2aW91c0Rpc2FibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASG9zdCgpIHByaXZhdGUgX21hdEJ1dHRvbjogTWF0QnV0dG9uLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2Zvcm06IEZzRm9ybURpcmVjdGl2ZSxcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN1Ym1pdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ3N1Ym1pdCc7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtIHx8IHRoaXMuX2Zvcm07XG5cbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLmZvcm0uYWRkQnV0dG9uKHRoaXMpO1xuXG4gICAgICBpZih0aGlzLnN1Ym1pdCkge1xuICAgICAgICBmcm9tRXZlbnQodGhpcy5lbGVtZW50LCAnY2xpY2snKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlydHlTdWJtaXQpIHtcbiAgICAgICAgICBpZiAodGhpcy5mb3JtLmRpcnR5U3VibWl0QnV0dG9uKSB7XG4gICAgICAgICAgICBpZighdGhpcy5mb3JtLm5nRm9ybS5kaXJ0eSkge1xuICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYW5zaXRpb25TdHlsZSA9ICdub25lJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uU3R5bGUgPSBudWxsO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCkgeyAgICBcbiAgICBpZiAodGhpcy5fbWF0QnV0dG9uICYmICF0aGlzLmFjdGl2ZSkge1xuICAgICAgdGhpcy5fcHJldmlvdXNEaXNhYmxlZCA9IHRoaXMuX21hdEJ1dHRvbi5kaXNhYmxlZDtcbiAgICAgIHRoaXMuX21hdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTsgXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVuYWJsZSgpIHtcbiAgICBpZiAodGhpcy5fbWF0QnV0dG9uKSB7XG4gICAgICB0aGlzLl9tYXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX21hdEJ1dHRvbi5kaXNhYmxlUmlwcGxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIHRoaXMuc2V0Q2xhc3MoJ3Byb2Nlc3MnKTtcbiAgICBpZiAodGhpcy5fbWF0QnV0dG9uKSB7XG4gICAgICB0aGlzLl9tYXRCdXR0b24uZGlzYWJsZVJpcHBsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN1Y2Nlc3MoKSB7XG4gICAgdGhpcy5zZXRDbGFzcygnc3VjY2VzcycpO1xuICAgIGlmICh0aGlzLl9tYXRCdXR0b24pIHtcbiAgICAgIHRoaXMuX21hdEJ1dHRvbi5kaXNhYmxlUmlwcGxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVycm9yKCkge1xuICAgIHRoaXMuc2V0Q2xhc3MoJ2Vycm9yJyk7XG4gICAgaWYgKHRoaXMuX21hdEJ1dHRvbikge1xuICAgICAgdGhpcy5fbWF0QnV0dG9uLmRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xhc3MoY2xzKSB7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5fZ2V0U3ZnKGNscyk7XG4gICAgdGhpcy5fcmVzZXRDbGFzcygpO1xuICAgIHRoaXMuX2Rpc2FibGVTaGFkb3dBbmltYXRpb24oKTtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChgc3VibWl0LSR7Y2xzfWApO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmQoc3ZnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIHJlc2V0QWN0aXZlKCkge1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgaWYoIXRoaXMuX3ByZXZpb3VzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdmctaWNvbicpXG4gICAgICAuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9tYXRCdXR0b24pIHtcbiAgICAgIHRoaXMuX21hdEJ1dHRvbi5kaXNhYmxlUmlwcGxlID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3Jlc2V0Q2xhc3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mb3JtPy5yZW1vdmVCdXR0b24odGhpcyk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlU2hhZG93QW5pbWF0aW9uKCkge1xuICAgIC8vIC5tYXQtZWxldmF0aW9uLXoyIHJlbW92ZXMgdGhlIGNsaWNrIHNoYWRvdyBhbmltYXRpb25cbiAgICAvL3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXQtZWxldmF0aW9uLXoyJyk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldENsYXNzKCkge1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzdWJtaXQtc3VjY2VzcycsICdzdWJtaXQtZXJyb3InLCAnc3VibWl0LXByb2Nlc3MnLCAnbWF0LWVsZXZhdGlvbi16MicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3ZnKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhgPHN2ZyBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLXN1Y2Nlc3NcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmVyc2lvbj1cIjEuMVwiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAzOCAzOFwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzOCAzODtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIHdpZHRoPVwiMzhweFwiIGhlaWdodD1cIjM4cHhcIj5cbiAgICAgIDxnPlxuICAgICAgICA8ZyBjbGFzcz1cImNoZWNrXCI+XG4gICAgICAgICAgPGc+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTI5LjYsMTEuOWMtMC41LTAuNS0xLjMtMC41LTEuOCwwTDE2LjMsMjMuNGwtNi4xLTYuMWMtMC41LTAuNS0xLjMtMC41LTEuOCwwcy0wLjUsMS4zLDAsMS44bDcsN2MwLjMsMC4zLDAuNiwwLjQsMC45LDAuNHMwLjctMC4xLDAuOS0wLjRsMTIuNC0xMi40QzMwLjEsMTMuMiwzMC4xLDEyLjQsMjkuNiwxMS45elwiLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPmAsICd0ZXh0L3htbCcpLmZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdwcm9jZXNzJykge1xuICAgICAgcmV0dXJuIG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoYDxzdmcgY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi1wcm9jZXNzXCIgd2lkdGg9XCIzOFwiIGhlaWdodD1cIjM4XCIgdmlld0JveD1cIjAgMCAzOCAzOFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgIDxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICA8ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMSAxKVwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIHN0cm9rZS1vcGFjaXR5PVwiLjVcIiBjeD1cIjE4XCIgY3k9XCIxOFwiIHI9XCIxOFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTM2IDE4YzAtOS45NC04LjA2LTE4LTE4LTE4XCI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT1cInRyYW5zZm9ybVwiIHR5cGU9XCJyb3RhdGVcIiBmcm9tPVwiMCAxOCAxOFwiIHRvPVwiMzYwIDE4IDE4XCIgZHVyPVwiLjdzXCIgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCIvPjwvcGF0aD5cbiAgICAgICAgPC9nPlxuICAgICAgPC9nPlxuICAgICAgPC9zdmc+YCwgJ3RleHQveG1sJykuZmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgcmV0dXJuIG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoJzxzdmcgY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi1lcnJvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjM4cHhcIiBoZWlnaHQ9XCIzOHB4XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxnPjxwYXRoIGQ9XCJNOCAxYzMuOSAwIDcgMy4xIDcgN3MtMy4xIDctNyA3LTctMy4xLTctNyAzLjEtNyA3LTd6TTggMGMtNC40IDAtOCAzLjYtOCA4czMuNiA4IDggOCA4LTMuNiA4LTgtMy42LTgtOC04djB6XCIgZGF0YS1vcmlnaW5hbD1cIiM0NDQ0NDRcIiBkYXRhLW9sZF9jb2xvcj1cIiM0NDQ0NDRcIi8+PHBhdGggZD1cIk0xMi4yIDEwLjhsLTIuOC0yLjggMi44LTIuOC0xLjQtMS40LTIuOCAyLjgtMi44LTIuOC0xLjQgMS40IDIuOCAyLjgtMi44IDIuOCAxLjQgMS40IDIuOC0yLjggMi44IDIuOHpcIi8+PC9nPiA8L3N2Zz4nLCAndGV4dC94bWwnKS5maXJzdENoaWxkO1xuICAgIH1cbiAgfVxufVxuIl19