@bpost/bp-address-auto-complete-by-component 1.1.0 → 1.1.3

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 (165) hide show
  1. package/VERSION.md +36 -0
  2. package/bpost-bp-address-auto-complete-by-component.d.ts +1 -11
  3. package/esm2020/bpost-bp-address-auto-complete-by-component.mjs +5 -0
  4. package/esm2020/lib/box-number/box-number.component.mjs +800 -0
  5. package/esm2020/lib/enum/address-level.enum.mjs +8 -0
  6. package/esm2020/lib/enum/index.mjs +7 -0
  7. package/esm2020/lib/enum/input-name.enum.mjs +8 -0
  8. package/esm2020/lib/enum/source-type.enum.mjs +5 -0
  9. package/esm2020/lib/enum/suggestion-level-type.enum.mjs +8 -0
  10. package/esm2020/lib/enum/validation-message-option-type.enum.mjs +6 -0
  11. package/esm2020/lib/enum/validation-message-type.enum.mjs +7 -0
  12. package/esm2020/lib/lib-address-autocomplete-by-component.component.mjs +1233 -0
  13. package/esm2020/lib/lib-address-autocomplete-by-component.module.mjs +65 -0
  14. package/esm2020/lib/lib-address-autocomplete-by-component.service.mjs +14 -0
  15. package/esm2020/lib/locality/locality.component.mjs +747 -0
  16. package/{esm2015/lib/model/Locality.js → esm2020/lib/model/Box.mjs} +2 -2
  17. package/esm2020/lib/model/Locality.mjs +30 -0
  18. package/esm2020/lib/model/Street.mjs +30 -0
  19. package/esm2020/lib/model/query-parameters.model.mjs +21 -0
  20. package/esm2020/lib/services/adress.service.mjs +64 -0
  21. package/esm2020/lib/services/http.service.mjs +57 -0
  22. package/esm2020/lib/services/locale.service.mjs +37 -0
  23. package/esm2020/lib/services/nis9.service.mjs +26 -0
  24. package/esm2020/lib/services/unicode.service.mjs +376 -0
  25. package/esm2020/lib/street/street.component.mjs +725 -0
  26. package/esm2020/lib/street-number/street-number.component.mjs +891 -0
  27. package/esm2020/lib/utils/constants.mjs +2 -0
  28. package/esm2020/lib/utils/domhandler.mjs +47 -0
  29. package/esm2020/lib/utils/highlight-suggestion.pipe.mjs +62 -0
  30. package/{esm5/lib/utils/prefill-data.js → esm2020/lib/utils/prefill-data.mjs} +5 -7
  31. package/esm2020/lib/utils/prefilled-parameters.mjs +23 -0
  32. package/esm2020/lib/utils/preflll.event.mjs +7 -0
  33. package/esm2020/lib/utils/visible-suggestion.directive.mjs +39 -0
  34. package/esm2020/public-api.mjs +9 -0
  35. package/fesm2015/{bpost-bp-address-auto-complete-by-component.js → bpost-bp-address-auto-complete-by-component.mjs} +862 -787
  36. package/fesm2015/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  37. package/{fesm5/bpost-bp-address-auto-complete-by-component.js → fesm2020/bpost-bp-address-auto-complete-by-component.mjs} +1795 -1925
  38. package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  39. package/lib/box-number/box-number.component.d.ts +6 -0
  40. package/lib/enum/index.d.ts +3 -0
  41. package/lib/enum/suggestion-level-type.enum.d.ts +5 -0
  42. package/lib/lib-address-autocomplete-by-component.component.d.ts +14 -0
  43. package/lib/lib-address-autocomplete-by-component.module.d.ts +15 -0
  44. package/lib/lib-address-autocomplete-by-component.service.d.ts +3 -0
  45. package/lib/locality/locality.component.d.ts +3 -0
  46. package/lib/services/adress.service.d.ts +3 -0
  47. package/lib/services/http.service.d.ts +5 -0
  48. package/lib/services/locale.service.d.ts +3 -0
  49. package/lib/services/nis9.service.d.ts +3 -0
  50. package/lib/services/unicode.service.d.ts +3 -0
  51. package/lib/street/street.component.d.ts +3 -0
  52. package/lib/street-number/street-number.component.d.ts +6 -1
  53. package/lib/utils/constants.d.ts +1 -0
  54. package/lib/utils/highlight-suggestion.pipe.d.ts +3 -0
  55. package/lib/utils/visible-suggestion.directive.d.ts +3 -0
  56. package/package.json +23 -13
  57. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/.editorconfig +0 -0
  58. package/tutorial/tutorial/aacwidget-tutorial/README.md +27 -0
  59. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/angular.json +0 -0
  60. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/browserslist +0 -0
  61. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/protractor.conf.js +0 -0
  62. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/src/app.e2e-spec.ts +0 -0
  63. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/src/app.po.ts +0 -0
  64. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/tsconfig.json +0 -0
  65. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/karma.conf.js +0 -0
  66. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/package-lock.json +0 -0
  67. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/package.json +0 -0
  68. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app-routing.module.ts +0 -0
  69. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.html +0 -0
  70. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.scss +0 -0
  71. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.spec.ts +0 -0
  72. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.ts +0 -0
  73. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.module.ts +0 -0
  74. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.html +0 -0
  75. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.scss +0 -0
  76. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.ts +0 -0
  77. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.html +0 -0
  78. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.scss +0 -0
  79. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.spec.ts +0 -0
  80. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.ts +0 -0
  81. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/.gitkeep +0 -0
  82. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/de.json +0 -0
  83. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/en.json +0 -0
  84. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/fr.json +0 -0
  85. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/nl.json +0 -0
  86. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/scss/aacwidget-custom.scss +0 -0
  87. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/scss/aacwidget-default.scss +0 -0
  88. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/environments/environment.prod.ts +0 -0
  89. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/environments/environment.ts +0 -0
  90. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/favicon.ico +0 -0
  91. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/index.html +0 -0
  92. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/main.ts +0 -0
  93. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/polyfills.ts +0 -0
  94. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/styles.scss +0 -0
  95. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/test.ts +0 -0
  96. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.app.json +0 -0
  97. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.json +0 -0
  98. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.spec.json +0 -0
  99. package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tslint.json +0 -0
  100. package/tutorial/{tutorial-videos.txt → tutorial/tutorial-videos.txt} +0 -0
  101. package/bpost-bp-address-auto-complete-by-component.metadata.json +0 -1
  102. package/bundles/bpost-bp-address-auto-complete-by-component.umd.js +0 -5638
  103. package/bundles/bpost-bp-address-auto-complete-by-component.umd.js.map +0 -1
  104. package/bundles/bpost-bp-address-auto-complete-by-component.umd.min.js +0 -16
  105. package/bundles/bpost-bp-address-auto-complete-by-component.umd.min.js.map +0 -1
  106. package/esm2015/bpost-bp-address-auto-complete-by-component.js +0 -16
  107. package/esm2015/lib/box-number/box-number.component.js +0 -811
  108. package/esm2015/lib/enum/address-level.enum.js +0 -8
  109. package/esm2015/lib/enum/index.js +0 -4
  110. package/esm2015/lib/enum/input-name.enum.js +0 -8
  111. package/esm2015/lib/enum/source-type.enum.js +0 -5
  112. package/esm2015/lib/enum/validation-message-option-type.enum.js +0 -6
  113. package/esm2015/lib/enum/validation-message-type.enum.js +0 -7
  114. package/esm2015/lib/lib-address-autocomplete-by-component.component.js +0 -1116
  115. package/esm2015/lib/lib-address-autocomplete-by-component.module.js +0 -42
  116. package/esm2015/lib/lib-address-autocomplete-by-component.service.js +0 -14
  117. package/esm2015/lib/locality/locality.component.js +0 -769
  118. package/esm2015/lib/model/Box.js +0 -30
  119. package/esm2015/lib/model/Street.js +0 -30
  120. package/esm2015/lib/model/query-parameters.model.js +0 -21
  121. package/esm2015/lib/services/adress.service.js +0 -68
  122. package/esm2015/lib/services/http.service.js +0 -53
  123. package/esm2015/lib/services/locale.service.js +0 -39
  124. package/esm2015/lib/services/nis9.service.js +0 -30
  125. package/esm2015/lib/services/unicode.service.js +0 -376
  126. package/esm2015/lib/street/street.component.js +0 -749
  127. package/esm2015/lib/street-number/street-number.component.js +0 -900
  128. package/esm2015/lib/utils/domhandler.js +0 -47
  129. package/esm2015/lib/utils/highlight-suggestion.pipe.js +0 -63
  130. package/esm2015/lib/utils/prefill-data.js +0 -24
  131. package/esm2015/lib/utils/prefilled-parameters.js +0 -23
  132. package/esm2015/lib/utils/preflll.event.js +0 -7
  133. package/esm2015/lib/utils/visible-suggestion.directive.js +0 -42
  134. package/esm2015/public-api.js +0 -9
  135. package/esm5/bpost-bp-address-auto-complete-by-component.js +0 -16
  136. package/esm5/lib/box-number/box-number.component.js +0 -831
  137. package/esm5/lib/enum/address-level.enum.js +0 -8
  138. package/esm5/lib/enum/index.js +0 -4
  139. package/esm5/lib/enum/input-name.enum.js +0 -8
  140. package/esm5/lib/enum/source-type.enum.js +0 -5
  141. package/esm5/lib/enum/validation-message-option-type.enum.js +0 -6
  142. package/esm5/lib/enum/validation-message-type.enum.js +0 -7
  143. package/esm5/lib/lib-address-autocomplete-by-component.component.js +0 -1132
  144. package/esm5/lib/lib-address-autocomplete-by-component.module.js +0 -45
  145. package/esm5/lib/lib-address-autocomplete-by-component.service.js +0 -16
  146. package/esm5/lib/locality/locality.component.js +0 -825
  147. package/esm5/lib/model/Box.js +0 -35
  148. package/esm5/lib/model/Locality.js +0 -35
  149. package/esm5/lib/model/Street.js +0 -35
  150. package/esm5/lib/model/query-parameters.model.js +0 -23
  151. package/esm5/lib/services/adress.service.js +0 -72
  152. package/esm5/lib/services/http.service.js +0 -55
  153. package/esm5/lib/services/locale.service.js +0 -40
  154. package/esm5/lib/services/nis9.service.js +0 -31
  155. package/esm5/lib/services/unicode.service.js +0 -379
  156. package/esm5/lib/street/street.component.js +0 -794
  157. package/esm5/lib/street-number/street-number.component.js +0 -920
  158. package/esm5/lib/utils/domhandler.js +0 -51
  159. package/esm5/lib/utils/highlight-suggestion.pipe.js +0 -75
  160. package/esm5/lib/utils/prefilled-parameters.js +0 -25
  161. package/esm5/lib/utils/preflll.event.js +0 -9
  162. package/esm5/lib/utils/visible-suggestion.directive.js +0 -43
  163. package/esm5/public-api.js +0 -9
  164. package/fesm2015/bpost-bp-address-auto-complete-by-component.js.map +0 -1
  165. package/fesm5/bpost-bp-address-auto-complete-by-component.js.map +0 -1
@@ -1,831 +0,0 @@
1
- import { __assign, __decorate, __values } from "tslib";
2
- import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
3
- import { ValidationMessageType } from '../enum/validation-message-type.enum';
4
- import { AddressService } from '../services/adress.service';
5
- import { LocaleService } from '../services/locale.service';
6
- import { TranslateService } from '@ngx-translate/core';
7
- import { UnicodeService } from '../services/unicode.service';
8
- import { DomHandler } from '../utils/domhandler';
9
- import { ADDRESSLEVEL } from '../enum/address-level.enum';
10
- import { QueryParameters } from '../model/query-parameters.model';
11
- import { SourceType } from '../enum/source-type.enum';
12
- import { PrefillEvent } from '../utils/preflll.event';
13
- import { InputNameType } from '../enum/input-name.enum';
14
- var BoxNumberComponent = /** @class */ (function () {
15
- function BoxNumberComponent(addressService, localeService, translateService, unicodeService) {
16
- this.addressService = addressService;
17
- this.localeService = localeService;
18
- this.translateService = translateService;
19
- this.unicodeService = unicodeService;
20
- this.showDebugMessageToConsole = false;
21
- this.labelResourceKey = 'common.label.boxNumber';
22
- this.maxSuggesionCount = 5;
23
- this.visibleSuggesionCount = 5;
24
- this.sortCriteria = '';
25
- this.messageOption = 'Y';
26
- this.isReadonly = false;
27
- this.messageChanged = new EventEmitter();
28
- this.addressChanged = new EventEmitter();
29
- this.focusEvent = new EventEmitter();
30
- this.blurEvent = new EventEmitter();
31
- this.textChangeEvent = new EventEmitter();
32
- this.emptyResponseEvent = new EventEmitter();
33
- this.clearInputEventEmitter = new EventEmitter();
34
- this.prefillEventEmitter = new EventEmitter();
35
- this.validationMessageCode = null;
36
- this.validationMessageOptions = null;
37
- this.prefilling = false;
38
- this.isPrefillWithNoMatch = false;
39
- }
40
- Object.defineProperty(BoxNumberComponent.prototype, "inputLang", {
41
- // @ts-ignore
42
- set: function (val) {
43
- var _this = this;
44
- // console.log('set lang', val);
45
- this.localeService.changeLang(val);
46
- this.translateService.use(val).subscribe(function (res) {
47
- // console.log('set lang after subscribe', res);
48
- _this.onChangedLanguage();
49
- // if (res !== undefined ) {
50
- // }
51
- });
52
- },
53
- enumerable: true,
54
- configurable: true
55
- });
56
- BoxNumberComponent.prototype.ngOnInit = function () {
57
- this.searchText = '';
58
- // instance properties
59
- this.addressIsValidated = false;
60
- this.suggestionValidationMessage = '';
61
- this.suggestions = [];
62
- this.previousIndex = -1;
63
- this.lastSearchValue = '';
64
- this.wordList = [];
65
- this.suggestionsWordList = [];
66
- this.bpTypeAhead = '';
67
- this.placeHolderText = '';
68
- this.skipNextBlur = false; // OnBlur is triggered when the user clicks suggestion/validator button
69
- this.errorCode = null;
70
- // scope properties
71
- this.selectedIndex = -1;
72
- // properties
73
- this.typeAheadWord = '';
74
- this.collapseDropdown = true;
75
- this.sequenceNumber = 1;
76
- this.consumedNumber = 1;
77
- // initialization
78
- this.setSearchText('');
79
- // this.setPlaceHolderText();
80
- this.setEmptyResponseText();
81
- this.emptyResponse = true;
82
- this.onChangedLanguage();
83
- };
84
- BoxNumberComponent.prototype.ngAfterViewChecked = function () {
85
- if (this.selectionChanged) {
86
- var overlay_1 = this.boxNumberList.nativeElement;
87
- setTimeout(function () {
88
- var listItem = DomHandler.findSingle(overlay_1, 'li.active');
89
- if (listItem) {
90
- DomHandler.scrollInView(overlay_1, listItem);
91
- }
92
- }, 1);
93
- this.selectionChanged = false;
94
- }
95
- };
96
- BoxNumberComponent.prototype.ngOnChanges = function (changes) {
97
- if (changes) {
98
- if (changes.hasOwnProperty('prefillData') && !changes.prefillData.firstChange) {
99
- this.prefilling = true;
100
- this.searchText = this.loadParams(changes.prefillData.currentValue);
101
- if (this.searchText !== '' && this.minLevel === ADDRESSLEVEL.BOX_NUMBER) {
102
- // this.onInputChange('prefilled');
103
- // this.boxNumberSearchInput.nativeElement.focus();
104
- this.collapseDropdown = true;
105
- this.prefillData.prefillBoxNumber
106
- = this.transformBoxNumberInLowercaseAndWithoutDiacritics(this.prefillData.parameters.boxNumber);
107
- this.onInputChange(/*'prefilled'*/ SourceType.SOURCE_PREFILLED);
108
- }
109
- }
110
- if (changes.hasOwnProperty('streetNumber') && !changes.streetNumber.firstChange && !changes.hasOwnProperty('prefillData')) {
111
- this.minLevel = ADDRESSLEVEL.BOX_NUMBER;
112
- this.clearWidget();
113
- this.valueChanged();
114
- }
115
- /*
116
- if (changes.hasOwnProperty('inputLang') / *&& !changes.addressParams.firstChange* /) {
117
- const lang = changes.inputLang.currentValue;
118
- console.log('on changes - inputLang', lang);
119
- if (changes.inputLang.currentValue !== undefined) {
120
- this.translateService.setDefaultLang(lang);
121
- this.translateService.use(lang);
122
- this.localeService.changeLang(lang);
123
- this.onChangedLanguage();
124
- }
125
- }
126
- */
127
- }
128
- };
129
- BoxNumberComponent.prototype.transformBoxNumberInLowercaseAndWithoutDiacritics = function (boxNumber) {
130
- var result = null;
131
- if (boxNumber !== null && boxNumber !== undefined) {
132
- result = this.unicodeService.removeDiacritics(boxNumber);
133
- result = result.toLowerCase();
134
- }
135
- // console.log('Transformed street number:', result);
136
- return result;
137
- };
138
- BoxNumberComponent.prototype.ngOnDestroy = function () {
139
- if (this.subscription) {
140
- this.subscription.unsubscribe();
141
- }
142
- };
143
- BoxNumberComponent.prototype.onChangedLanguage = function () {
144
- var _this = this;
145
- // this.placeHolderText = this.translateService.instant('boxNumber.placeholder.input-placeholder');
146
- // console.log('place holder', this.placeHolderText);
147
- this.translateService.get('boxNumber.placeholder.input-placeholder')
148
- .subscribe(function (res) {
149
- // console.log('new placeholder', res);
150
- // => 'hello world'
151
- _this.placeHolderText = res;
152
- _this.setEmptyResponseText();
153
- });
154
- };
155
- BoxNumberComponent.prototype.setEmptyResponseText = function () {
156
- // this.emptyResponseText = this.translationService.translate('not-in-list');
157
- this.emptyResponseText = this.translateService.instant('boxNumber.message.not-in-list');
158
- };
159
- BoxNumberComponent.prototype.onClearInputEvent = function (event, focus) {
160
- this.clearInput(focus);
161
- };
162
- BoxNumberComponent.prototype.onBlur = function (ev) {
163
- if (this.isBrowserIE() && this.isDropdownClicked(ev)) {
164
- this.boxNumberSearchInput.nativeElement.focus();
165
- return;
166
- }
167
- if (this.skipNextBlur) {
168
- this.skipNextBlur = false;
169
- }
170
- else {
171
- this.collapseDropdown = true;
172
- this.blurEvent.emit(ADDRESSLEVEL.BOX_NUMBER);
173
- }
174
- };
175
- BoxNumberComponent.prototype.isBrowserIE = function () {
176
- return /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
177
- };
178
- BoxNumberComponent.prototype.isDropdownClicked = function (ev) {
179
- var target = ev.explicitOriginalTarget || document.activeElement;
180
- return (target.id === 'bpaac-box-dropdown');
181
- };
182
- BoxNumberComponent.prototype.onFocus = function () {
183
- this.collapseDropdown = false;
184
- // this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
185
- // ? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
186
- // this.prefilling = false;
187
- this.skipNextBlur = false;
188
- this.focusEvent.emit(ADDRESSLEVEL.BOX_NUMBER);
189
- };
190
- BoxNumberComponent.prototype.valueChanged = function () {
191
- this.textChangeEvent.emit(this.searchText);
192
- };
193
- BoxNumberComponent.prototype.mayShowDropdown = function () {
194
- return this.suggestions.length > 0 && !this.collapseDropdown;
195
- };
196
- BoxNumberComponent.prototype.buildInputWordList = function () {
197
- this.wordList = this.searchText.split(/[\s, ]+/);
198
- };
199
- BoxNumberComponent.prototype.mayAddTypeAhead = function (source) {
200
- if (source === SourceType.SOURCE_PREFILLED) {
201
- return false;
202
- }
203
- if (this.searchText.length === 0) {
204
- return false;
205
- }
206
- return (/[^\s, \\\/]$/).test(this.searchText);
207
- };
208
- BoxNumberComponent.prototype.buildTypeAhead = function (source) {
209
- if (!this.mayAddTypeAhead(source)) {
210
- return;
211
- }
212
- var searchTextWords = this.searchText.split(/[\s, ]+/);
213
- var lastWord = searchTextWords[searchTextWords.length - 1];
214
- if (this.suggestions.some(function (sug) {
215
- if (!sug || !sug.hasOwnProperty('string')) {
216
- return false;
217
- }
218
- return sug.string.split(/[\s-]+/).some(function (word) {
219
- if (this.stringStartsWithIgnoreDiacritics(word, lastWord)) {
220
- this.typeAheadWord = word;
221
- return true;
222
- }
223
- }.bind(this));
224
- }.bind(this))) {
225
- var appendix = this.typeAheadWord.slice(lastWord.length, this.typeAheadWord.length).toLowerCase();
226
- this.bpTypeAhead = this.searchText + appendix;
227
- }
228
- };
229
- BoxNumberComponent.prototype.stringStartsWithIgnoreDiacritics = function (value, prefix) {
230
- value = (value !== null && value !== undefined) ? value.toLowerCase() : value;
231
- prefix = (prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : prefix;
232
- return this.unicodeService.removeDiacritics(value).slice(0, prefix.length)
233
- .toLowerCase().indexOf(this.unicodeService.removeDiacritics(prefix)) !== -1;
234
- };
235
- BoxNumberComponent.prototype.getTopSuggestions = function (source) {
236
- var _this = this;
237
- this.sequenceNumber += 1;
238
- var param = this.generateParameters();
239
- if (this.showDebugMessageToConsole) {
240
- console.log('BOX-NUMBER calling service params', param);
241
- }
242
- if (this.searchText) {
243
- this.subscription = this.addressService.getBox(this.baseUrl, this.locality, this.postalCode, param)
244
- .subscribe(function (response) {
245
- _this.handleGetBoxResponse(response, source);
246
- if (source === SourceType.SOURCE_PREFILLED) {
247
- _this.isPrefillWithNoMatch = _this.prefillData.prefillBoxNumberPerfectMatchFound === true ? false : true;
248
- _this.prefillAnalyzeData();
249
- }
250
- else {
251
- _this.isPrefillWithNoMatch = false;
252
- }
253
- }, function () { return _this.handleGetBoxError(); });
254
- }
255
- };
256
- BoxNumberComponent.prototype.getTextColor = function () {
257
- return (this.isPrefillWithNoMatch === true) ? 'orangered' : '';
258
- };
259
- BoxNumberComponent.prototype.prefillAnalyzeData = function () {
260
- if (this.prefillData.prefillBoxNumberPerfectMatchFound === true) {
261
- this.collapseDropdown = true;
262
- }
263
- this.prefillEventEmitter.emit(new PrefillEvent(ADDRESSLEVEL.BOX_NUMBER, this.prefillData));
264
- };
265
- BoxNumberComponent.prototype.loadParams = function (prefillData) {
266
- var concatStr = '';
267
- if (prefillData !== null && prefillData.parameters !== null) {
268
- if (prefillData.parameters.hasOwnProperty('minLevel')) {
269
- this.minLevel = prefillData.parameters.minLevel;
270
- }
271
- if (prefillData.parameters.hasOwnProperty('postalCode') && this.isString(prefillData.parameters.postalCode)) {
272
- this.postalCode = prefillData.parameters.postalCode;
273
- }
274
- if (prefillData.parameters.hasOwnProperty('municipalityName') && this.isString(prefillData.parameters.municipalityName)) {
275
- this.locality = prefillData.parameters.municipalityName;
276
- }
277
- if (prefillData.parameters.hasOwnProperty('streetName') && this.isString(prefillData.parameters.streetName)) {
278
- this.streetName = prefillData.parameters.streetName;
279
- }
280
- if (prefillData.parameters.hasOwnProperty('streetNumber') && this.isString(prefillData.parameters.streetNumber)) {
281
- this.streetNumber = prefillData.parameters.streetNumber;
282
- }
283
- if (prefillData.parameters.hasOwnProperty('boxNumber')
284
- && this.isString(prefillData.parameters.boxNumber) && this.isParamsComplete()) {
285
- concatStr = prefillData.parameters.boxNumber;
286
- }
287
- }
288
- return concatStr;
289
- };
290
- BoxNumberComponent.prototype.isString = function (val) {
291
- if (val === null || val === undefined) {
292
- return false;
293
- }
294
- return val.constructor === String;
295
- };
296
- BoxNumberComponent.prototype.isValid = function (val) {
297
- return this.isString(val) && val !== '';
298
- };
299
- BoxNumberComponent.prototype.isParamsComplete = function () {
300
- return this.isValid(this.postalCode) && this.isValid(this.locality) && this.isValid(this.streetName) && this.isValid(this.streetNumber);
301
- };
302
- BoxNumberComponent.prototype.generateParameters = function () {
303
- // tslint:disable
304
- var param = new QueryParameters({
305
- id: this.sequenceNumber,
306
- q: this.searchText,
307
- postalCode: this.postalCode,
308
- locality: this.locality,
309
- street: this.streetName,
310
- streetNumber: this.streetNumber,
311
- maxNumberOfSuggestions: this.maxSuggesionCount
312
- });
313
- if (this.sortCriteria === 'B') {
314
- param.sortByBox(true);
315
- }
316
- return param;
317
- };
318
- BoxNumberComponent.prototype.handleGetBoxResponse = function (data, source) {
319
- if (data && data.response && data.response.sequenceNumber && data.response.sequenceNumber >= this.consumedNumber &&
320
- data.response.topSuggestions) {
321
- this.consumedNumber = data.response.sequenceNumber;
322
- this.clearSuggestions();
323
- this.parseTopSuggestions(data.response.topSuggestions, source);
324
- this.buildTypeAhead(source);
325
- this.clearConnectionErrorMessage();
326
- this.buildInputWordList();
327
- }
328
- this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
329
- ? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
330
- };
331
- BoxNumberComponent.prototype.handleGetBoxError = function () {
332
- this.setConnectionErrorMessage();
333
- };
334
- BoxNumberComponent.prototype.setConnectionErrorMessage = function () {
335
- this.errorCode = 'service-unavailable';
336
- // this.setValidationMessage(this.errorCode);
337
- this.emitTranslatedValidationMessage(ValidationMessageType.Service_Unavailable);
338
- };
339
- BoxNumberComponent.prototype.clearConnectionErrorMessage = function () {
340
- if (this.errorCode) {
341
- var res = this.translateService.instant(this.errorCode);
342
- if (this.suggestionValidationMessage === res) {
343
- this.clearSuggestionValidationMessage();
344
- }
345
- this.errorCode = null;
346
- }
347
- };
348
- BoxNumberComponent.prototype.parseTopSuggestions = function (topSuggestions, source) {
349
- var e_1, _a;
350
- if (topSuggestions.constructor === Array) {
351
- try {
352
- // topSuggestions.forEach(this.parseSingleSuggestion.bind(this));
353
- for (var topSuggestions_1 = __values(topSuggestions), topSuggestions_1_1 = topSuggestions_1.next(); !topSuggestions_1_1.done; topSuggestions_1_1 = topSuggestions_1.next()) {
354
- var sug = topSuggestions_1_1.value;
355
- this.parseSingleSuggestion(sug, source);
356
- }
357
- }
358
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
359
- finally {
360
- try {
361
- if (topSuggestions_1_1 && !topSuggestions_1_1.done && (_a = topSuggestions_1.return)) _a.call(topSuggestions_1);
362
- }
363
- finally { if (e_1) throw e_1.error; }
364
- }
365
- if (!source) {
366
- if ((topSuggestions.length === 0 || this.emptyResponse) && this.notInListAllowed) {
367
- this.suggestions.push({ string: this.searchText, 'not-in-list': true });
368
- }
369
- }
370
- else {
371
- // If prefilling, then check if no match for a non-empty boxNumber
372
- // If this is the case, simulate the selection of the 'not-in-list' suggestion
373
- if (this.prefilling && this.notInListAllowed
374
- && this.prefillData.prefillBoxNumberPerfectMatchFound === false
375
- && this.prefillData.prefillBoxNumber !== null
376
- && this.prefillData.prefillBoxNumber !== undefined
377
- && this.prefillData.prefillBoxNumber.length > 0) {
378
- // const notInListSuggestion = {string: this.searchText, 'not-in-list': true};
379
- var suggestion = this.prefillBuildNotInListSuggestion();
380
- if (this.showDebugMessageToConsole) {
381
- console.log('BOX NUMBER - PREFILL NOT IN LIST SUGGESTION:', suggestion);
382
- }
383
- this.prefillCheckForPerfectMatch(suggestion);
384
- }
385
- }
386
- }
387
- else {
388
- this.parseSingleSuggestion(topSuggestions, source);
389
- }
390
- };
391
- BoxNumberComponent.prototype.prefillBuildNotInListSuggestion = function () {
392
- var notInListSuggestion = { string: this.searchText, 'not-in-list': true };
393
- var streetNumberSuggestion = this.prefillData.prefillStreetNumberPerfectMatchSuggestion;
394
- var combined = __assign(__assign({}, streetNumberSuggestion.address), notInListSuggestion);
395
- delete combined.mailBoxid;
396
- delete combined.suffixId;
397
- combined.boxNumber = combined.string;
398
- combined.searchBarString = combined.string;
399
- combined.isComplete = true;
400
- streetNumberSuggestion.address = combined;
401
- return streetNumberSuggestion;
402
- };
403
- BoxNumberComponent.prototype.parseSingleSuggestion = function (suggestion, source) {
404
- var suggestionToAdd;
405
- if (this.localeService.isLocaleFrench() && suggestion.hasOwnProperty('french')) {
406
- suggestionToAdd = suggestion.french;
407
- }
408
- else if (this.localeService.isLocaleDutch() && suggestion.hasOwnProperty('dutch')) {
409
- suggestionToAdd = suggestion.dutch;
410
- }
411
- else if (this.localeService.isLocaleGerman() && suggestion.hasOwnProperty('german')) {
412
- suggestionToAdd = suggestion.german;
413
- }
414
- else if (suggestion.hasOwnProperty('address')) {
415
- suggestionToAdd = suggestion.address;
416
- }
417
- if (suggestionToAdd) {
418
- if (suggestion.messages) {
419
- suggestionToAdd.messages = suggestion.messages;
420
- }
421
- if (suggestionToAdd.boxNumber === this.searchText) {
422
- this.emptyResponse = false;
423
- }
424
- this.suggestions.push(suggestionToAdd);
425
- if (source === SourceType.SOURCE_PREFILLED) {
426
- suggestion.address = suggestionToAdd;
427
- this.prefillCheckForPerfectMatch(suggestion);
428
- }
429
- }
430
- };
431
- BoxNumberComponent.prototype.prefillCheckForPerfectMatch = function (suggestion) {
432
- //if ( !this.addressIsComplete )
433
- {
434
- if (this.showDebugMessageToConsole) {
435
- console.log('box number - checking suggestion for perfect match', this.prefillData, suggestion);
436
- }
437
- var sugAddress = suggestion.address;
438
- var suggestionBoxNumber = this.transformBoxNumberInLowercaseAndWithoutDiacritics('' + sugAddress.boxNumber);
439
- if (this.showDebugMessageToConsole) {
440
- console.log('comparing box numbers', suggestionBoxNumber, this.prefillData.prefillBoxNumber);
441
- }
442
- if (suggestionBoxNumber === ('' + this.prefillData.prefillBoxNumber)) {
443
- this.prefillData.prefillBoxNumberPerfectMatchFound = true;
444
- this.prefillData.prefillBoxNumberPerfectMatchSuggestion = suggestion;
445
- this.searchText = sugAddress.boxNumber;
446
- if (sugAddress.hasOwnProperty('isComplete') && sugAddress.isComplete === true) {
447
- this.clickSuggestion(null, sugAddress);
448
- // this.addressIsComplete = true;
449
- if (this.showDebugMessageToConsole) {
450
- console.log('ADDRESS COMPLETE ON BOX NUMBER !');
451
- }
452
- }
453
- }
454
- }
455
- /* else
456
- {
457
- if (this.showDebugMessageToConsole) {
458
- console.log('Address complete, skipping suggestion check', suggestion);
459
- }
460
- } */
461
- };
462
- BoxNumberComponent.prototype.onInputChange = function (source) {
463
- this.collapseDropdown = false;
464
- this.emptyResponse = true;
465
- this.resetArrowSelectedIndex();
466
- if (!source) {
467
- this.prefilling = false;
468
- this.valueChanged();
469
- }
470
- this.clearSuggestionValidationMessage();
471
- if (this.searchText === '') {
472
- this.sequenceNumber += 1;
473
- this.consumedNumber = this.sequenceNumber;
474
- this.clearSuggestions();
475
- }
476
- else {
477
- this.getTopSuggestions(source);
478
- }
479
- this.buildInputWordList();
480
- };
481
- BoxNumberComponent.prototype.clickSuggestion = function (event, suggestion) {
482
- this.isPrefillWithNoMatch = false;
483
- event === null || event === void 0 ? void 0 : event.preventDefault();
484
- if (suggestion) {
485
- this.clearTypeAhead();
486
- this.resetArrowSelectedIndex();
487
- if (suggestion.string) {
488
- this.setSearchText(suggestion.string);
489
- }
490
- this.collapseDropdown = true;
491
- // if (suggestion.hasOwnProperty('isComplete')) {
492
- // this.showAddressIsValidated();
493
- // }
494
- if (suggestion['not-in-list']) {
495
- suggestion = this.modifySelectedAddress(suggestion);
496
- }
497
- this.addressIsValidated = true;
498
- suggestion.isComplete = true;
499
- this.setSelectedAddress(suggestion);
500
- }
501
- };
502
- BoxNumberComponent.prototype.modifySelectedAddress = function (suggestion) {
503
- var combined = __assign(__assign({}, this.selectedAddress), suggestion);
504
- delete combined.mailBoxid;
505
- delete combined.suffixId;
506
- combined.boxNumber = combined.string;
507
- combined.searchBarString = combined.string;
508
- combined.isComplete = true;
509
- return combined;
510
- };
511
- BoxNumberComponent.prototype.setSelectedAddress = function (suggestion) {
512
- // console.log('box number::setSelectedAddress', suggestion);
513
- this.addressIsValidated = (suggestion.hasOwnProperty('isComplete') && suggestion.isComplete === true) ? true : false;
514
- this.addressChanged.emit(suggestion);
515
- };
516
- BoxNumberComponent.prototype.clearSelectedAddress = function () {
517
- this.addressChanged.emit(null);
518
- this.addressIsValidated = false;
519
- };
520
- /*
521
- setValidationMessage(translationCode, options?, retranslateOptions?) {
522
- this.validationMessageOptions = options;
523
- if (retranslateOptions && this.validationMessageOptions && Array.isArray(this.validationMessageOptions['untranslated-sprintf']) &&
524
- this.validationMessageOptions.sprintf) {
525
- const translatedElements = [];
526
- this.validationMessageOptions['untranslated-sprintf'].forEach(function(element) {
527
- translatedElements.push(this.translationService.translate(element));
528
- }.bind(this)
529
- );
530
- this.validationMessageOptions.sprintf = translatedElements;
531
- }
532
- this.validationMessageCode = translationCode;
533
- // emit translation key to wrapper component for customized translations
534
- if (options) {
535
- this.suggestionValidationMessage = this.translationService.translate(this.validationMessageCode, this.validationMessageOptions);
536
- this.messageChanged.emit(this.suggestionValidationMessage);
537
- } else {
538
- this.messageChanged.emit(this.validationMessageCode);
539
- }
540
- }
541
- */
542
- BoxNumberComponent.prototype.emitTranslatedValidationMessage = function (validationMessageType, options) {
543
- // Momently, options are NOT used; so data type of these options will be reviewed once needed.
544
- if (validationMessageType === null || validationMessageType === undefined) {
545
- console.warn('Unable to emit validation message - message key is invalid!', validationMessageType);
546
- return;
547
- }
548
- switch (validationMessageType) {
549
- case ValidationMessageType.Address_Not_Found:
550
- case ValidationMessageType.Address_Validated:
551
- case ValidationMessageType.Service_Unavailable:
552
- {
553
- var message = this.translateService.instant(validationMessageType);
554
- // this.messageChanged.emit(message);
555
- this.messageChanged.emit({ messageType: validationMessageType, translatedMessage: message });
556
- }
557
- // tslint:disable-next-line:align
558
- break;
559
- default:
560
- {
561
- console.error('Unable to emit validation message - message key NOT supported!', validationMessageType);
562
- }
563
- // tslint:disable-next-line:align
564
- break;
565
- }
566
- };
567
- BoxNumberComponent.prototype.showAddressIsValidated = function () {
568
- // this.setValidationMessage('address-validated');
569
- this.emitTranslatedValidationMessage(ValidationMessageType.Address_Validated);
570
- };
571
- BoxNumberComponent.prototype.checkKeyDown = function (event) {
572
- switch (event.which) {
573
- // down key, increment selectedIndex
574
- case 40:
575
- event.preventDefault();
576
- this.moveArrowSelectedIndexDown();
577
- break;
578
- // up key, decrement selectedIndex
579
- case 38:
580
- event.preventDefault();
581
- this.moveArrowSelectedIndexUp();
582
- break;
583
- // right arrow key
584
- case 39:
585
- event.preventDefault();
586
- if (this.cursorIsOnSuggestionList()) {
587
- this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
588
- }
589
- else {
590
- if (this.typeAheadWord && this.typeAheadIsShown()) {
591
- this.setSearchText(this.bpTypeAhead);
592
- this.typeAheadWord = '';
593
- }
594
- }
595
- break;
596
- // tab key
597
- case 9:
598
- if (!this.addressIsValidated && !event.shiftKey) {
599
- event.preventDefault();
600
- this.selectFirstInListOfSuggesions();
601
- }
602
- break;
603
- case 46:
604
- if (event.ctrlKey) {
605
- this.clearWidget();
606
- }
607
- break;
608
- // enter pressed
609
- case 13:
610
- event.preventDefault();
611
- if (this.cursorIsOnSuggestionList()) {
612
- this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
613
- }
614
- else {
615
- }
616
- break;
617
- default:
618
- this.clearTypeAhead();
619
- break;
620
- }
621
- };
622
- BoxNumberComponent.prototype.clearWidget = function () {
623
- this.addressIsValidated = false;
624
- this.clearSearchText();
625
- this.clearSuggestions();
626
- this.clearTypeAhead();
627
- this.prefillData = null;
628
- // this.prefilling = false;
629
- };
630
- BoxNumberComponent.prototype.clearSearchText = function () {
631
- this.searchText = '';
632
- };
633
- BoxNumberComponent.prototype.typeAheadIsShown = function () {
634
- return this.bpTypeAhead && this.bpTypeAhead.length > 0;
635
- };
636
- BoxNumberComponent.prototype.resetArrowSelectedIndex = function () {
637
- this.selectedIndex = -1;
638
- };
639
- BoxNumberComponent.prototype.moveArrowSelectedIndexDown = function () {
640
- if (this.selectedIndex + 1 !== this.suggestions.length) {
641
- this.selectedIndex++;
642
- this.changeSelection();
643
- this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
644
- }
645
- };
646
- BoxNumberComponent.prototype.moveArrowSelectedIndexUp = function () {
647
- if (this.selectedIndex - 1 !== -2) {
648
- this.selectedIndex--;
649
- this.changeSelection();
650
- this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex + 1);
651
- }
652
- };
653
- BoxNumberComponent.prototype.cursorIsOnSuggestionList = function () {
654
- return this.selectedIndex >= 0;
655
- };
656
- BoxNumberComponent.prototype.setSearchTextBasedOnArrowSelection = function (newVal, oldVal) {
657
- if (newVal === undefined || this.suggestions.length <= 0) {
658
- return;
659
- }
660
- if (newVal !== -1) {
661
- if (oldVal === -1) {
662
- this.lastSearchValue = this.searchText;
663
- }
664
- this.setSearchText(this.suggestions[this.selectedIndex].string);
665
- this.clearTypeAhead();
666
- }
667
- else {
668
- this.setSearchText(this.lastSearchValue);
669
- }
670
- };
671
- BoxNumberComponent.prototype.mayShowClearButton = function () {
672
- return this.searchText.length > 0;
673
- };
674
- BoxNumberComponent.prototype.clearInput = function (focus, emit) {
675
- if (emit === void 0) { emit = true; }
676
- this.clearWidget();
677
- this.resetArrowSelectedIndex();
678
- this.previousIndex = -1;
679
- this.lastSearchValue = '';
680
- this.clearSuggestionValidationMessage();
681
- this.valueChanged();
682
- this.clearConnectionErrorMessage();
683
- if (focus === true) {
684
- this.boxNumberSearchInput.nativeElement.focus();
685
- }
686
- // this.addressChanged.emit(null);
687
- if (emit) {
688
- this.clearInputEventEmitter.emit(/*'BOX_NUMBER'*/ InputNameType.BOX_NUMBER);
689
- }
690
- };
691
- BoxNumberComponent.prototype.clearSuggestions = function () {
692
- this.wordList = [];
693
- this.suggestions = [];
694
- this.suggestionsWordList = [];
695
- };
696
- BoxNumberComponent.prototype.clearTypeAhead = function () {
697
- this.bpTypeAhead = '';
698
- };
699
- BoxNumberComponent.prototype.clearSuggestionValidationMessage = function () {
700
- this.suggestionValidationMessage = '';
701
- this.addressIsValidated = false;
702
- this.messageChanged.emit({ messageType: null, translatedMessage: this.suggestionValidationMessage });
703
- this.validationMessageOptions = null;
704
- this.validationMessageCode = null;
705
- };
706
- BoxNumberComponent.prototype.setSearchText = function (value) {
707
- this.searchText = value;
708
- };
709
- BoxNumberComponent.prototype.selectFirstInListOfSuggesions = function () {
710
- this.selectedIndex = 0;
711
- this.changeSelection();
712
- this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
713
- };
714
- BoxNumberComponent.prototype.changeSelection = function () {
715
- if (this.suggestions.length > 0) {
716
- this.selectionChanged = true;
717
- }
718
- };
719
- BoxNumberComponent.prototype.suggestionMouseLeave = function () {
720
- this.selectedIndex = -1;
721
- };
722
- BoxNumberComponent.prototype.showAddressNotFoundMessage = function () {
723
- // this.setValidationMessage('address-not-found');
724
- this.emitTranslatedValidationMessage(ValidationMessageType.Address_Not_Found);
725
- };
726
- BoxNumberComponent.prototype.isDisabled = function () {
727
- return (this.locality === '' || this.postalCode === '' || this.minLevel > ADDRESSLEVEL.BOX_NUMBER);
728
- };
729
- BoxNumberComponent.prototype.onInputClick = function () {
730
- if (this.showDebugMessageToConsole) {
731
- console.log('box number click');
732
- }
733
- };
734
- BoxNumberComponent.ctorParameters = function () { return [
735
- { type: AddressService },
736
- { type: LocaleService },
737
- { type: TranslateService },
738
- { type: UnicodeService }
739
- ]; };
740
- __decorate([
741
- ViewChild('boxNumberSearchInput', { static: false })
742
- ], BoxNumberComponent.prototype, "boxNumberSearchInput", void 0);
743
- __decorate([
744
- ViewChild('boxNumberList', { static: false })
745
- ], BoxNumberComponent.prototype, "boxNumberList", void 0);
746
- __decorate([
747
- Input()
748
- ], BoxNumberComponent.prototype, "prefillData", void 0);
749
- __decorate([
750
- Input()
751
- ], BoxNumberComponent.prototype, "showDebugMessageToConsole", void 0);
752
- __decorate([
753
- Input()
754
- ], BoxNumberComponent.prototype, "labelResourceKey", void 0);
755
- __decorate([
756
- Input()
757
- ], BoxNumberComponent.prototype, "maxSuggesionCount", void 0);
758
- __decorate([
759
- Input()
760
- ], BoxNumberComponent.prototype, "visibleSuggesionCount", void 0);
761
- __decorate([
762
- Input()
763
- ], BoxNumberComponent.prototype, "sortCriteria", void 0);
764
- __decorate([
765
- Input()
766
- ], BoxNumberComponent.prototype, "baseUrl", void 0);
767
- __decorate([
768
- Input()
769
- ], BoxNumberComponent.prototype, "addressParams", void 0);
770
- __decorate([
771
- Input()
772
- ], BoxNumberComponent.prototype, "postalCode", void 0);
773
- __decorate([
774
- Input()
775
- ], BoxNumberComponent.prototype, "locality", void 0);
776
- __decorate([
777
- Input()
778
- ], BoxNumberComponent.prototype, "streetName", void 0);
779
- __decorate([
780
- Input()
781
- ], BoxNumberComponent.prototype, "streetNumber", void 0);
782
- __decorate([
783
- Input()
784
- ], BoxNumberComponent.prototype, "selectedAddress", void 0);
785
- __decorate([
786
- Input()
787
- ], BoxNumberComponent.prototype, "notInListAllowed", void 0);
788
- __decorate([
789
- Input()
790
- ], BoxNumberComponent.prototype, "inputLang", null);
791
- __decorate([
792
- Input()
793
- ], BoxNumberComponent.prototype, "messageOption", void 0);
794
- __decorate([
795
- Input()
796
- ], BoxNumberComponent.prototype, "isReadonly", void 0);
797
- __decorate([
798
- Output()
799
- ], BoxNumberComponent.prototype, "messageChanged", void 0);
800
- __decorate([
801
- Output()
802
- ], BoxNumberComponent.prototype, "addressChanged", void 0);
803
- __decorate([
804
- Output()
805
- ], BoxNumberComponent.prototype, "focusEvent", void 0);
806
- __decorate([
807
- Output()
808
- ], BoxNumberComponent.prototype, "blurEvent", void 0);
809
- __decorate([
810
- Output()
811
- ], BoxNumberComponent.prototype, "textChangeEvent", void 0);
812
- __decorate([
813
- Output()
814
- ], BoxNumberComponent.prototype, "emptyResponseEvent", void 0);
815
- __decorate([
816
- Output()
817
- ], BoxNumberComponent.prototype, "clearInputEventEmitter", void 0);
818
- __decorate([
819
- Output()
820
- ], BoxNumberComponent.prototype, "prefillEventEmitter", void 0);
821
- BoxNumberComponent = __decorate([
822
- Component({
823
- selector: 'bp-box-number',
824
- template: "<span *ngIf=\"labelResourceKey\">{{ labelResourceKey | translate}}</span>\n<div class=\"bpaac-dropdown\">\n <div class=\"bpaac-search-bar\">\n <div class=\"bpaac-input-width\">\n <!-- [disabled]=\"isDisabled()\" -->\n <input type=\"text\" #boxNumberSearchInput class=\"bpaac-input\" \n [readonly]=\"isReadonly\"\n [style.background-color]=\"!isParamsComplete() ? 'lightgrey' : ''\" \n [style.color]=\" getTextColor() \"\n [disabled]=\"!streetNumber || streetNumber.trim().length === 0\" (keydown)=\"checkKeyDown($event)\" \n (input)=\"onInputChange()\" (click)=\"onInputClick()\"\n [(ngModel)]=\"searchText\" id=\"boxNumberInputField\" [attr.title]=\"placeHolderText\" [attr.placeholder]=\"placeHolderText\" autocomplete=\"off\"\n (blur)=\"onBlur($event)\" (focus)=\"onFocus()\" />\n <div id=\"bpaac-clear-boxNb-button\" *ngIf=\"mayShowClearButton()\" (click)=\"clearInput(true)\" class=\"bpaac-clear\">\n </div>\n </div>\n <!--<div ng-transclude></div>-->\n <input id=\"bpaac-boxNb-typeahead\" type=\"text\" disabled autocomplete=\"off\" [(ngModel)]=\"bpTypeAhead\" />\n <span *ngIf=\"addressIsValidated\" class=\"boxNbChekmark\"><span class=\"checkmark\"></span></span>\n </div>\n <div [hidden]=\"collapseDropdown\" class=\"bpaac-dropdown-menu-container\" *ngIf=\"suggestions && suggestions.length>0\">\n <div #boxNumberList [appVisibleSuggestion]=\"visibleSuggesionCount\" id=\"bpaac-box-dropdown\" class=\"bpaac-dropdown-menu\">\n <ul role=\"listbox\" id=\"bpaac-boxNb-suggestionsList\" class=\"list-unstyled\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" [ngClass]=\"{'active':(selectedIndex==idx)}\" \n (mousedown)=\"clickSuggestion($event, option)\"\n (mouseenter)=\"selectedIndex=idx\" (mouseleave)=\"selectedIndex=-1\">\n <span *ngIf=\"option\" [innerHtml]=\"option['not-in-list'] ? emptyResponseText : option.string | highlightSuggestion : wordList\"></span>\n </li>\n </ul>\n </div>\n </div>\n</div>\n",
825
- styles: [""]
826
- })
827
- ], BoxNumberComponent);
828
- return BoxNumberComponent;
829
- }());
830
- export { BoxNumberComponent };
831
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LW51bWJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYnBvc3QvYnAtYWRkcmVzcy1hdXRvLWNvbXBsZXRlLWJ5LWNvbXBvbmVudC8iLCJzb3VyY2VzIjpbImxpYi9ib3gtbnVtYmVyL2JveC1udW1iZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFrRCxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRzdKLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBT3hEO0lBc0ZFLDRCQUNVLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLGdCQUFrQyxFQUNsQyxjQUE4QjtRQUg5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNs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QUFFOzZEQUFvQztJQUNuQztRQUFSLEtBQUssRUFBRTswREFBb0I7SUFDbkI7UUFBUixLQUFLLEVBQUU7d0RBQWtCO0lBQ2pCO1FBQVIsS0FBSyxFQUFFOzBEQUFvQjtJQUNuQjtRQUFSLEtBQUssRUFBRTs0REFBc0I7SUFDckI7UUFBUixLQUFLLEVBQUU7K0RBQWlCO0lBQ2hCO1FBQVIsS0FBSyxFQUFFO2dFQUEyQjtJQUcxQjtRQUFSLEtBQUssRUFBRTt1REFXUDtJQUVRO1FBQVIsS0FBSyxFQUFFOzZEQUFxQjtJQUc3QjtRQURDLEtBQUssRUFBRTswREFDUztJQUVQO1FBQVQsTUFBTSxFQUFFOzhEQUFvSDtJQUNuSDtRQUFULE1BQU0sRUFBRTs4REFBd0Q7SUFDdkQ7UUFBVCxNQUFNLEVBQUU7MERBQW9EO0lBQ25EO1FBQVQsTUFBTSxFQUFFO3lEQUFtRDtJQUNsRDtRQUFULE1BQU0sRUFBRTsrREFBeUQ7SUFDeEQ7UUFBVCxNQUFNLEVBQUU7a0VBQTREO0lBRTNEO1FBQVQsTUFBTSxFQUFFO3NFQUFtRTtJQUVsRTtRQUFULE1BQU0sRUFBRTttRUFBb0Y7SUF2RGxGLGtCQUFrQjtRQUw5QixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsZUFBZTtZQUN6QiwrdEVBQTBDOztTQUUzQyxDQUFDO09BQ1csa0JBQWtCLENBOHpCOUI7SUFBRCx5QkFBQztDQUFBLEFBOXpCRCxJQTh6QkM7U0E5ekJZLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUHJlZmlsbGVkUGFyYW1ldGVycyB9IGZyb20gJy4uL3V0aWxzL3ByZWZpbGxlZC1wYXJhbWV0ZXJzJztcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlVHlwZSB9IGZyb20gJy4uL2VudW0vdmFsaWRhdGlvbi1tZXNzYWdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBBZGRyZXNzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FkcmVzcy5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2NhbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBVbmljb2RlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3VuaWNvZGUuc2VydmljZSc7XG5pbXBvcnQgeyBEb21IYW5kbGVyIH0gZnJvbSAnLi4vdXRpbHMvZG9taGFuZGxlcic7XG5pbXBvcnQgeyBBRERSRVNTTEVWRUwgfSBmcm9tICcuLi9lbnVtL2FkZHJlc3MtbGV2ZWwuZW51bSc7XG5pbXBvcnQgeyBRdWVyeVBhcmFtZXRlcnMgfSBmcm9tICcuLi9tb2RlbC9xdWVyeS1wYXJhbWV0ZXJzLm1vZGVsJztcbmltcG9ydCB7IFByZWZpbGxEYXRhIH0gZnJvbSAnLi4vdXRpbHMvcHJlZmlsbC1kYXRhJztcbmltcG9ydCB7IFNvdXJjZVR5cGUgfSBmcm9tICcuLi9lbnVtL3NvdXJjZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgUHJlZmlsbEV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvcHJlZmxsbC5ldmVudCc7XG5pbXBvcnQgeyBJbnB1dE5hbWVUeXBlIH0gZnJvbSAnLi4vZW51bS9pbnB1dC1uYW1lLmVudW0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicC1ib3gtbnVtYmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JveC1udW1iZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ib3gtbnVtYmVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQm94TnVtYmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgQFZpZXdDaGlsZCgnYm94TnVtYmVyU2VhcmNoSW5wdXQnLCB7c3RhdGljOiBmYWxzZX0gKSBib3hOdW1iZXJTZWFyY2hJbnB1dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnYm94TnVtYmVyTGlzdCcsIHtzdGF0aWM6IGZhbHNlfSApIGJveE51bWJlckxpc3Q6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvLyAyMDIwLTA2LTE1XG4gIC8vIEBJbnB1dCgpXG4gIC8vIG9uRm9jdXNTaG93U3VnZ2VzdGlvbnNBZnRlclByZWZpbGwgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHByZWZpbGxEYXRhOiBQcmVmaWxsRGF0YTtcbiAgQElucHV0KCkgc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhYmVsUmVzb3VyY2VLZXkgPSAnY29tbW9uLmxhYmVsLmJveE51bWJlcic7XG4gIEBJbnB1dCgpIG1heFN1Z2dlc2lvbkNvdW50ID0gNTtcbiAgQElucHV0KCkgdmlzaWJsZVN1Z2dlc2lvbkNvdW50ID0gNTtcbiAgQElucHV0KCkgc29ydENyaXRlcmlhID0gJyc7XG4gIEBJbnB1dCgpIGJhc2VVcmw6IHN0cmluZztcbiAgQElucHV0KCkgYWRkcmVzc1BhcmFtczogUHJlZmlsbGVkUGFyYW1ldGVycztcbiAgQElucHV0KCkgcG9zdGFsQ29kZTogc3RyaW5nO1xuICBASW5wdXQoKSBsb2NhbGl0eTogc3RyaW5nO1xuICBASW5wdXQoKSBzdHJlZXROYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0cmVldE51bWJlcjogc3RyaW5nO1xuICBASW5wdXQoKSBzZWxlY3RlZEFkZHJlc3M7XG4gIEBJbnB1dCgpIG5vdEluTGlzdEFsbG93ZWQ6IGJvb2xlYW47XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBASW5wdXQoKSBzZXQgaW5wdXRMYW5nKHZhbDogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3NldCBsYW5nJywgdmFsKTtcbiAgICB0aGlzLmxvY2FsZVNlcnZpY2UuY2hhbmdlTGFuZyh2YWwpO1xuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS51c2UodmFsKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3NldCBsYW5nIGFmdGVyIHN1YnNjcmliZScsIHJlcyk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VkTGFuZ3VhZ2UoKTtcbiAgICAgICAgLy8gaWYgKHJlcyAhPT0gdW5kZWZpbmVkICkge1xuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIEBJbnB1dCgpIG1lc3NhZ2VPcHRpb24gPSAnWSc7wrVcblxuICBASW5wdXQoKVxuICBpc1JlYWRvbmx5PWZhbHNlO1xuXG4gIEBPdXRwdXQoKSBtZXNzYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPHttZXNzYWdlVHlwZTogVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLCB0cmFuc2xhdGVkTWVzc2FnZTogc3RyaW5nfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBhZGRyZXNzQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGJsdXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSB0ZXh0Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZW1wdHlSZXNwb25zZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgY2xlYXJJbnB1dEV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIHByZWZpbGxFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxQcmVmaWxsRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVmaWxsRXZlbnQ+KCk7XG5cbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xuXG4gIGFkZHJlc3NJc1ZhbGlkYXRlZDogYm9vbGVhbjtcbiAgc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gIHN1Z2dlc3Rpb25zOiBhbnk7XG4gIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgbGFzdFNlYXJjaFZhbHVlOiBzdHJpbmc7XG4gIHdvcmRMaXN0OiBhbnk7XG4gIHN1Z2dlc3Rpb25zV29yZExpc3Q6IGFueTtcbiAgYnBUeXBlQWhlYWQ6IHN0cmluZztcbiAgcGxhY2VIb2xkZXJUZXh0OiBzdHJpbmc7XG4gIHNraXBOZXh0Qmx1cjogYm9vbGVhbjsgLy8gT25CbHVyIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzdWdnZXN0aW9uL3ZhbGlkYXRvciBidXR0b25cbiAgZXJyb3JDb2RlOiBhbnk7XG5cbiAgbWluTGV2ZWw6IG51bWJlcjtcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICBjb2xsYXBzZURyb3Bkb3duOiBib29sZWFuO1xuICB0eXBlQWhlYWRXb3JkOiBzdHJpbmc7XG4gIHNlcXVlbmNlTnVtYmVyOiBudW1iZXI7XG4gIGNvbnN1bWVkTnVtYmVyOiBudW1iZXI7XG4gIHNlbGVjdGlvbkNoYW5nZWQ6IGJvb2xlYW47XG4gIHZhbGlkYXRpb25NZXNzYWdlQ29kZSA9IG51bGw7XG4gIHZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG51bGw7XG4gIGVtcHR5UmVzcG9uc2VUZXh0OiBzdHJpbmc7XG4gIGVtcHR5UmVzcG9uc2U6IGJvb2xlYW47XG5cbiAgcHJlZmlsbGluZyA9IGZhbHNlO1xuICBpc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWRkcmVzc1NlcnZpY2U6IEFkZHJlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1bmljb2RlU2VydmljZTogVW5pY29kZVNlcnZpY2UsXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgLy8gaW5zdGFuY2UgcHJvcGVydGllc1xuICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLnN1Z2dlc3Rpb25zID0gW107XG4gICAgdGhpcy5wcmV2aW91c0luZGV4ID0gLTE7XG4gICAgdGhpcy5sYXN0U2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLndvcmRMaXN0ID0gW107XG4gICAgdGhpcy5zdWdnZXN0aW9uc1dvcmRMaXN0ID0gW107XG4gICAgdGhpcy5icFR5cGVBaGVhZCA9ICcnO1xuICAgIHRoaXMucGxhY2VIb2xkZXJUZXh0ID0gJyc7XG4gICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTsgLy8gT25CbHVyIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzdWdnZXN0aW9uL3ZhbGlkYXRvciBidXR0b25cbiAgICB0aGlzLmVycm9yQ29kZSA9IG51bGw7XG4gICAgLy8gc2NvcGUgcHJvcGVydGllc1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICAgIC8vIHByb3BlcnRpZXNcbiAgICB0aGlzLnR5cGVBaGVhZFdvcmQgPSAnJztcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSB0cnVlO1xuICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgPSAxO1xuICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSAxO1xuICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5zZXRTZWFyY2hUZXh0KCcnKTtcbiAgICAvLyB0aGlzLnNldFBsYWNlSG9sZGVyVGV4dCgpO1xuICAgIHRoaXMuc2V0RW1wdHlSZXNwb25zZVRleHQoKTtcbiAgICB0aGlzLmVtcHR5UmVzcG9uc2UgPSB0cnVlO1xuICAgIHRoaXMub25DaGFuZ2VkTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VkKSB7XG4gICAgICBjb25zdCBvdmVybGF5OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYm94TnVtYmVyTGlzdC5uYXRpdmVFbGVtZW50O1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtID0gRG9tSGFuZGxlci5maW5kU2luZ2xlKG92ZXJsYXksICdsaS5hY3RpdmUnKTtcbiAgICAgICAgaWYgKGxpc3RJdGVtKSB7XG4gICAgICAgICAgRG9tSGFuZGxlci5zY3JvbGxJblZpZXcob3ZlcmxheSwgbGlzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9LCAxKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcykge1xuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3ByZWZpbGxEYXRhJykgJiYgIWNoYW5nZXMucHJlZmlsbERhdGEuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5wcmVmaWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gdGhpcy5sb2FkUGFyYW1zKGNoYW5nZXMucHJlZmlsbERhdGEuY3VycmVudFZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dCAhPT0gJycgJiYgdGhpcy5taW5MZXZlbCA9PT0gQUREUkVTU0xFVkVMLkJPWF9OVU1CRVIpIHtcbiAgICAgICAgICAvLyB0aGlzLm9uSW5wdXRDaGFuZ2UoJ3ByZWZpbGxlZCcpO1xuICAgICAgICAgIC8vIHRoaXMuYm94TnVtYmVyU2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsQm94TnVtYmVyXG4gICAgICAgICAgICA9IHRoaXMudHJhbnNmb3JtQm94TnVtYmVySW5Mb3dlcmNhc2VBbmRXaXRob3V0RGlhY3JpdGljcyh0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuYm94TnVtYmVyKTtcbiAgICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoLyoncHJlZmlsbGVkJyovIFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRCApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdzdHJlZXROdW1iZXInKSAmJiAhY2hhbmdlcy5zdHJlZXROdW1iZXIuZmlyc3RDaGFuZ2UgJiYgIWNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3ByZWZpbGxEYXRhJykpIHtcbiAgICAgICAgdGhpcy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5CT1hfTlVNQkVSO1xuICAgICAgICB0aGlzLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkKCk7XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnaW5wdXRMYW5nJykgLyAqJiYgIWNoYW5nZXMuYWRkcmVzc1BhcmFtcy5maXJzdENoYW5nZSogLykge1xuICAgICAgICBjb25zdCBsYW5nID0gY2hhbmdlcy5pbnB1dExhbmcuY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zb2xlLmxvZygnb24gY2hhbmdlcyAtIGlucHV0TGFuZycsIGxhbmcpO1xuICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dExhbmcuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2V0RGVmYXVsdExhbmcobGFuZyk7XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnVzZShsYW5nKTtcbiAgICAgICAgICB0aGlzLmxvY2FsZVNlcnZpY2UuY2hhbmdlTGFuZyhsYW5nKTtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlZExhbmd1YWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICovXG4gICAgfVxuICB9XG5cbiAgdHJhbnNmb3JtQm94TnVtYmVySW5Mb3dlcmNhc2VBbmRXaXRob3V0RGlhY3JpdGljcyhib3hOdW1iZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcbiAgICBpZiAoYm94TnVtYmVyICE9PSBudWxsICYmIGJveE51bWJlciAhPT0gdW5kZWZpbmVkIClcbiAgICB7XG4gICAgICByZXN1bHQgPSB0aGlzLnVuaWNvZGVTZXJ2aWNlLnJlbW92ZURpYWNyaXRpY3MoYm94TnVtYmVyKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygnVHJhbnNmb3JtZWQgc3RyZWV0IG51bWJlcjonLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cblxuICBvbkNoYW5nZWRMYW5ndWFnZSgpIHtcbiAgICAvLyB0aGlzLnBsYWNlSG9sZGVyVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdib3hOdW1iZXIucGxhY2Vob2xkZXIuaW5wdXQtcGxhY2Vob2xkZXInKTtcbiAgICAvLyBjb25zb2xlLmxvZygncGxhY2UgaG9sZGVyJywgdGhpcy5wbGFjZUhvbGRlclRleHQpO1xuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoJ2JveE51bWJlci5wbGFjZWhvbGRlci5pbnB1dC1wbGFjZWhvbGRlcicpXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnbmV3IHBsYWNlaG9sZGVyJywgcmVzKTtcbiAgICAgICAgLy8gPT4gJ2hlbGxvIHdvcmxkJ1xuICAgICAgICB0aGlzLnBsYWNlSG9sZGVyVGV4dCA9IHJlcztcbiAgICAgICAgdGhpcy5zZXRFbXB0eVJlc3BvbnNlVGV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0RW1wdHlSZXNwb25zZVRleHQoKSB7XG4gICAgLy8gdGhpcy5lbXB0eVJlc3BvbnNlVGV4dCA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnbm90LWluLWxpc3QnKTtcbiAgICB0aGlzLmVtcHR5UmVzcG9uc2VUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2JveE51bWJlci5tZXNzYWdlLm5vdC1pbi1saXN0Jyk7XG4gIH1cblxuICBvbkNsZWFySW5wdXRFdmVudChldmVudCwgZm9jdXMpIHtcbiAgICB0aGlzLmNsZWFySW5wdXQoZm9jdXMpO1xuICB9XG5cbiAgb25CbHVyKGV2KSB7XG4gICAgaWYgKHRoaXMuaXNCcm93c2VySUUoKSAmJiB0aGlzLmlzRHJvcGRvd25DbGlja2VkKGV2KSkge1xuICAgICAgdGhpcy5ib3hOdW1iZXJTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNraXBOZXh0Qmx1cikge1xuICAgICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoQUREUkVTU0xFVkVMLkJPWF9OVU1CRVIpO1xuICAgIH1cbiAgfVxuXG4gIGlzQnJvd3NlcklFKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvbXNpZVxcc3x0cmlkZW50XFwvfGVkZ2VcXC8vaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIGlzRHJvcGRvd25DbGlja2VkKGV2KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXYuZXhwbGljaXRPcmlnaW5hbFRhcmdldCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiAodGFyZ2V0LmlkID09PSAnYnBhYWMtYm94LWRyb3Bkb3duJyk7XG4gIH1cblxuICBvbkZvY3VzKCkge1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGZhbHNlO1xuICAgIC8vIHRoaXMuY29sbGFwc2VEcm9wZG93biA9ICh0aGlzLnByZWZpbGxpbmcgPT09IHRydWUgJiYgdGhpcy5wcmVmaWxsRGF0YSAhPT0gbnVsbClcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgID8gIXRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5vbkZvY3VzU2hvd1N1Z2dlc3Rpb25zQWZ0ZXJQcmVmaWxsIDogZmFsc2U7XG4gICAgLy8gdGhpcy5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdChBRERSRVNTTEVWRUwuQk9YX05VTUJFUik7XG4gIH1cblxuICB2YWx1ZUNoYW5nZWQoKSB7XG4gICAgdGhpcy50ZXh0Q2hhbmdlRXZlbnQuZW1pdCh0aGlzLnNlYXJjaFRleHQpO1xuICB9XG5cbiAgbWF5U2hvd0Ryb3Bkb3duKCkge1xuICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgJiYgIXRoaXMuY29sbGFwc2VEcm9wZG93bjtcbiAgfVxuXG4gIGJ1aWxkSW5wdXRXb3JkTGlzdCgpIHtcbiAgICB0aGlzLndvcmRMaXN0ID0gdGhpcy5zZWFyY2hUZXh0LnNwbGl0KC9bXFxzLCBdKy8pO1xuICB9XG5cbiAgbWF5QWRkVHlwZUFoZWFkKHNvdXJjZT86IFNvdXJjZVR5cGUpIHtcbiAgICBpZiAoc291cmNlID09PSBTb3VyY2VUeXBlLlNPVVJDRV9QUkVGSUxMRUQgKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0aGlzLnNlYXJjaFRleHQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoL1teXFxzLCBcXFxcXFwvXSQvKS50ZXN0KHRoaXMuc2VhcmNoVGV4dCk7XG4gIH1cblxuICBidWlsZFR5cGVBaGVhZChzb3VyY2U/OiBTb3VyY2VUeXBlKSB7XG4gICAgaWYgKCF0aGlzLm1heUFkZFR5cGVBaGVhZChzb3VyY2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFRleHRXb3JkcyA9IHRoaXMuc2VhcmNoVGV4dC5zcGxpdCgvW1xccywgXSsvKTtcbiAgICBjb25zdCBsYXN0V29yZCA9IHNlYXJjaFRleHRXb3Jkc1tzZWFyY2hUZXh0V29yZHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAodGhpcy5zdWdnZXN0aW9ucy5zb21lKGZ1bmN0aW9uKHN1Zykge1xuICAgICAgaWYgKCFzdWcgfHwgIXN1Zy5oYXNPd25Qcm9wZXJ0eSgnc3RyaW5nJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1Zy5zdHJpbmcuc3BsaXQoL1tcXHMtXSsvKS5zb21lKGZ1bmN0aW9uKHdvcmQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZURpYWNyaXRpY3Mod29yZCwgbGFzdFdvcmQpKSB7XG4gICAgICAgICAgdGhpcy50eXBlQWhlYWRXb3JkID0gd29yZDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LmJpbmQodGhpcykpKSB7XG4gICAgICBjb25zdCBhcHBlbmRpeCA9IHRoaXMudHlwZUFoZWFkV29yZC5zbGljZShsYXN0V29yZC5sZW5ndGgsIHRoaXMudHlwZUFoZWFkV29yZC5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmJwVHlwZUFoZWFkID0gdGhpcy5zZWFyY2hUZXh0ICsgYXBwZW5kaXg7XG4gICAgfVxuICB9XG5cbiAgc3RyaW5nU3RhcnRzV2l0aElnbm9yZURpYWNyaXRpY3ModmFsdWUsIHByZWZpeCkge1xuICAgIHZhbHVlID0gKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuICAgIHByZWZpeCA9IChwcmVmaXggIT09IG51bGwgJiYgcHJlZml4ICE9PSB1bmRlZmluZWQpID8gcHJlZml4LnRvTG93ZXJDYXNlKCkgOiBwcmVmaXg7XG4gICAgcmV0dXJuIHRoaXMudW5pY29kZVNlcnZpY2UucmVtb3ZlRGlhY3JpdGljcyh2YWx1ZSkuc2xpY2UoMCwgcHJlZml4Lmxlbmd0aClcbiAgICAgIC50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy51bmljb2RlU2VydmljZS5yZW1vdmVEaWFjcml0aWNzKHByZWZpeCkpICE9PSAtMTtcbiAgfVxuXG4gIGdldFRvcFN1Z2dlc3Rpb25zKHNvdXJjZT86IFNvdXJjZVR5cGUpIHtcbiAgICB0aGlzLnNlcXVlbmNlTnVtYmVyICs9IDE7XG4gICAgY29uc3QgcGFyYW0gPSB0aGlzLmdlbmVyYXRlUGFyYW1ldGVycygpO1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ0JPWC1OVU1CRVIgY2FsbGluZyBzZXJ2aWNlIHBhcmFtcycsIHBhcmFtKTsgfVxuICAgIGlmICh0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5hZGRyZXNzU2VydmljZS5nZXRCb3godGhpcy5iYXNlVXJsLCB0aGlzLmxvY2FsaXR5LCB0aGlzLnBvc3RhbENvZGUsIHBhcmFtKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0Qm94UmVzcG9uc2UocmVzcG9uc2UsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlID09PSBTb3VyY2VUeXBlLlNPVVJDRV9QUkVGSUxMRUQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoaXMuaXNQcmVmaWxsV2l0aE5vTWF0Y2ggPSB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxCb3hOdW1iZXJQZXJmZWN0TWF0Y2hGb3VuZCA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5wcmVmaWxsQW5hbHl6ZURhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhpcy5pc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAsXG4gICAgICAgICAgKCkgPT4gdGhpcy5oYW5kbGVHZXRCb3hFcnJvcigpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGdldFRleHRDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAoIHRoaXMuaXNQcmVmaWxsV2l0aE5vTWF0Y2ggPT09IHRydWUgKSA/ICdvcmFuZ2VyZWQnIDogJyc7XG4gIH1cblxuICBwcmVmaWxsQW5hbHl6ZURhdGEoKVxuICB7XG4gICAgaWYgKHRoaXMucHJlZmlsbERhdGEucHJlZmlsbEJveE51bWJlclBlcmZlY3RNYXRjaEZvdW5kID09PSB0cnVlKVxuICAgIHtcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMucHJlZmlsbEV2ZW50RW1pdHRlci5lbWl0KG5ldyBQcmVmaWxsRXZlbnQoQUREUkVTU0xFVkVMLkJPWF9OVU1CRVIsIHRoaXMucHJlZmlsbERhdGEpICk7XG4gIH1cblxuICBsb2FkUGFyYW1zKHByZWZpbGxEYXRhOiBQcmVmaWxsRGF0YSkge1xuICAgIGxldCBjb25jYXRTdHIgPSAnJztcbiAgICBpZiAocHJlZmlsbERhdGEgIT09IG51bGwgJiYgcHJlZmlsbERhdGEucGFyYW1ldGVycyAhPT0gbnVsbClcbiAgICB7XG4gICAgICBpZiAocHJlZmlsbERhdGEucGFyYW1ldGVycy5oYXNPd25Qcm9wZXJ0eSgnbWluTGV2ZWwnKSkge1xuICAgICAgICB0aGlzLm1pbkxldmVsID0gcHJlZmlsbERhdGEucGFyYW1ldGVycy5taW5MZXZlbDtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KCdwb3N0YWxDb2RlJykgJiYgdGhpcy5pc1N0cmluZyhwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnBvc3RhbENvZGUpKSB7XG4gICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KCdtdW5pY2lwYWxpdHlOYW1lJykgJiYgdGhpcy5pc1N0cmluZyhwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm11bmljaXBhbGl0eU5hbWUpKSB7XG4gICAgICAgIHRoaXMubG9jYWxpdHkgPSBwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm11bmljaXBhbGl0eU5hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJlZmlsbERhdGEucGFyYW1ldGVycy5oYXNPd25Qcm9wZXJ0eSgnc3RyZWV0TmFtZScpICYmIHRoaXMuaXNTdHJpbmcocHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lKSkge1xuICAgICAgICB0aGlzLnN0cmVldE5hbWUgPSBwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE5hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJlZmlsbERhdGEucGFyYW1ldGVycy5oYXNPd25Qcm9wZXJ0eSgnc3RyZWV0TnVtYmVyJykgJiYgdGhpcy5pc1N0cmluZyhwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE51bWJlcikpIHtcbiAgICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSBwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE51bWJlcjtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KCdib3hOdW1iZXInKVxuICAgICAgICAgICYmIHRoaXMuaXNTdHJpbmcocHJlZmlsbERhdGEucGFyYW1ldGVycy5ib3hOdW1iZXIpICYmIHRoaXMuaXNQYXJhbXNDb21wbGV0ZSgpKSB7XG4gICAgICAgIGNvbmNhdFN0ciA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuYm94TnVtYmVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uY2F0U3RyO1xuICB9XG5cbiAgaXNTdHJpbmcodmFsKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yID09PSBTdHJpbmc7XG4gIH1cblxuICBpc1ZhbGlkKHZhbCkge1xuICAgIHJldHVybiB0aGlzLmlzU3RyaW5nKHZhbCkgJiYgdmFsICE9PSAnJztcbiAgfVxuXG4gIGlzUGFyYW1zQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCh0aGlzLnBvc3RhbENvZGUpICYmIHRoaXMuaXNWYWxpZCh0aGlzLmxvY2FsaXR5KSAmJiB0aGlzLmlzVmFsaWQodGhpcy5zdHJlZXROYW1lKSAmJiB0aGlzLmlzVmFsaWQodGhpcy5zdHJlZXROdW1iZXIpO1xuICB9XG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJzKCk6IFF1ZXJ5UGFyYW1ldGVycyB7XG4gICAgLy8gdHNsaW50OmRpc2FibGVcbiAgICBjb25zdCBwYXJhbSA9IG5ldyBRdWVyeVBhcmFtZXRlcnMoe1xuICAgICAgaWQ6IHRoaXMuc2VxdWVuY2VOdW1iZXIsXG4gICAgICBxOiB0aGlzLnNlYXJjaFRleHQsXG4gICAgICBwb3N0YWxDb2RlOiB0aGlzLnBvc3RhbENvZGUsXG4gICAgICBsb2NhbGl0eTogdGhpcy5sb2NhbGl0eSxcbiAgICAgIHN0cmVldDogdGhpcy5zdHJlZXROYW1lLFxuICAgICAgc3RyZWV0TnVtYmVyOiB0aGlzLnN0cmVldE51bWJlcixcbiAgICAgIG1heE51bWJlck9mU3VnZ2VzdGlvbnM6IHRoaXMubWF4U3VnZ2VzaW9uQ291bnRcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnNvcnRDcml0ZXJpYSA9PT0gJ0InKSB7XG4gICAgICBwYXJhbS5zb3J0QnlCb3godHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbTtcbiAgfVxuXG4gIGhhbmRsZUdldEJveFJlc3BvbnNlKGRhdGE6IGFueSwgc291cmNlPzogU291cmNlVHlwZSkge1xuICAgIGlmIChkYXRhICYmIGRhdGEucmVzcG9uc2UgJiYgZGF0YS5yZXNwb25zZS5zZXF1ZW5jZU51bWJlciAmJiBkYXRhLnJlc3BvbnNlLnNlcXVlbmNlTnVtYmVyID49IHRoaXMuY29uc3VtZWROdW1iZXIgJiZcbiAgICAgIGRhdGEucmVzcG9uc2UudG9wU3VnZ2VzdGlvbnMpIHtcbiAgICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSBkYXRhLnJlc3BvbnNlLnNlcXVlbmNlTnVtYmVyO1xuICAgICAgdGhpcy5jbGVhclN1Z2dlc3Rpb25zKCk7XG4gICAgICB0aGlzLnBhcnNlVG9wU3VnZ2VzdGlvbnMoZGF0YS5yZXNwb25zZS50b3BTdWdnZXN0aW9ucywgc291cmNlKTtcbiAgICAgIHRoaXMuYnVpbGRUeXBlQWhlYWQoc291cmNlKTtcbiAgICAgIHRoaXMuY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCk7XG4gICAgICB0aGlzLmJ1aWxkSW5wdXRXb3JkTGlzdCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSAodGhpcy5wcmVmaWxsaW5nID09PSB0cnVlICYmIHRoaXMucHJlZmlsbERhdGEgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAhdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm9uRm9jdXNTaG93U3VnZ2VzdGlvbnNBZnRlclByZWZpbGwgOiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZUdldEJveEVycm9yKCkge1xuICAgIHRoaXMuc2V0Q29ubmVjdGlvbkVycm9yTWVzc2FnZSgpO1xuICB9XG5cbiAgc2V0Q29ubmVjdGlvbkVycm9yTWVzc2FnZSgpIHtcbiAgICB0aGlzLmVycm9yQ29kZSA9ICdzZXJ2aWNlLXVuYXZhaWxhYmxlJztcbiAgICAvLyB0aGlzLnNldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuZXJyb3JDb2RlKTtcbiAgICB0aGlzLmVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLlNlcnZpY2VfVW5hdmFpbGFibGUpO1xuICB9XG5cbiAgY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5lcnJvckNvZGUpO1xuICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlID09PSByZXMgKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JDb2RlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwYXJzZVRvcFN1Z2dlc3Rpb25zKHRvcFN1Z2dlc3Rpb25zLCBzb3VyY2U/OiBTb3VyY2VUeXBlKSB7XG4gICAgaWYgKHRvcFN1Z2dlc3Rpb25zLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xuICAgICAgLy8gdG9wU3VnZ2VzdGlvbnMuZm9yRWFjaCh0aGlzLnBhcnNlU2luZ2xlU3VnZ2VzdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgIGZvciAoY29uc3Qgc3VnIG9mIHRvcFN1Z2dlc3Rpb25zKVxuICAgICAge1xuICAgICAgICB0aGlzLnBhcnNlU2luZ2xlU3VnZ2VzdGlvbihzdWcsIHNvdXJjZSk7XG4gICAgICB9XG4gICAgICBpZighc291cmNlKVxuICAgICAge1xuICAgICAgICBpZiAoKHRvcFN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmVtcHR5UmVzcG9uc2UpICYmIHRoaXMubm90SW5MaXN0QWxsb3dlZCkge1xuICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnMucHVzaCh7c3RyaW5nOiB0aGlzLnNlYXJjaFRleHQsICdub3QtaW4tbGlzdCc6IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICAvLyBJZiBwcmVmaWxsaW5nLCB0aGVuIGNoZWNrIGlmIG5vIG1hdGNoIGZvciBhIG5vbi1lbXB0eSBib3hOdW1iZXJcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgY2FzZSwgc2ltdWxhdGUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgJ25vdC1pbi1saXN0JyBzdWdnZXN0aW9uXG4gICAgICAgIGlmKHRoaXMucHJlZmlsbGluZyAmJiB0aGlzLm5vdEluTGlzdEFsbG93ZWRcbiAgICAgICAgICAgICYmIHRoaXMucHJlZmlsbERhdGEucHJlZmlsbEJveE51bWJlclBlcmZlY3RNYXRjaEZvdW5kID09PSBmYWxzZSBcbiAgICAgICAgICAgICYmIHRoaXMucHJlZmlsbERhdGEucHJlZmlsbEJveE51bWJlciAhPT0gbnVsbCBcbiAgICAgICAgICAgICYmIHRoaXMucHJlZmlsbERhdGEucHJlZmlsbEJveE51bWJlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxCb3hOdW1iZXIubGVuZ3RoID4gMClcbiAgICAgICAge1xuICAgICAgICAgIC8vIGNvbnN0IG5vdEluTGlzdFN1Z2dlc3Rpb24gPSB7c3RyaW5nOiB0aGlzLnNlYXJjaFRleHQsICdub3QtaW4tbGlzdCc6IHRydWV9O1xuICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSB0aGlzLnByZWZpbGxCdWlsZE5vdEluTGlzdFN1Z2dlc3Rpb24oKTtcbiAgICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdCT1ggTlVNQkVSIC0gUFJFRklMTCBOT1QgSU4gTElTVCBTVUdHRVNUSU9OOicsIHN1Z2dlc3Rpb24pOyB9XG4gICAgICAgICAgdGhpcy5wcmVmaWxsQ2hlY2tGb3JQZXJmZWN0TWF0Y2goc3VnZ2VzdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnNlU2luZ2xlU3VnZ2VzdGlvbih0b3BTdWdnZXN0aW9ucywgc291cmNlKTtcbiAgICB9XG4gIH1cblxuICBwcmVmaWxsQnVpbGROb3RJbkxpc3RTdWdnZXN0aW9uKCk6IGFueSB7XG4gICAgY29uc3Qgbm90SW5MaXN0U3VnZ2VzdGlvbiA9IHtzdHJpbmc6IHRoaXMuc2VhcmNoVGV4dCwgJ25vdC1pbi1saXN0JzogdHJ1ZX07XG4gICAgY29uc3Qgc3RyZWV0TnVtYmVyU3VnZ2VzdGlvbiA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbFN0cmVldE51bWJlclBlcmZlY3RNYXRjaFN1Z2dlc3Rpb247XG4gICAgY29uc3QgY29tYmluZWQgPSB7Li4uc3RyZWV0TnVtYmVyU3VnZ2VzdGlvbi5hZGRyZXNzLCAuLi5ub3RJbkxpc3RTdWdnZXN0aW9ufTtcbiAgICBkZWxldGUgY29tYmluZWQubWFpbEJveGlkO1xuICAgIGRlbGV0ZSBjb21iaW5lZC5zdWZmaXhJZDtcbiAgICBjb21iaW5lZC5ib3hOdW1iZXIgPSBjb21iaW5lZC5zdHJpbmc7XG4gICAgY29tYmluZWQuc2VhcmNoQmFyU3RyaW5nID0gY29tYmluZWQuc3RyaW5nO1xuICAgIGNvbWJpbmVkLmlzQ29tcGxldGUgPSB0cnVlO1xuICAgIHN0cmVldE51bWJlclN1Z2dlc3Rpb24uYWRkcmVzcyA9IGNvbWJpbmVkO1xuICAgIHJldHVybiBzdHJlZXROdW1iZXJTdWdnZXN0aW9uO1xuICB9XG5cbiAgcGFyc2VTaW5nbGVTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IGFueSwgc291cmNlOiBTb3VyY2VUeXBlKSB7XG4gICAgbGV0IHN1Z2dlc3Rpb25Ub0FkZDogYW55O1xuICAgIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVGcmVuY2goKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdmcmVuY2gnKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5mcmVuY2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVEdXRjaCgpICYmIHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2R1dGNoJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uZHV0Y2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVHZXJtYW4oKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdnZXJtYW4nKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5nZXJtYW47XG4gICAgfSBlbHNlIGlmIChzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdhZGRyZXNzJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICB9XG4gICAgaWYgKHN1Z2dlc3Rpb25Ub0FkZCkge1xuICAgICAgaWYgKHN1Z2dlc3Rpb24ubWVzc2FnZXMpIHtcbiAgICAgICAgc3VnZ2VzdGlvblRvQWRkLm1lc3NhZ2VzID0gc3VnZ2VzdGlvbi5tZXNzYWdlcztcbiAgICAgIH1cbiAgICAgIGlmIChzdWdnZXN0aW9uVG9BZGQuYm94TnVtYmVyID09PSB0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnN1Z2dlc3Rpb25zLnB1c2goc3VnZ2VzdGlvblRvQWRkKTtcbiAgICAgIGlmIChzb3VyY2UgPT09IFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRClcbiAgICAgIHtcbiAgICAgICAgc3VnZ2VzdGlvbi5hZGRyZXNzID0gc3VnZ2VzdGlvblRvQWRkO1xuICAgICAgICB0aGlzLnByZWZpbGxDaGVja0ZvclBlcmZlY3RNYXRjaChzdWdnZXN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmVmaWxsQ2hlY2tGb3JQZXJmZWN0TWF0Y2goc3VnZ2VzdGlvbilcbiAge1xuICAgIC8vaWYgKCAhdGhpcy5hZGRyZXNzSXNDb21wbGV0ZSApXG4gICAge1xuICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnYm94IG51bWJlciAtIGNoZWNraW5nIHN1Z2dlc3Rpb24gZm9yIHBlcmZlY3QgbWF0Y2gnLCB0aGlzLnByZWZpbGxEYXRhLCBzdWdnZXN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1Z0FkZHJlc3MgPSBzdWdnZXN0aW9uLmFkZHJlc3M7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uQm94TnVtYmVyID0gdGhpcy50cmFuc2Zvcm1Cb3hOdW1iZXJJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKCcnICsgc3VnQWRkcmVzcy5ib3hOdW1iZXIpO1xuICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnY29tcGFyaW5nIGJveCBudW1iZXJzJywgc3VnZ2VzdGlvbkJveE51bWJlciwgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsQm94TnVtYmVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdWdnZXN0aW9uQm94TnVtYmVyID09PSAoJycgKyB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxCb3hOdW1iZXIpIClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsQm94TnVtYmVyUGVyZmVjdE1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxCb3hOdW1iZXJQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uID0gc3VnZ2VzdGlvbjtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc3VnQWRkcmVzcy5ib3hOdW1iZXI7XG4gICAgICAgIGlmIChzdWdBZGRyZXNzLmhhc093blByb3BlcnR5KCdpc0NvbXBsZXRlJykgJiYgc3VnQWRkcmVzcy5pc0NvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5jbGlja1N1Z2dlc3Rpb24obnVsbCwgc3VnQWRkcmVzcyk7XG4gICAgICAgICAgLy8gdGhpcy5hZGRyZXNzSXNDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FERFJFU1MgQ09NUExFVEUgT04gQk9YIE5VTUJFUiAhJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGVsc2VcbiAgICB7XG4gICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBZGRyZXNzIGNvbXBsZXRlLCBza2lwcGluZyBzdWdnZXN0aW9uIGNoZWNrJywgc3VnZ2VzdGlvbik7XG4gICAgICB9XG4gICAgfSAqL1xuICB9XG5cbiAgb25JbnB1dENoYW5nZShzb3VyY2U/OiBTb3VyY2VUeXBlKSB7XG4gICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gZmFsc2U7XG4gICAgdGhpcy5lbXB0eVJlc3BvbnNlID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0QXJyb3dTZWxlY3RlZEluZGV4KCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHRoaXMucHJlZmlsbGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZWQoKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhclN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSgpO1xuICAgIGlmICh0aGlzLnNlYXJjaFRleHQgPT09ICcnKSB7XG4gICAgICB0aGlzLnNlcXVlbmNlTnVtYmVyICs9IDE7XG4gICAgICB0aGlzLmNvbnN1bWVkTnVtYmVyID0gdGhpcy5zZXF1ZW5jZU51bWJlcjtcbiAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFRvcFN1Z2dlc3Rpb25zKHNvdXJjZSk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRJbnB1dFdvcmRMaXN0KCk7XG4gIH1cblxuICBjbGlja1N1Z2dlc3Rpb24oZXZlbnQ6IGFueSwgc3VnZ2VzdGlvbj86IGFueSkge1xuICAgIHRoaXMuaXNQcmVmaWxsV2l0aE5vTWF0Y2ggPSBmYWxzZTtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoc3VnZ2VzdGlvbikge1xuICAgICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgICAgdGhpcy5yZXNldEFycm93U2VsZWN0ZWRJbmRleCgpO1xuICAgICAgaWYgKHN1Z2dlc3Rpb24uc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dChzdWdnZXN0aW9uLnN0cmluZyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSB0cnVlO1xuICAgICAgLy8gaWYgKHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2lzQ29tcGxldGUnKSkge1xuICAgICAgLy8gICB0aGlzLnNob3dBZGRyZXNzSXNWYWxpZGF0ZWQoKTtcbiAgICAgIC8vIH1cbiAgICAgIGlmIChzdWdnZXN0aW9uWydub3QtaW4tbGlzdCddKSB7XG4gICAgICAgIHN1Z2dlc3Rpb24gPSB0aGlzLm1vZGlmeVNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgIHN1Z2dlc3Rpb24uaXNDb21wbGV0ZSA9IHRydWU7XG4gICAgICB0aGlzLnNldFNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBtb2RpZnlTZWxlY3RlZEFkZHJlc3Moc3VnZ2VzdGlvbjogb2JqZWN0KSB7XG4gICAgY29uc3QgY29tYmluZWQgPSB7Li4udGhpcy5zZWxlY3RlZEFkZHJlc3MsIC4uLnN1Z2dlc3Rpb259O1xuICAgIGRlbGV0ZSBjb21iaW5lZC5tYWlsQm94aWQ7XG4gICAgZGVsZXRlIGNvbWJpbmVkLnN1ZmZpeElkO1xuICAgIGNvbWJpbmVkLmJveE51bWJlciA9IGNvbWJpbmVkLnN0cmluZztcbiAgICBjb21iaW5lZC5zZWFyY2hCYXJTdHJpbmcgPSBjb21iaW5lZC5zdHJpbmc7XG4gICAgY29tYmluZWQuaXNDb21wbGV0ZSA9IHRydWU7XG4gICAgcmV0dXJuIGNvbWJpbmVkO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRBZGRyZXNzKHN1Z2dlc3Rpb246IGFueSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdib3ggbnVtYmVyOjpzZXRTZWxlY3RlZEFkZHJlc3MnLCBzdWdnZXN0aW9uKTtcbiAgICB0aGlzLmFkZHJlc3NJc1ZhbGlkYXRlZCA9IChzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdpc0NvbXBsZXRlJykgJiYgc3VnZ2VzdGlvbi5pc0NvbXBsZXRlID09PSB0cnVlKSA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQoc3VnZ2VzdGlvbik7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkQWRkcmVzcygpIHtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQobnVsbCk7XG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qXG4gIHNldFZhbGlkYXRpb25NZXNzYWdlKHRyYW5zbGF0aW9uQ29kZSwgb3B0aW9ucz8sIHJldHJhbnNsYXRlT3B0aW9ucz8pIHtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHJldHJhbnNsYXRlT3B0aW9ucyAmJiB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25zWyd1bnRyYW5zbGF0ZWQtc3ByaW50ZiddKSAmJlxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZU9wdGlvbnMuc3ByaW50Zikge1xuICAgICAgY29uc3QgdHJhbnNsYXRlZEVsZW1lbnRzID0gW107XG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9uc1sndW50cmFuc2xhdGVkLXNwcmludGYnXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgdHJhbnNsYXRlZEVsZW1lbnRzLnB1c2godGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKGVsZW1lbnQpKTtcbiAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgKTtcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25zLnNwcmludGYgPSB0cmFuc2xhdGVkRWxlbWVudHM7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VDb2RlID0gdHJhbnNsYXRpb25Db2RlO1xuICAgIC8vIGVtaXQgdHJhbnNsYXRpb24ga2V5IHRvIHdyYXBwZXIgY29tcG9uZW50IGZvciBjdXN0b21pemVkIHRyYW5zbGF0aW9uc1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSh0aGlzLnZhbGlkYXRpb25NZXNzYWdlQ29kZSwgdGhpcy52YWxpZGF0aW9uTWVzc2FnZU9wdGlvbnMpO1xuICAgICAgdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VDb2RlKTtcbiAgICB9XG4gIH1cbiAgKi9cblxuICBlbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKHZhbGlkYXRpb25NZXNzYWdlVHlwZTogVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLCBvcHRpb25zPzogc3RyaW5nW10pIHtcbiAgICAvLyBNb21lbnRseSwgb3B0aW9ucyBhcmUgTk9UIHVzZWQ7IHNvIGRhdGEgdHlwZSBvZiB0aGVzZSBvcHRpb25zIHdpbGwgYmUgcmV2aWV3ZWQgb25jZSBuZWVkZWQuXG4gICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlVHlwZSA9PT0gbnVsbCB8fCB2YWxpZGF0aW9uTWVzc2FnZVR5cGUgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIGVtaXQgdmFsaWRhdGlvbiBtZXNzYWdlIC0gbWVzc2FnZSBrZXkgaXMgaW52YWxpZCEnLCB2YWxpZGF0aW9uTWVzc2FnZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAodmFsaWRhdGlvbk1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgIGNhc2UgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLkFkZHJlc3NfTm90X0ZvdW5kOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uTWVzc2FnZVR5cGUuQWRkcmVzc19WYWxpZGF0ZWQ6XG4gICAgICBjYXNlIFZhbGlkYXRpb25NZXNzYWdlVHlwZS5TZXJ2aWNlX1VuYXZhaWxhYmxlOiB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHZhbGlkYXRpb25NZXNzYWdlVHlwZSk7XG4gICAgICAgICAgLy8gdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KG1lc3NhZ2UpO1xuICAgICAgICAgIHRoaXMubWVzc2FnZUNoYW5nZWQuZW1pdCh7bWVzc2FnZVR5cGU6IHZhbGlkYXRpb25NZXNzYWdlVHlwZSwgdHJhbnNsYXRlZE1lc3NhZ2U6IG1lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YWxpZ25cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gZW1pdCB2YWxpZGF0aW9uIG1lc3NhZ2UgLSBtZXNzYWdlIGtleSBOT1Qgc3VwcG9ydGVkIScsIHZhbGlkYXRpb25NZXNzYWdlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmFsaWduXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICB9XG4gIHNob3dBZGRyZXNzSXNWYWxpZGF0ZWQoKSB7XG4gICAgLy8gdGhpcy5zZXRWYWxpZGF0aW9uTWVzc2FnZSgnYWRkcmVzcy12YWxpZGF0ZWQnKTtcbiAgICB0aGlzLmVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLkFkZHJlc3NfVmFsaWRhdGVkKTtcbiAgfVxuXG4gIGNoZWNrS2V5RG93bihldmVudCkge1xuICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgIC8vIGRvd24ga2V5LCBpbmNyZW1lbnQgc2VsZWN0ZWRJbmRleFxuICAgICAgY2FzZSA0MDpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlQXJyb3dTZWxlY3RlZEluZGV4RG93bigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gdXAga2V5LCBkZWNyZW1lbnQgc2VsZWN0ZWRJbmRleFxuICAgICAgY2FzZSAzODpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlQXJyb3dTZWxlY3RlZEluZGV4VXAoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyByaWdodCBhcnJvdyBrZXlcbiAgICAgIGNhc2UgMzk6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcklzT25TdWdnZXN0aW9uTGlzdCgpKSB7XG4gICAgICAgICAgdGhpcy5jbGlja1N1Z2dlc3Rpb24oZXZlbnQsIHRoaXMuc3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMudHlwZUFoZWFkV29yZCAmJiB0aGlzLnR5cGVBaGVhZElzU2hvd24oKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWFyY2hUZXh0KHRoaXMuYnBUeXBlQWhlYWQpO1xuICAgICAgICAgICAgdGhpcy50eXBlQWhlYWRXb3JkID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gdGFiIGtleVxuICAgICAgY2FzZSA5OlxuICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RGaXJzdEluTGlzdE9mU3VnZ2VzaW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDQ2OlxuICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIGVudGVyIHByZXNzZWRcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcklzT25TdWdnZXN0aW9uTGlzdCgpKSB7XG4gICAgICAgICAgdGhpcy5jbGlja1N1Z2dlc3Rpb24oZXZlbnQsIHRoaXMuc3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuY2xlYXJUeXBlQWhlYWQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICB9XG4gIH1cblxuICBjbGVhcldpZGdldCgpIHtcbiAgICB0aGlzLmFkZHJlc3NJc1ZhbGlkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XG4gICAgdGhpcy5jbGVhclN1Z2dlc3Rpb25zKCk7XG4gICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgIHRoaXMucHJlZmlsbERhdGEgPSBudWxsO1xuICAgIC8vIHRoaXMucHJlZmlsbGluZyA9IGZhbHNlO1xuICB9XG5cbiAgY2xlYXJTZWFyY2hUZXh0KCkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICB9XG5cbiAgdHlwZUFoZWFkSXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5icFR5cGVBaGVhZCAmJiB0aGlzLmJwVHlwZUFoZWFkLmxlbmd0aCA+IDA7XG4gIH1cblxuICByZXNldEFycm93U2VsZWN0ZWRJbmRleCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxuXG4gIG1vdmVBcnJvd1NlbGVjdGVkSW5kZXhEb3duKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggKyAxICE9PSB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4Kys7XG4gICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5zZXRTZWFyY2hUZXh0QmFzZWRPbkFycm93U2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWRJbmRleCwgdGhpcy5zZWxlY3RlZEluZGV4IC0gMSk7XG4gICAgfVxuICB9XG5cbiAgbW92ZUFycm93U2VsZWN0ZWRJbmRleFVwKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggLSAxICE9PSAtMikge1xuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4LS07XG4gICAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5zZXRTZWFyY2hUZXh0QmFzZWRPbkFycm93U2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWRJbmRleCwgdGhpcy5zZWxlY3RlZEluZGV4ICsgMSk7XG4gICAgfVxuICB9XG5cbiAgY3Vyc29ySXNPblN1Z2dlc3Rpb25MaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW5kZXggPj0gMDtcbiAgfVxuXG4gIHNldFNlYXJjaFRleHRCYXNlZE9uQXJyb3dTZWxlY3Rpb24obmV3VmFsLCBvbGRWYWwpIHtcbiAgICBpZiAobmV3VmFsID09PSB1bmRlZmluZWQgfHwgdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGggPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmV3VmFsICE9PSAtMSkge1xuICAgICAgaWYgKG9sZFZhbCA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5sYXN0U2VhcmNoVmFsdWUgPSB0aGlzLnNlYXJjaFRleHQ7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNlYXJjaFRleHQodGhpcy5zdWdnZXN0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnN0cmluZyk7XG4gICAgICB0aGlzLmNsZWFyVHlwZUFoZWFkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dCh0aGlzLmxhc3RTZWFyY2hWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWF5U2hvd0NsZWFyQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFRleHQubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGNsZWFySW5wdXQoZm9jdXM/LCBlbWl0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICB0aGlzLnJlc2V0QXJyb3dTZWxlY3RlZEluZGV4KCk7XG4gICAgdGhpcy5wcmV2aW91c0luZGV4ID0gLTE7XG4gICAgdGhpcy5sYXN0U2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmNsZWFyU3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKCk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLmNsZWFyQ29ubmVjdGlvbkVycm9yTWVzc2FnZSgpO1xuICAgIGlmIChmb2N1cyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5ib3hOdW1iZXJTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIC8vIHRoaXMuYWRkcmVzc0NoYW5nZWQuZW1pdChudWxsKTtcbiAgICBpZihlbWl0KSB7XG4gICAgICB0aGlzLmNsZWFySW5wdXRFdmVudEVtaXR0ZXIuZW1pdCgvKidCT1hfTlVNQkVSJyovIElucHV0TmFtZVR5cGUuQk9YX05VTUJFUik7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTdWdnZXN0aW9ucygpIHtcbiAgICB0aGlzLndvcmRMaXN0ID0gW107XG4gICAgdGhpcy5zdWdnZXN0aW9ucyA9IFtdO1xuICAgIHRoaXMuc3VnZ2VzdGlvbnNXb3JkTGlzdCA9IFtdO1xuICB9XG5cbiAgY2xlYXJUeXBlQWhlYWQoKSB7XG4gICAgdGhpcy5icFR5cGVBaGVhZCA9ICcnO1xuICB9XG5cbiAgY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKSB7XG4gICAgdGhpcy5zdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmFkZHJlc3NJc1ZhbGlkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMubWVzc2FnZUNoYW5nZWQuZW1pdCh7bWVzc2FnZVR5cGU6IG51bGwsIHRyYW5zbGF0ZWRNZXNzYWdlOiB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZX0pO1xuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25zID0gbnVsbDtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlQ29kZSA9IG51bGw7XG4gIH1cblxuICBzZXRTZWFyY2hUZXh0KHZhbHVlKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gdmFsdWU7XG4gIH1cblxuICBzZWxlY3RGaXJzdEluTGlzdE9mU3VnZ2VzaW9ucygpIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgIHRoaXMuY2hhbmdlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zZXRTZWFyY2hUZXh0QmFzZWRPbkFycm93U2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWRJbmRleCwgdGhpcy5zZWxlY3RlZEluZGV4IC0gMSk7XG4gIH1cblxuICBjaGFuZ2VTZWxlY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzdWdnZXN0aW9uTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxuXG4gIHNob3dBZGRyZXNzTm90Rm91bmRNZXNzYWdlKCkge1xuICAgIC8vIHRoaXMuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoJ2FkZHJlc3Mtbm90LWZvdW5kJyk7XG4gICAgdGhpcy5lbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX05vdF9Gb3VuZCk7XG4gIH1cblxuICBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiAodGhpcy5sb2NhbGl0eSA9PT0gJycgfHwgdGhpcy5wb3N0YWxDb2RlID09PSAnJyB8fCB0aGlzLm1pbkxldmVsID4gQUREUkVTU0xFVkVMLkJPWF9OVU1CRVIpO1xuICB9XG5cbiAgb25JbnB1dENsaWNrKCkge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ2JveCBudW1iZXIgY2xpY2snKTsgfVxuICB9XG59XG4iXX0=