@bpost/bp-address-auto-complete-by-component 1.1.1 → 1.1.5

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 (173) hide show
  1. package/bpost-bp-address-auto-complete-by-component.d.ts +1 -11
  2. package/esm2020/bpost-bp-address-auto-complete-by-component.mjs +5 -0
  3. package/esm2020/lib/box-number/box-number.component.mjs +873 -0
  4. package/esm2020/lib/enum/address-level.enum.mjs +8 -0
  5. package/esm2020/lib/enum/index.mjs +7 -0
  6. package/esm2020/lib/enum/input-name.enum.mjs +8 -0
  7. package/esm2020/lib/enum/source-type.enum.mjs +5 -0
  8. package/esm2020/lib/enum/suggestion-level-type.enum.mjs +8 -0
  9. package/esm2020/lib/enum/validation-message-option-type.enum.mjs +6 -0
  10. package/esm2020/lib/enum/validation-message-type.enum.mjs +7 -0
  11. package/esm2020/lib/lib-address-autocomplete-by-component.component.mjs +1383 -0
  12. package/esm2020/lib/lib-address-autocomplete-by-component.module.mjs +65 -0
  13. package/esm2020/lib/lib-address-autocomplete-by-component.service.mjs +14 -0
  14. package/esm2020/lib/locality/locality.component.mjs +747 -0
  15. package/{esm2015/lib/model/Locality.js → esm2020/lib/model/Box.mjs} +2 -2
  16. package/esm2020/lib/model/Locality.mjs +30 -0
  17. package/esm2020/lib/model/Street.mjs +30 -0
  18. package/esm2020/lib/model/query-parameters.model.mjs +21 -0
  19. package/esm2020/lib/services/adress.service.mjs +64 -0
  20. package/esm2020/lib/services/http.service.mjs +57 -0
  21. package/esm2020/lib/services/locale.service.mjs +37 -0
  22. package/esm2020/lib/services/nis9.service.mjs +26 -0
  23. package/esm2020/lib/services/unicode.service.mjs +376 -0
  24. package/esm2020/lib/street/street.component.mjs +735 -0
  25. package/esm2020/lib/street-number/street-number.component.mjs +967 -0
  26. package/esm2020/lib/utils/constants.mjs +2 -0
  27. package/esm2020/lib/utils/domhandler.mjs +47 -0
  28. package/esm2020/lib/utils/highlight-suggestion.pipe.mjs +62 -0
  29. package/{esm5/lib/utils/prefill-data.js → esm2020/lib/utils/prefill-data.mjs} +5 -7
  30. package/esm2020/lib/utils/prefilled-parameters.mjs +23 -0
  31. package/esm2020/lib/utils/preflll.event.mjs +7 -0
  32. package/esm2020/lib/utils/visible-suggestion.directive.mjs +39 -0
  33. package/esm2020/public-api.mjs +9 -0
  34. package/fesm2015/{bpost-bp-address-auto-complete-by-component.js → bpost-bp-address-auto-complete-by-component.mjs} +1141 -808
  35. package/fesm2015/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  36. package/{fesm5/bpost-bp-address-auto-complete-by-component.js → fesm2020/bpost-bp-address-auto-complete-by-component.mjs} +2073 -1945
  37. package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  38. package/lib/box-number/box-number.component.d.ts +11 -2
  39. package/lib/enum/index.d.ts +3 -0
  40. package/lib/enum/suggestion-level-type.enum.d.ts +5 -0
  41. package/lib/lib-address-autocomplete-by-component.component.d.ts +9 -0
  42. package/lib/lib-address-autocomplete-by-component.module.d.ts +15 -0
  43. package/lib/lib-address-autocomplete-by-component.service.d.ts +3 -0
  44. package/lib/locality/locality.component.d.ts +3 -0
  45. package/lib/services/adress.service.d.ts +3 -0
  46. package/lib/services/http.service.d.ts +5 -0
  47. package/lib/services/locale.service.d.ts +3 -0
  48. package/lib/services/nis9.service.d.ts +3 -0
  49. package/lib/services/unicode.service.d.ts +3 -0
  50. package/lib/street/street.component.d.ts +3 -0
  51. package/lib/street-number/street-number.component.d.ts +9 -1
  52. package/lib/utils/constants.d.ts +1 -0
  53. package/lib/utils/highlight-suggestion.pipe.d.ts +3 -0
  54. package/lib/utils/visible-suggestion.directive.d.ts +3 -0
  55. package/package.json +23 -13
  56. package/VERSION.md +0 -159
  57. package/address-complete-2020-04-15_23-29-54.png +0 -0
  58. package/address-incomplete-2020-04-15_23-28-40.png +0 -0
  59. package/bpost-bp-address-auto-complete-by-component.metadata.json +0 -1
  60. package/bundles/bpost-bp-address-auto-complete-by-component.umd.js +0 -5689
  61. package/bundles/bpost-bp-address-auto-complete-by-component.umd.js.map +0 -1
  62. package/bundles/bpost-bp-address-auto-complete-by-component.umd.min.js +0 -16
  63. package/bundles/bpost-bp-address-auto-complete-by-component.umd.min.js.map +0 -1
  64. package/esm2015/bpost-bp-address-auto-complete-by-component.js +0 -16
  65. package/esm2015/lib/box-number/box-number.component.js +0 -811
  66. package/esm2015/lib/enum/address-level.enum.js +0 -8
  67. package/esm2015/lib/enum/index.js +0 -4
  68. package/esm2015/lib/enum/input-name.enum.js +0 -8
  69. package/esm2015/lib/enum/source-type.enum.js +0 -5
  70. package/esm2015/lib/enum/validation-message-option-type.enum.js +0 -6
  71. package/esm2015/lib/enum/validation-message-type.enum.js +0 -7
  72. package/esm2015/lib/lib-address-autocomplete-by-component.component.js +0 -1167
  73. package/esm2015/lib/lib-address-autocomplete-by-component.module.js +0 -42
  74. package/esm2015/lib/lib-address-autocomplete-by-component.service.js +0 -14
  75. package/esm2015/lib/locality/locality.component.js +0 -769
  76. package/esm2015/lib/model/Box.js +0 -30
  77. package/esm2015/lib/model/Street.js +0 -30
  78. package/esm2015/lib/model/query-parameters.model.js +0 -21
  79. package/esm2015/lib/services/adress.service.js +0 -68
  80. package/esm2015/lib/services/http.service.js +0 -53
  81. package/esm2015/lib/services/locale.service.js +0 -39
  82. package/esm2015/lib/services/nis9.service.js +0 -30
  83. package/esm2015/lib/services/unicode.service.js +0 -376
  84. package/esm2015/lib/street/street.component.js +0 -749
  85. package/esm2015/lib/street-number/street-number.component.js +0 -900
  86. package/esm2015/lib/utils/domhandler.js +0 -47
  87. package/esm2015/lib/utils/highlight-suggestion.pipe.js +0 -63
  88. package/esm2015/lib/utils/prefill-data.js +0 -24
  89. package/esm2015/lib/utils/prefilled-parameters.js +0 -23
  90. package/esm2015/lib/utils/preflll.event.js +0 -7
  91. package/esm2015/lib/utils/visible-suggestion.directive.js +0 -42
  92. package/esm2015/public-api.js +0 -9
  93. package/esm5/bpost-bp-address-auto-complete-by-component.js +0 -16
  94. package/esm5/lib/box-number/box-number.component.js +0 -831
  95. package/esm5/lib/enum/address-level.enum.js +0 -8
  96. package/esm5/lib/enum/index.js +0 -4
  97. package/esm5/lib/enum/input-name.enum.js +0 -8
  98. package/esm5/lib/enum/source-type.enum.js +0 -5
  99. package/esm5/lib/enum/validation-message-option-type.enum.js +0 -6
  100. package/esm5/lib/enum/validation-message-type.enum.js +0 -7
  101. package/esm5/lib/lib-address-autocomplete-by-component.component.js +0 -1183
  102. package/esm5/lib/lib-address-autocomplete-by-component.module.js +0 -45
  103. package/esm5/lib/lib-address-autocomplete-by-component.service.js +0 -16
  104. package/esm5/lib/locality/locality.component.js +0 -825
  105. package/esm5/lib/model/Box.js +0 -35
  106. package/esm5/lib/model/Locality.js +0 -35
  107. package/esm5/lib/model/Street.js +0 -35
  108. package/esm5/lib/model/query-parameters.model.js +0 -23
  109. package/esm5/lib/services/adress.service.js +0 -72
  110. package/esm5/lib/services/http.service.js +0 -55
  111. package/esm5/lib/services/locale.service.js +0 -40
  112. package/esm5/lib/services/nis9.service.js +0 -31
  113. package/esm5/lib/services/unicode.service.js +0 -379
  114. package/esm5/lib/street/street.component.js +0 -794
  115. package/esm5/lib/street-number/street-number.component.js +0 -920
  116. package/esm5/lib/utils/domhandler.js +0 -51
  117. package/esm5/lib/utils/highlight-suggestion.pipe.js +0 -75
  118. package/esm5/lib/utils/prefilled-parameters.js +0 -25
  119. package/esm5/lib/utils/preflll.event.js +0 -9
  120. package/esm5/lib/utils/visible-suggestion.directive.js +0 -43
  121. package/esm5/public-api.js +0 -9
  122. package/fesm2015/bpost-bp-address-auto-complete-by-component.js.map +0 -1
  123. package/fesm5/bpost-bp-address-auto-complete-by-component.js.map +0 -1
  124. package/install-and-start-demo.bat +0 -11
  125. package/resources/assets/aacwidget/i18n/de.json +0 -62
  126. package/resources/assets/aacwidget/i18n/en.json +0 -62
  127. package/resources/assets/aacwidget/i18n/fr.json +0 -62
  128. package/resources/assets/aacwidget/i18n/nl.json +0 -62
  129. package/resources/assets/aacwidget/scss/aacwidget-custom.scss +0 -81
  130. package/resources/assets/aacwidget/scss/aacwidget-default.scss +0 -424
  131. package/tutorial/aacwidget-tutorial/.editorconfig +0 -16
  132. package/tutorial/aacwidget-tutorial/angular.json +0 -128
  133. package/tutorial/aacwidget-tutorial/browserslist +0 -13
  134. package/tutorial/aacwidget-tutorial/e2e/protractor.conf.js +0 -32
  135. package/tutorial/aacwidget-tutorial/e2e/src/app.e2e-spec.ts +0 -23
  136. package/tutorial/aacwidget-tutorial/e2e/src/app.po.ts +0 -11
  137. package/tutorial/aacwidget-tutorial/e2e/tsconfig.json +0 -13
  138. package/tutorial/aacwidget-tutorial/karma.conf.js +0 -32
  139. package/tutorial/aacwidget-tutorial/package-lock.json +0 -13314
  140. package/tutorial/aacwidget-tutorial/package.json +0 -49
  141. package/tutorial/aacwidget-tutorial/src/app/app-routing.module.ts +0 -18
  142. package/tutorial/aacwidget-tutorial/src/app/app.component.html +0 -6
  143. package/tutorial/aacwidget-tutorial/src/app/app.component.scss +0 -0
  144. package/tutorial/aacwidget-tutorial/src/app/app.component.spec.ts +0 -35
  145. package/tutorial/aacwidget-tutorial/src/app/app.component.ts +0 -28
  146. package/tutorial/aacwidget-tutorial/src/app/app.module.ts +0 -47
  147. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.html +0 -57
  148. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.scss +0 -0
  149. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.ts +0 -160
  150. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.html +0 -20
  151. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.scss +0 -0
  152. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.spec.ts +0 -25
  153. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.ts +0 -49
  154. package/tutorial/aacwidget-tutorial/src/assets/.gitkeep +0 -0
  155. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/de.json +0 -62
  156. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/en.json +0 -62
  157. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/fr.json +0 -62
  158. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/nl.json +0 -62
  159. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/scss/aacwidget-custom.scss +0 -81
  160. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/scss/aacwidget-default.scss +0 -424
  161. package/tutorial/aacwidget-tutorial/src/environments/environment.prod.ts +0 -3
  162. package/tutorial/aacwidget-tutorial/src/environments/environment.ts +0 -16
  163. package/tutorial/aacwidget-tutorial/src/favicon.ico +0 -0
  164. package/tutorial/aacwidget-tutorial/src/index.html +0 -45
  165. package/tutorial/aacwidget-tutorial/src/main.ts +0 -12
  166. package/tutorial/aacwidget-tutorial/src/polyfills.ts +0 -63
  167. package/tutorial/aacwidget-tutorial/src/styles.scss +0 -4
  168. package/tutorial/aacwidget-tutorial/src/test.ts +0 -25
  169. package/tutorial/aacwidget-tutorial/tsconfig.app.json +0 -15
  170. package/tutorial/aacwidget-tutorial/tsconfig.json +0 -23
  171. package/tutorial/aacwidget-tutorial/tsconfig.spec.json +0 -18
  172. package/tutorial/aacwidget-tutorial/tslint.json +0 -148
  173. package/tutorial/tutorial-videos.txt +0 -41
@@ -1,1167 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
3
- import { ValidationMessageOptionType } from './enum/validation-message-option-type.enum';
4
- import { LocalityComponent } from './locality/locality.component';
5
- import { StreetComponent } from './street/street.component';
6
- import { StreetNumberComponent } from './street-number/street-number.component';
7
- import { BoxNumberComponent } from './box-number/box-number.component';
8
- import { ADDRESSLEVEL } from './enum';
9
- import { PrefillData } from './utils/prefill-data';
10
- import { InputNameType } from './enum/input-name.enum';
11
- import { HttpService } from './services/http.service';
12
- import { Nis9Service } from './services/nis9.service';
13
- let LibAddressAutocompleteByComponentComponent = class LibAddressAutocompleteByComponentComponent {
14
- constructor(nis9Service, httpService) {
15
- this.nis9Service = nis9Service;
16
- this.httpService = httpService;
17
- this.selectedLanguage = null;
18
- this.baseUrl = "https://api.mailops.bpost.cloud/roa-info/externalMailingAddressProofingRest/autocomplete/";
19
- this.defaultApiKey = 'cyRkKOD73O1DOdgcDLLnsaOiDh6OyOkt3BBT5JU1';
20
- this.usedLocalityUrl = this.baseUrl + 'locality';
21
- this.usedStreetUrl = this.baseUrl + 'street';
22
- this.usedStreetNumberUrl = this.baseUrl + 'streetNumber';
23
- this.usedBoxNumberUrl = this.baseUrl + 'boxNumber';
24
- this.showDebugMessageToConsole = false;
25
- this.notInListAllowed = true;
26
- this.messageOption = 'Y';
27
- // LOCALITY
28
- this.localityUrl = this.baseUrl + 'locality';
29
- this.maxSuggestionLocality = 5;
30
- this.visibleSuggestionLocalityCount = 5;
31
- // localityParams: PrefilledParameters;
32
- this.localityPrefillData = null;
33
- // STREET
34
- this.streetUrl = this.baseUrl + 'street';
35
- this.maxSuggestionStreet = 5;
36
- this.visibleSuggestionStreetCount = 5;
37
- // streetParams: PrefilledParameters;
38
- this.streetPrefillData = null;
39
- // STREET NUMBER
40
- // tslint:disable-next-line:max-line-length
41
- this.streetNumberUrl = this.baseUrl + 'streetNumber';
42
- this.maxSuggestionStreetNb = 5;
43
- this.visibleSuggestionStreetNbCount = 5;
44
- // streetNumberParams: PrefilledParameters;
45
- this.streetNumberPrefillData = null;
46
- // BOX NUMBER
47
- this.boxNumberUrl = this.baseUrl + 'boxNumber';
48
- this.maxSuggestionBoxNb = 5;
49
- this.visibleSuggestionBoxNbCount = 5;
50
- // boxParams: PrefilledParameters;
51
- this.boxNumberPrefillData = null;
52
- this.emittedAddress = null;
53
- this.validationMessage = { messageType: null, translatedMessage: '' };
54
- this.addressCompleteEventEmitter = new EventEmitter();
55
- this.validationMessageEventEmitter = new EventEmitter();
56
- this.clearInputEventEmitter = new EventEmitter();
57
- this.processingPrefillData = false;
58
- // Pass the API key as a property of the library !
59
- this.apiKey = this.defaultApiKey;
60
- // set the widget as readonly and add NIS9 query parameter
61
- this.isReadonly = false;
62
- this.nis9InResponse = false;
63
- // https://bgs.bpost.be/set-selection-circle?lng=4.360537572541948&lat=50.84063582806037&radius=0.001
64
- this.nis9ServiceURL = '';
65
- this.isComponentReady = false;
66
- }
67
- // @ts-ignore
68
- set inputLang(val) {
69
- this.setLanguage(val);
70
- }
71
- // @ts-ignore
72
- set clearInput(focus) {
73
- this.onClearInput(focus);
74
- }
75
- // @ts-ignore
76
- set validationMessageOption(option) {
77
- this.setValidationMessageOptionFromInput(option);
78
- }
79
- ngOnInit() {
80
- //console.warn('lib - ngOnInit');
81
- this.nis9Service.setNis9ServiceURL(this.nis9ServiceURL);
82
- const apiKey = this.isValidData(this.apiKey) ? this.apiKey : this.defaultApiKey;
83
- this.httpService.setApiKey(apiKey);
84
- if (this.isValidData(this.localityUrl))
85
- this.usedLocalityUrl = this.localityUrl;
86
- if (this.isValidData(this.streetUrl))
87
- this.usedStreetUrl = this.streetUrl;
88
- if (this.isValidData(this.streetNumberUrl))
89
- this.usedStreetNumberUrl = this.streetNumberUrl;
90
- if (this.isValidData(this.boxNumberUrl))
91
- this.usedBoxNumberUrl = this.boxNumberUrl;
92
- if (this.addressParams) {
93
- this.prefillData = this.addressParams;
94
- }
95
- this.isComponentReady = true;
96
- }
97
- isValidData(str) {
98
- return str !== undefined && str !== null && str.length > 0;
99
- }
100
- ngOnDestroy() {
101
- if (this.subscription) {
102
- this.subscription.unsubscribe();
103
- }
104
- }
105
- ngOnChanges(changes) {
106
- if (changes) {
107
- // code for tracing
108
- // visibleSuggestionStreetNbCount
109
- if (this.showDebugMessageToConsole) {
110
- this.displayParametersChangesToConsole(changes);
111
- }
112
- /*
113
- if (changes.hasOwnProperty('apiKey') && !changes.apiKey.firstChange) {
114
- const apiKey = this.apiKey!==null && this.apiKey!==undefined && this.apiKey.length>0
115
- ? this.apiKey
116
- : this.defaultApiKey;
117
- this.httpService.setApiKey( apiKey );
118
- }
119
-
120
- if (changes.hasOwnProperty('localityUrl') && !changes.localityUrl.firstChange) {
121
- const localityUrl = this.localityUrl!==null && this.localityUrl!==undefined && this.localityUrl.length>0
122
- ? this.localityUrl
123
- : this.baseUrl + 'locality';
124
- this.usedLocalityUrl=localityUrl;
125
- console.log('ngOnChanges - localityUrl: ', localityUrl);
126
- }
127
- if (changes.hasOwnProperty('streetUrl') && !changes.streetUrl.firstChange) {
128
- const streetUrl = this.streetUrl!==null && this.streetUrl!==undefined && this.streetUrl.length>0
129
- ? this.streetUrl
130
- : this.baseUrl + 'street';
131
- this.streetUrl=streetUrl;
132
- }
133
- if (changes.hasOwnProperty('streetNumberUrl') && !changes.streetNumberUrl.firstChange) {
134
- const streetNumberUrl = this.streetNumberUrl!==null && this.streetNumberUrl!==undefined && this.streetNumberUrl.length>0
135
- ? this.streetNumberUrl
136
- : this.baseUrl + 'streetNumber';
137
- this.streetNumberUrl=streetNumberUrl;
138
- }
139
- if (changes.hasOwnProperty('boxNumberUrl') && !changes.boxNumberUrl.firstChange) {
140
- const boxNumberUrl = this.boxNumberUrl!==null && this.boxNumberUrl!==undefined && this.boxNumberUrl.length>0
141
- ? this.boxNumberUrl
142
- : this.baseUrl + 'boxNumber';
143
- this.boxNumberUrl=boxNumberUrl;
144
- }
145
- */
146
- if (changes.hasOwnProperty('addressParams') && !changes.addressParams.firstChange) {
147
- // if (changes.hasOwnProperty('addressParams')) {
148
- this.processingPrefillData = true;
149
- this.enterPrefillMode();
150
- this.selectedAddress = null;
151
- this.notifyAddressComplete();
152
- this.clearWidget();
153
- /*
154
- if (this.localityPrefillData !== null && this.localityPrefillData !== undefined) {
155
- // this.onClearInputEventEmitter(InputNameType.LOCALITY);
156
- this.clearWidget();
157
- }
158
- */
159
- this.boxNumberPrefillData = null;
160
- this.streetNumberPrefillData = null;
161
- this.streetPrefillData = null;
162
- if (this.showDebugMessageToConsole) {
163
- console.log('lib::widget detected prefilling', this.addressParams);
164
- }
165
- this.addressParams.minLevel = /*4*/ ADDRESSLEVEL.LOCALITY;
166
- // this.localityPrefillData = this.addressParams; // as any as PrefillData;
167
- this.localityPrefillData = new PrefillData(this.addressParams);
168
- // Object.assign(this.localityPrefillData, this.addressParams);
169
- if (this.showDebugMessageToConsole) {
170
- console.log('lib::checking locality match... ', this.localityPrefillData);
171
- }
172
- }
173
- }
174
- }
175
- displayParametersChangesToConsole(changes) {
176
- // messageOption
177
- if (changes.hasOwnProperty('messageOption') && !changes.messageOption.firstChange) {
178
- const wcChanges = changes.messageOption.currentValue;
179
- console.log('lib widget9 - messageOption', wcChanges);
180
- }
181
- // maxSuggestionLocality
182
- if (changes.hasOwnProperty('maxSuggestionLocality') && !changes.maxSuggestionLocality.firstChange) {
183
- const wcChanges = changes.maxSuggestionLocality.currentValue;
184
- console.log('lib widget9 - maxSuggestionLocality', wcChanges);
185
- }
186
- // visibleSuggestionLocalityCount
187
- if (changes.hasOwnProperty('visibleSuggestionLocalityCount') && !changes.visibleSuggestionLocalityCount.firstChange) {
188
- const wcChanges = changes.visibleSuggestionLocalityCount.currentValue;
189
- console.log('lib widget9 - visibleSuggestionLocalityCount', wcChanges);
190
- }
191
- // sortCriteriaLocality
192
- if (changes.hasOwnProperty('sortCriteriaLocality') && !changes.sortCriteriaLocality.firstChange) {
193
- const wcChanges = changes.sortCriteriaLocality.currentValue;
194
- console.log('lib widget9 - sortCriteriaLocality', wcChanges);
195
- }
196
- // maxSuggestionStreet
197
- if (changes.hasOwnProperty('maxSuggestionStreet') && !changes.maxSuggestionStreet.firstChange) {
198
- const wcChanges = changes.maxSuggestionStreet.currentValue;
199
- console.log('lib widget9 - maxSuggestionStreet', wcChanges);
200
- }
201
- // visibleSuggestionStreetCount
202
- if (changes.hasOwnProperty('visibleSuggestionStreetCount') && !changes.visibleSuggestionStreetCount.firstChange) {
203
- const wcChanges = changes.visibleSuggestionStreetCount.currentValue;
204
- console.log('lib widget9 - visibleSuggestionStreetCount', wcChanges);
205
- }
206
- // sortCriteriaStreet
207
- if (changes.hasOwnProperty('sortCriteriaStreet') && !changes.sortCriteriaStreet.firstChange) {
208
- const wcChanges = changes.sortCriteriaStreet.currentValue;
209
- console.log('lib widget9 - sortCriteriaStreet', wcChanges);
210
- }
211
- // maxSuggestionStreetNb
212
- if (changes.hasOwnProperty('maxSuggestionStreetNb') && !changes.maxSuggestionStreetNb.firstChange) {
213
- const wcChanges = changes.maxSuggestionStreetNb.currentValue;
214
- console.log('lib widget9 - maxSuggestionStreetNb', wcChanges);
215
- }
216
- // visibleSuggestionStreetNbCount
217
- if (changes.hasOwnProperty('visibleSuggestionStreetNbCount') && !changes.visibleSuggestionStreetNbCount.firstChange) {
218
- const wcChanges = changes.visibleSuggestionStreetNbCount.currentValue;
219
- console.log('lib widget9 - visibleSuggestionStreetNbCount', wcChanges);
220
- }
221
- // sortCriteriaStreetNb
222
- if (changes.hasOwnProperty('sortCriteriaStreetNb') && !changes.sortCriteriaStreetNb.firstChange) {
223
- const wcChanges = changes.sortCriteriaStreetNb.currentValue;
224
- console.log('lib widget9 - sortCriteriaStreetNb', wcChanges);
225
- }
226
- // maxSuggestionBoxNb
227
- if (changes.hasOwnProperty('maxSuggestionBoxNb') && !changes.maxSuggestionBoxNb.firstChange) {
228
- const wcChanges = changes.maxSuggestionBoxNb.currentValue;
229
- console.log('lib widget9 - maxSuggestionBoxNb', wcChanges);
230
- }
231
- // visibleSuggestionBoxNbCount
232
- if (changes.hasOwnProperty('visibleSuggestionBoxNbCount') && !changes.visibleSuggestionBoxNbCount.firstChange) {
233
- const wcChanges = changes.visibleSuggestionBoxNbCount.currentValue;
234
- console.log('lib widget9 - visibleSuggestionBoxNbCount', wcChanges);
235
- }
236
- // sortCriteriaBoxNb
237
- if (changes.hasOwnProperty('sortCriteriaBoxNb') && !changes.sortCriteriaBoxNb.firstChange) {
238
- const wcChanges = changes.sortCriteriaBoxNb.currentValue;
239
- console.log('lib widget9 - sortCriteriaBoxNb', wcChanges);
240
- }
241
- }
242
- clearWidget() {
243
- this.autocompleteBoxNb.clearWidget();
244
- this.autocompleteStreetNb.clearWidget();
245
- this.autocompleteStreet.clearWidget();
246
- this.autocompleteLocality.clearWidget();
247
- }
248
- changeMinLevel(minLevel) {
249
- this.minLevel = minLevel;
250
- }
251
- // Called by the specific buttons in the app
252
- onClearInput(focus) {
253
- if (this.showDebugMessageToConsole) {
254
- console.log('lib::onClearInput', focus);
255
- }
256
- /*
257
- if (focus === null || focus === undefined) {
258
- return;
259
- }*/
260
- this.quitPrefillMode();
261
- const setFocus = (focus === null || focus === undefined) ? false : focus.setFocus;
262
- switch (this.minLevel) {
263
- case 1:
264
- this.boxNumber = '';
265
- this.autocompleteBoxNb.clearInput(setFocus, false);
266
- this.clearInputEventEmitter.emit('BOX_NUMBER');
267
- break;
268
- case 2:
269
- this.boxNumber = '';
270
- this.streetNumber = '';
271
- this.autocompleteBoxNb.searchText = '';
272
- this.autocompleteBoxNb.streetNumber = '';
273
- this.autocompleteBoxNb.clearInput(setFocus, false);
274
- this.autocompleteStreetNb.onClearStreetNumberInput(setFocus, false);
275
- this.clearInputEventEmitter.emit('STREET_NUMBER');
276
- break;
277
- case 3:
278
- this.boxNumber = '';
279
- this.streetNumber = '';
280
- this.street = '';
281
- this.autocompleteBoxNb.searchText = '';
282
- this.autocompleteBoxNb.streetNumber = '';
283
- this.autocompleteBoxNb.clearInput(setFocus, false);
284
- this.autocompleteBoxNb.clearWidget();
285
- this.autocompleteStreetNb.searchText = '';
286
- this.autocompleteStreetNb.streetName = '';
287
- this.autocompleteStreetNb.onClearStreetNumberInput(setFocus, false);
288
- this.autocompleteStreet.clearInput(setFocus, false);
289
- this.clearInputEventEmitter.emit('STREET');
290
- break;
291
- default:
292
- // Box number
293
- this.boxNumber = '';
294
- if (this.autocompleteBoxNb) {
295
- this.autocompleteBoxNb.searchText = '';
296
- this.autocompleteBoxNb.streetNumber = '';
297
- this.autocompleteBoxNb.clearInput(setFocus, false);
298
- }
299
- // Street number
300
- this.streetNumber = '';
301
- if (this.autocompleteStreetNb) {
302
- this.autocompleteStreetNb.searchText = '';
303
- this.autocompleteStreetNb.streetName = '';
304
- this.autocompleteStreetNb.onClearStreetNumberInput(setFocus, false);
305
- }
306
- // Street name
307
- this.street = '';
308
- if (this.autocompleteStreet) {
309
- this.autocompleteStreet.searchText = '';
310
- this.autocompleteStreet.clearInput(setFocus, false);
311
- }
312
- // Locality
313
- this.locality = '';
314
- if (this.autocompleteLocality) {
315
- this.autocompleteLocality.searchText = '';
316
- this.autocompleteLocality.clearInput(setFocus, false);
317
- }
318
- this.clearInputEventEmitter.emit('LOCALITY');
319
- break;
320
- }
321
- }
322
- getBoxPrefix() {
323
- let prefix = '';
324
- switch (this.selectedLanguage) {
325
- case 'fr':
326
- prefix = 'BTE';
327
- break;
328
- case 'nl':
329
- prefix = 'BUS';
330
- break;
331
- default:
332
- prefix = 'BOX';
333
- break;
334
- }
335
- return prefix;
336
- }
337
- notifyAddressComplete() {
338
- // console.log('notify for address complete');
339
- if (this.showDebugMessageToConsole) {
340
- console.log('notifyAddressComplete', this.selectedAddress, 'nis9InResponse:' + this.nis9InResponse, typeof this.nis9InResponse);
341
- }
342
- if ((this.nis9InResponse === true || '' + this.nis9InResponse === 'true') && this.selectedAddress.hasOwnProperty('latitude') && this.selectedAddress.hasOwnProperty('longitude')) {
343
- const latitude = this.selectedAddress.latitude;
344
- const longitude = this.selectedAddress.longitude;
345
- if (this.showDebugMessageToConsole)
346
- console.log('calling nis9 service to get nis9 data (1):', longitude, latitude);
347
- this.nis9Service.determineNis9Data(longitude, latitude)
348
- .subscribe(data => {
349
- console.log('nis DATA:', data);
350
- /*
351
- nis DATA:
352
- {Status: 'success', data: Array(1)}
353
- Status: "success"
354
- data: ['25112A21-']
355
- */
356
- if (data !== undefined && data !== null && data.hasOwnProperty('Status') && data.Status === 'success') {
357
- const nis9Data = data.data;
358
- if (Array.isArray(nis9Data) && nis9Data.length === 1) {
359
- this.selectedAddress.nis9 = nis9Data[0];
360
- }
361
- }
362
- this.addressCompleteEventEmitter.emit(this.selectedAddress);
363
- this.emittedAddress = this.selectedAddress;
364
- this.updatePostalCodeLocality(this.emittedAddress);
365
- });
366
- }
367
- else {
368
- if (this.showDebugMessageToConsole)
369
- console.log('NOT calling nis9 service to get nis9 data (1)');
370
- this.addressCompleteEventEmitter.emit(this.selectedAddress);
371
- this.emittedAddress = this.selectedAddress;
372
- this.updatePostalCodeLocality(this.emittedAddress);
373
- }
374
- }
375
- onClearInputEventEmitter(event) {
376
- if (this.showDebugMessageToConsole) {
377
- console.log('lib::onClearInputEventEmitter', event);
378
- }
379
- this.quitPrefillMode();
380
- let nextAddress = this.selectedAddress; // this.emittedAddress;
381
- if (event === InputNameType.LOCALITY) {
382
- // Box number
383
- this.boxNumber = '';
384
- if (this.autocompleteBoxNb) {
385
- this.autocompleteBoxNb.searchText = '';
386
- this.autocompleteBoxNb.streetNumber = '';
387
- this.autocompleteBoxNb.clearInput(false, false);
388
- }
389
- // Street number
390
- this.streetNumber = '';
391
- if (this.autocompleteStreetNb) {
392
- this.autocompleteStreetNb.searchText = '';
393
- this.autocompleteStreetNb.streetName = '';
394
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
395
- }
396
- // Street name
397
- this.street = '';
398
- if (this.autocompleteStreet) {
399
- this.autocompleteStreet.searchText = '';
400
- this.autocompleteStreet.clearInput(false, false);
401
- }
402
- // Locality
403
- this.locality = '';
404
- if (this.autocompleteLocality) {
405
- this.autocompleteLocality.searchText = '';
406
- this.autocompleteLocality.clearInput(false, false);
407
- }
408
- nextAddress = null;
409
- }
410
- else if (event === InputNameType.STREET) {
411
- // Box number
412
- this.boxNumber = '';
413
- if (this.autocompleteBoxNb) {
414
- this.autocompleteBoxNb.searchText = '';
415
- this.autocompleteBoxNb.streetNumber = '';
416
- this.autocompleteBoxNb.clearInput(false, false);
417
- }
418
- // Street number
419
- this.streetNumber = '';
420
- if (this.autocompleteStreetNb) {
421
- this.autocompleteStreetNb.searchText = '';
422
- this.autocompleteStreetNb.streetName = '';
423
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
424
- }
425
- // Street name
426
- this.street = '';
427
- if (this.autocompleteStreet) {
428
- this.autocompleteStreet.searchText = '';
429
- this.autocompleteStreet.clearInput(false, false);
430
- }
431
- nextAddress = null;
432
- }
433
- else if (event === InputNameType.STREET_NUMBER) {
434
- // Box number
435
- this.boxNumber = '';
436
- if (this.autocompleteBoxNb) {
437
- this.autocompleteBoxNb.searchText = '';
438
- this.autocompleteBoxNb.streetNumber = '';
439
- this.autocompleteBoxNb.clearInput(false, false);
440
- }
441
- // Street number
442
- this.streetNumber = '';
443
- if (this.autocompleteStreetNb) {
444
- this.autocompleteStreetNb.searchText = '';
445
- // this.autocompleteStreetNb.streetName = '';
446
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
447
- }
448
- nextAddress = null;
449
- }
450
- else if (event === InputNameType.BOX_NUMBER) {
451
- // Box number
452
- this.boxNumber = '';
453
- if (this.autocompleteBoxNb) {
454
- this.autocompleteBoxNb.searchText = '';
455
- // this.autocompleteBoxNb.streetNumber = '';
456
- this.autocompleteBoxNb.clearInput(false, false);
457
- }
458
- // Attention: if not-in-list don't reset the address, just modify it
459
- const addressIsNotInList = nextAddress !== undefined && nextAddress !== null
460
- && nextAddress.hasOwnProperty('not-in-list') && nextAddress['not-in-list'] === true
461
- ? true : false;
462
- /*
463
- if (addressIsNotInList)
464
- {
465
- delete nextAddress.boxNumber;
466
- nextAddress.isCompleteNotificationDone = false;
467
- if (this.streetNumberAddress !== null )
468
- {
469
- console.warn('reset box on not-in-list', this.streetNumberAddress);
470
-
471
- }
472
- }
473
- else
474
- {
475
- nextAddress = null;
476
- }
477
- */
478
- nextAddress = this.streetNumberAddress !== null ? this.streetNumberAddress : null;
479
- /*
480
- const addressIsNotInList
481
- = nextAddress !== null && nextAddress.hasOwnProperty('not-in-list') && nextAddress['not-in-list'] === true
482
- ? true : false;
483
- */
484
- const addressIsComplete = nextAddress !== undefined && nextAddress !== null
485
- && nextAddress.hasOwnProperty('isComplete') && nextAddress.isComplete === true ? true : false;
486
- this.autocompleteStreetNb.addressIsComplete = addressIsComplete;
487
- }
488
- this.clearInputEventEmitter.emit(event);
489
- if (this.emittedAddress !== null) {
490
- if (nextAddress !== undefined && nextAddress !== null && nextAddress.hasOwnProperty('latitude') && nextAddress.hasOwnProperty('longitude')) {
491
- const latitude = nextAddress.latitude;
492
- const longitude = nextAddress.longitude;
493
- if (this.showDebugMessageToConsole)
494
- console.log('calling nis9 service to get nis9 data (2)', longitude, latitude);
495
- }
496
- else {
497
- if (this.showDebugMessageToConsole)
498
- console.log('NOT calling nis9 service to get nis9 data (2)');
499
- }
500
- this.addressCompleteEventEmitter.emit(nextAddress);
501
- this.emittedAddress = nextAddress;
502
- }
503
- // gka
504
- /*
505
- if (event === InputNameType.LOCALITY)
506
- {
507
- this.minLevel = ADDRESSLEVEL.LOCALITY;
508
- this.boxNumberPrefillData = null;
509
- this.streetNumberPrefillData = null;
510
- this.streetPrefillData = null;
511
- this.localityPrefillData = null;
512
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
513
- this.locality = '';
514
- this.postalCode = '';
515
- this.street = null;
516
- this.streetNumber = null;
517
- this.boxNumber = null;
518
- this.autocompleteBoxNb.clearInput(false, false);
519
- this.autocompleteBoxNb.streetName = '';
520
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
521
- this.autocompleteStreetNb.streetName = '';
522
- this.autocompleteStreet.clearInput(false, false);
523
- this.autocompleteStreet.locality = '';
524
- this.autocompleteLocality.clearInput(false, false);
525
- }
526
- if (event === InputNameType.STREET)
527
- {
528
- this.minLevel = ADDRESSLEVEL.STREET;
529
- this.boxNumberPrefillData = null;
530
- this.streetNumberPrefillData = null;
531
- this.streetPrefillData = null;
532
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
533
- this.street = null;
534
- this.streetNumber = null;
535
- this.boxNumber = null;
536
- this.autocompleteBoxNb.clearInput(false, false);
537
- this.autocompleteBoxNb.streetName = '';
538
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
539
- this.autocompleteStreetNb.streetName = '';
540
- this.autocompleteStreet.clearInput(false, false);
541
- // this.autocompleteLocality.clearInput(false, false);
542
- }
543
- if (event === InputNameType.STREET_NUMBER)
544
- {
545
- this.minLevel = ADDRESSLEVEL.STREET_NUMBER;
546
- this.boxNumberPrefillData = null;
547
- this.streetNumberPrefillData = null;
548
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
549
- this.streetNumber = null;
550
- this.boxNumber = null;
551
- this.autocompleteBoxNb.clearInput(false, false);
552
- this.autocompleteBoxNb.streetName = '';
553
- this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
554
- // this.autocompleteStreet.clearInput(false, false);
555
- // this.autocompleteLocality.clearInput(false, false);
556
- }
557
- if (event === InputNameType.BOX_NUMBER)
558
- {
559
- this.minLevel = ADDRESSLEVEL.BOX_NUMBER;
560
- this.boxNumberPrefillData = null;
561
- this.boxNumber = null;
562
- // this.clearInput(focus: {setFocus: boolean, timestamp: Date});
563
- this.autocompleteBoxNb.clearInput(false, false);
564
- // this.autocompleteStreetNb.onClearStreetNumberInput(false, false);
565
- // this.autocompleteStreet.clearInput(false, false);
566
- // this.autocompleteLocality.clearInput(false, false);
567
- }
568
- */
569
- }
570
- resetLocality(event) {
571
- this.postalCode = '';
572
- this.locality = '';
573
- this.quitPrefillMode();
574
- this.onClearInputEventEmitter(InputNameType.STREET);
575
- this.setAddress(null, 4);
576
- }
577
- resetStreet(event) {
578
- this.street = '';
579
- this.quitPrefillMode();
580
- this.onClearInputEventEmitter(InputNameType.STREET_NUMBER);
581
- this.autocompleteStreetNb.addressIsComplete = false;
582
- this.autocompleteStreetNb.streetName = '';
583
- this.setAddress(null, 3);
584
- }
585
- resetStreetNumber(event, resetAddress = false) {
586
- // console.log('reset street numner!', event, resetAddress);
587
- this.streetNumber = '';
588
- this.quitPrefillMode();
589
- this.onClearInputEventEmitter(InputNameType.BOX_NUMBER);
590
- this.autocompleteBoxNb.addressIsComplete = false;
591
- this.autocompleteBoxNb.streetNumber = '';
592
- this.setAddress(null, 2);
593
- // $$ 7 this.setAddress(null, 2); // $$ ?????
594
- /*
595
- if (resetAddress === true) {
596
- this.setAddress(/ *null* / this.selectedAddress);
597
- }*/
598
- }
599
- resetBoxNumber(event, resetAddress = false) {
600
- // console.log('reset street numner!', event, resetAddress);
601
- this.boxNumber = '';
602
- this.quitPrefillMode();
603
- this.autocompleteBoxNb.addressIsComplete = false;
604
- this.setAddress(null, 1);
605
- // this.onClearInputEventEmitter(InputNameType.BOX_NUMBER);
606
- // $$ 7 this.setAddress(null, 1); // $$ ?????
607
- /*
608
- if (resetAddress === true) {
609
- this.setAddress(/ *null* / this.selectedAddress);
610
- }*/
611
- }
612
- enterPrefillMode() {
613
- if (this.showDebugMessageToConsole) {
614
- console.log('lib::enterPrefillMode()');
615
- }
616
- if (this.autocompleteBoxNb && this.autocompleteStreetNb && this.autocompleteStreet && this.autocompleteLocality) {
617
- this.autocompleteBoxNb.prefilling = true;
618
- this.autocompleteStreetNb.prefilling = true;
619
- this.autocompleteStreet.prefilling = true;
620
- this.autocompleteLocality.prefilling = true;
621
- this.autocompleteStreet.locality = '';
622
- this.autocompleteStreetNb.streetName = '';
623
- this.autocompleteBoxNb.streetNumber = '';
624
- }
625
- }
626
- quitPrefillMode() {
627
- if (this.showDebugMessageToConsole) {
628
- console.log('lib::quitPrefillMode()');
629
- }
630
- if (this.autocompleteBoxNb && this.autocompleteStreetNb && this.autocompleteStreet && this.autocompleteLocality) {
631
- this.autocompleteBoxNb.prefilling = false;
632
- this.autocompleteStreetNb.prefilling = false;
633
- this.autocompleteStreet.prefilling = false;
634
- this.autocompleteLocality.prefilling = false;
635
- }
636
- this.processingPrefillData = false;
637
- }
638
- setAddress(address, level) {
639
- if (this.showDebugMessageToConsole) {
640
- console.log('lib::setAddress - address part, level', address, level);
641
- }
642
- /* $$ $$
643
- if (this.selectedAddress && !address) {
644
- // console.log('reset address!');
645
- this.selectedAddress = null;
646
- this.streetAddress = null;
647
- this.streetNumberAddress = null;
648
- this.notifyAddressComplete();
649
- return;
650
- }
651
- */
652
- if (address === null || address === undefined) {
653
- const doNotify = (this.selectedAddress !== null && this.selectedAddress !== undefined) ? true : false;
654
- this.selectedAddress = null;
655
- this.autocompleteStreetNb.addressIsComplete = false;
656
- this.autocompleteBoxNb.addressIsComplete = false;
657
- if (doNotify) {
658
- this.notifyAddressComplete();
659
- }
660
- }
661
- if (address) {
662
- delete address.messages;
663
- this.selectedAddress = address;
664
- this.updateCompleteAddress();
665
- this.postalCode = address.postalCode ? address.postalCode : '';
666
- this.locality = address.localityName ? address.localityName : '';
667
- this.street = address.streetName ? address.streetName : '';
668
- // const notInList = address['not-in-list'];
669
- // const isNotInList = notInList !== null && notInList !== undefined && notInList === true;
670
- /*
671
- if (address.houseNumber) {
672
- if (!address.isComplete || isNotInList) {
673
- this.streetNumber = address.houseNumber ? address.houseNumber : '';
674
- } else {
675
- if (!address.boxNumber) {
676
- // console.log('calling reset street number !');
677
- if ( !this.processingPrefillData ) {
678
- this.resetStreetNumber(null, false);
679
- }
680
- // this.streetNumber = '';
681
- }
682
- }
683
- }
684
- */
685
- const addressIsComplete = address !== null && address !== undefined
686
- && address.hasOwnProperty('isComplete') && address.isComplete === true ? true : false;
687
- const addressIsNotInList = address !== null && address !== undefined
688
- && address.hasOwnProperty('not-in-list') && address['not-in-list'] === true ? true : false;
689
- switch (level) {
690
- // Locality / Municipality and POstalCode
691
- case 4:
692
- this.updatePostalCodeLocality(address);
693
- /*
694
- this.autocompleteStreet.clearWidget();
695
- this.autocompleteStreetNb.searchText = '';
696
- this.autocompleteStreetNb.clearWidget();
697
- this.autocompleteStreetNb.searchText = '';
698
- this.autocompleteBoxNb.clearWidget();
699
- this.autocompleteBoxNb.searchText = '';
700
- */
701
- this.streetAddress = null;
702
- this.streetNumberAddress = null;
703
- //
704
- this.autocompleteStreet.searchText = '';
705
- this.autocompleteStreetNb.searchText = '';
706
- this.autocompleteStreetNb.streetName = '';
707
- this.autocompleteBoxNb.searchText = '';
708
- this.autocompleteBoxNb.streetNumber = '';
709
- break;
710
- // Street Name
711
- case 3:
712
- this.updatePostalCodeLocality(address);
713
- this.updateStreetName(address);
714
- this.streetAddress = address;
715
- this.streetNumberAddress = null;
716
- /*
717
- this.autocompleteStreetNb.clearWidget();
718
- this.autocompleteStreetNb.searchText = '';
719
- this.autocompleteBoxNb.clearWidget();
720
- this.autocompleteBoxNb.searchText = '';
721
- */
722
- this.autocompleteStreetNb.searchText = '';
723
- this.autocompleteBoxNb.searchText = '';
724
- this.autocompleteBoxNb.streetNumber = '';
725
- break;
726
- // STREET Number
727
- case 2:
728
- this.updatePostalCodeLocality(address);
729
- this.updateStreetName(address);
730
- this.updateStreetNumber(address); // $$
731
- this.streetAddress = address;
732
- this.streetNumberAddress = address;
733
- if (address.hasOwnProperty('isComplete') && address.isComplete === true) {
734
- this.autocompleteStreetNb.addressIsComplete = true;
735
- if (addressIsNotInList) {
736
- this.autocompleteBoxNb.streetNumber = address.houseNumber;
737
- }
738
- else {
739
- this.autocompleteBoxNb.streetNumber = '';
740
- }
741
- }
742
- else {
743
- this.autocompleteBoxNb.streetNumber = address.houseNumber;
744
- }
745
- /*
746
- this.autocompleteBoxNb.clearWidget();
747
- this.autocompleteBoxNb.searchText = '';
748
- */
749
- this.autocompleteBoxNb.searchText = '';
750
- break;
751
- // BOX Number
752
- case 1:
753
- {
754
- if (addressIsNotInList) {
755
- this.autocompleteStreetNb.addressIsComplete = false;
756
- }
757
- }
758
- break;
759
- default:
760
- break;
761
- }
762
- if (this.selectedAddress && this.selectedAddress.isComplete === undefined) {
763
- this.selectedAddress.isComplete = false;
764
- }
765
- /*
766
- if (address.isComplete === true ) {
767
- if (!this.selectedAddress.isCompleteNotificationDone) {
768
- this.selectedAddress.isCompleteNotificationDone = true;
769
- this.notifyAddressComplete();
770
- }
771
- } else {
772
- this.notifyAddressComplete();
773
- }
774
- */
775
- this.selectedAddress.isCompleteNotificationDone = true;
776
- this.notifyAddressComplete();
777
- }
778
- }
779
- setLanguage(lang) {
780
- this.selectedLanguage = lang;
781
- }
782
- setValidationMessage(/*message: string*/ message) {
783
- this.validationMessage = message;
784
- if (this.validationMessageOptionType === ValidationMessageOptionType.EMIT) {
785
- this.validationMessageEventEmitter.emit(message);
786
- }
787
- }
788
- updatePostalCodeLocality(address) {
789
- if (address && address.postalCode && address.localityName) {
790
- this.postalCodeLocality = address.postalCode + ' ' + address.localityName;
791
- this.autocompleteLocality.searchText = this.postalCodeLocality;
792
- }
793
- }
794
- updateStreetName(address) {
795
- if (address && address.streetName) {
796
- this.streetNameInput = address.streetName;
797
- }
798
- }
799
- updateStreetNumber(address) {
800
- if (address && address.houseNumber) {
801
- this.streetNumberInput = address.houseNumber;
802
- }
803
- }
804
- updateCompleteAddress() {
805
- let concatStr = '';
806
- concatStr += this.selectedAddress.streetName ? `${this.selectedAddress.streetName} ` : '';
807
- concatStr += this.selectedAddress.houseNumber ? `${this.selectedAddress.houseNumber} ` : '';
808
- concatStr += this.selectedAddress.boxNumber ? `${this.getBoxPrefix()} ${this.selectedAddress.boxNumber} ` : '';
809
- concatStr += this.selectedAddress.postalCode ? `${this.selectedAddress.postalCode} ` : '';
810
- concatStr += this.selectedAddress.municipalityName ? `${this.selectedAddress.municipalityName} ` : '';
811
- this.completeAddress = concatStr;
812
- }
813
- setValidationMessageOptionFromInput(option) {
814
- this.validationMessageOptionType = option.validationType;
815
- // console.log('addresse autocomplete - validation message option', this.validationMessageOptionType);
816
- }
817
- onLocalityPrefillEvent(event) {
818
- if (this.showDebugMessageToConsole) {
819
- console.log('lib::locality prefill event received:', event);
820
- }
821
- /*
822
- if (event.perfectMatch)
823
- {
824
- this.addressParams.minLevel = / *3* / ADDRESSLEVEL.STREET;
825
- this.streetParams = this.addressParams;
826
- }
827
- */
828
- const data = event.prefillData;
829
- if (event.prefillData.prefillMunicipalityPerfectMatchFound === true) {
830
- const suggestion = data.prefillMunicipalityPerfectMatchSuggestion;
831
- const address = suggestion.address;
832
- this.updatePostalCodeLocality(address);
833
- this.addressParams.minLevel = /*4*/ ADDRESSLEVEL.STREET;
834
- // this.localityPrefillData = this.addressParams; // as any as PrefillData;
835
- // this.localityPrefillData = new PrefillData(this.addressParams);
836
- // Object.assign(this.localityPrefillData, this.addressParams);
837
- this.prefillData = event.prefillData;
838
- this.prefillData.ts = new Date();
839
- this.prefillData.parameters.minLevel = ADDRESSLEVEL.STREET;
840
- // Be sure to propagate the localityName in place of the municipalityName !
841
- const suggestionAddress = this.prefillData.prefillMunicipalityPerfectMatchSuggestion.address;
842
- const suggestionAddressLocalityName = suggestionAddress.localityName;
843
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
844
- this.prefillData.parameters.postalCode = suggestionAddress.postalCode;
845
- // this.updatePostalCodeLocality(suggestionAddress);
846
- const streetName = this.prefillData.parameters.streetName;
847
- if (streetName === null || streetName === undefined || streetName === '') {
848
- this.setAddress(address, ADDRESSLEVEL.LOCALITY);
849
- // this.quitPrefillMode();
850
- // this.updatePostalCodeLocality(suggestionAddress);
851
- }
852
- /*
853
- const streetName = this.prefillData.parameters.streetName;
854
- if (streetName === null || streetName === undefined || streetName === '')
855
- {
856
- this.setAddress(address, ADDRESSLEVEL.LOCALITY);
857
- this.quitPrefillMode();
858
- // this.updatePostalCodeLocality(suggestionAddress);
859
- }
860
- else
861
- {
862
- if (this.showDebugMessageToConsole) { console.log('lib::prefill: trigger checking street match... ', this.prefillData); }
863
- this.streetPrefillData = this.prefillData;
864
- }
865
- */
866
- this.streetPrefillData = this.prefillData;
867
- }
868
- else {
869
- // const cpAndLocality = this.prefillData.parameters.postalCode + this.prefillData.parameters.municipalityName;
870
- const cpAndLocality = data.parameters.postalCode + data.parameters.municipalityName;
871
- this.autocompleteStreet.locality = '';
872
- if (cpAndLocality === null || cpAndLocality === undefined || cpAndLocality.length === 0) {
873
- this.setAddress(null, ADDRESSLEVEL.LOCALITY);
874
- }
875
- this.quitPrefillMode();
876
- }
877
- }
878
- onStreetPrefillEvent(event) {
879
- if (this.showDebugMessageToConsole) {
880
- console.log('lib::street: prefill event received', event);
881
- }
882
- /*
883
- const data: PrefillData = event.prefillData;
884
- if (data.prefillStreetPerfectMatchFound === true )
885
- {
886
- console.log('lib::onStreetPrefillEvent: MATCH FOUND', data);
887
- this.postalCodeLocality = 'TRUC-MUCHE';
888
- this.postalCodeLocality = 'TRUC-MUCHE 2';
889
- this.autocompleteLocality.searchText = this.postalCodeLocality;
890
- }
891
- */
892
- const data = event.prefillData;
893
- if (event.prefillData.prefillStreetPerfectMatchFound === true) {
894
- // if (this.showDebugMessageToConsole) { console.log('lib::onStreetPrefillEvent: MATCH FOUND', data); }
895
- const suggestion = data.prefillStreetPerfectMatchSuggestion;
896
- const address = suggestion.address;
897
- this.updateStreetName(address);
898
- this.addressParams.minLevel = ADDRESSLEVEL.STREET_NUMBER;
899
- // this.localityPrefillData = this.addressParams; // as any as PrefillData;
900
- // this.localityPrefillData = new PrefillData(this.addressParams);
901
- // Object.assign(this.localityPrefillData, this.addressParams);
902
- this.prefillData = event.prefillData;
903
- this.prefillData.ts = new Date();
904
- this.prefillData.parameters.minLevel = ADDRESSLEVEL.STREET_NUMBER;
905
- const suggestionAddress = this.prefillData.prefillStreetPerfectMatchSuggestion.address;
906
- const suggestionAddressLocalityName = suggestionAddress.localityName;
907
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
908
- this.prefillData.parameters.postalCode = suggestionAddress.postalCode;
909
- this.prefillData.parameters.streetName = suggestionAddress.streetName;
910
- // this.updatePostalCodeLocality(suggestionAddress);
911
- // this.updatePostalCodeLocality(suggestionAddress);
912
- const streetNumber = this.prefillData.parameters.streetNumber;
913
- if (streetNumber === null || streetNumber === undefined || streetNumber === '') {
914
- this.setAddress(address, ADDRESSLEVEL.STREET);
915
- // this.quitPrefillMode();
916
- }
917
- /*
918
- const streetNumber = this.prefillData.parameters.streetNumber;
919
- if (streetNumber === null || streetNumber === undefined || streetNumber === '')
920
- {
921
- this.setAddress(address, ADDRESSLEVEL.STREET);
922
- this.quitPrefillMode();
923
- }
924
- else
925
- {
926
- if (this.showDebugMessageToConsole) {console.log('lib::prefill: trigger checking street number match... ', this.prefillData);}
927
- this.streetNumberPrefillData = this.prefillData;
928
- }
929
- */
930
- this.streetNumberPrefillData = this.prefillData;
931
- }
932
- else {
933
- const prefillStreetName = this.prefillData.parameters.streetName;
934
- const address = this.prefillData.prefillMunicipalityPerfectMatchSuggestion.address;
935
- this.autocompleteStreetNb.streetName = '';
936
- if (this.showDebugMessageToConsole) {
937
- console.error('lib::onStreetPrefillEvent - NO MATCH AT STREET LEVEL', prefillStreetName);
938
- }
939
- if (prefillStreetName === null || prefillStreetName === undefined || prefillStreetName.length === 0) {
940
- // if (this.showDebugMessageToConsole) {console.log('lib::onStreetPrefillEvent: NO MATCH FOUND - set address', data, address); }
941
- this.setAddress(address, ADDRESSLEVEL.LOCALITY);
942
- }
943
- else {
944
- // address.streetName = prefillStreetName;
945
- address.searchBarString = prefillStreetName;
946
- this.setAddress(address, ADDRESSLEVEL.STREET);
947
- }
948
- this.quitPrefillMode();
949
- }
950
- }
951
- onStreetNumberPrefillEvent(event) {
952
- if (this.showDebugMessageToConsole) {
953
- console.log('lib::street number prefill event received:', event);
954
- }
955
- const data = event.prefillData;
956
- if (data.prefillStreetNumberPerfectMatchFound === true) {
957
- const suggestion = data.prefillStreetNumberPerfectMatchSuggestion;
958
- const address = suggestion.address;
959
- this.updateStreetNumber(address);
960
- this.autocompleteStreetNb.selectedAddress = address;
961
- const addressIsComplete = address && address.hasOwnProperty('isComplete') && address.isComplete === true ? true : false;
962
- const addressIsNotInList = address && address.hasOwnProperty('not-in-list') && address['not-in-list'] === true ? true : false;
963
- if (addressIsComplete && !addressIsNotInList) {
964
- // found address - perfect matchat street number level
965
- // Nothing to do anymore
966
- this.autocompleteStreetNb.addressIsComplete = true;
967
- this.quitPrefillMode();
968
- }
969
- else {
970
- this.addressParams.minLevel = ADDRESSLEVEL.BOX_NUMBER;
971
- this.prefillData = event.prefillData;
972
- this.prefillData.ts = new Date();
973
- this.prefillData.parameters.minLevel = ADDRESSLEVEL.BOX_NUMBER;
974
- // const suggestionAddressLocalityName
975
- // = this.prefillData.prefillStreetNumberPerfectMatchSuggestion.address.localityName;
976
- const suggestionAddress = this.prefillData.prefillStreetNumberPerfectMatchSuggestion.address;
977
- const suggestionAddressLocalityName = suggestionAddress.localityName;
978
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
979
- this.prefillData.parameters.municipalityName = suggestionAddressLocalityName;
980
- this.prefillData.parameters.postalCode = suggestionAddress.postalCode;
981
- this.prefillData.parameters.streetName = suggestionAddress.streetName;
982
- this.prefillData.parameters.streetNumber = suggestionAddress.houseNumber;
983
- // this.updatePostalCodeLocality(suggestionAddress);
984
- // this.updatePostalCodeLocality(suggestionAddress);
985
- const boxNumber = this.prefillData.parameters.boxNumber;
986
- if (!addressIsNotInList && (boxNumber === null || boxNumber === undefined || boxNumber === '')) {
987
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
988
- // this.quitPrefillMode();
989
- }
990
- /*
991
- const boxNumber = this.prefillData.parameters.boxNumber;
992
- if ( ! addressIsNotInList && (boxNumber === null || boxNumber === undefined || boxNumber === '') )
993
- {
994
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
995
- this.quitPrefillMode();
996
- }
997
- else
998
- {
999
- if (this.showDebugMessageToConsole) { console.log('lib::prefill: trigger checking box number match... ', this.prefillData); }
1000
- this.boxNumberPrefillData = this.prefillData;
1001
- }
1002
- */
1003
- this.boxNumberPrefillData = this.prefillData;
1004
- }
1005
- }
1006
- else {
1007
- const prefillStreetNumber = this.prefillData.parameters.streetNumber;
1008
- const address = this.prefillData.prefillStreetPerfectMatchSuggestion.address;
1009
- this.autocompleteBoxNb.streetNumber = '';
1010
- if (prefillStreetNumber === null || prefillStreetNumber === undefined || prefillStreetNumber.length === 0) {
1011
- this.setAddress(address, ADDRESSLEVEL.STREET);
1012
- }
1013
- else {
1014
- // address.houseNumber = prefillStreetNumber;
1015
- address.searchBarString = prefillStreetNumber;
1016
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
1017
- }
1018
- this.quitPrefillMode();
1019
- }
1020
- }
1021
- onBoxNumberPrefillEvent(event) {
1022
- if (this.showDebugMessageToConsole) {
1023
- console.log('lib::prefill: box number event received:', event);
1024
- }
1025
- const data = event.prefillData;
1026
- if (data.prefillBoxNumberPerfectMatchFound === true) {
1027
- const suggestion = data.prefillBoxNumberPerfectMatchSuggestion;
1028
- const address = suggestion.address;
1029
- this.autocompleteBoxNb.selectedAddress = address;
1030
- this.setAddress(address, ADDRESSLEVEL.BOX_NUMBER);
1031
- }
1032
- else {
1033
- const prefillBoxNumber = this.prefillData.parameters.boxNumber;
1034
- const address = this.prefillData.prefillStreetNumberPerfectMatchSuggestion.address;
1035
- if (prefillBoxNumber === null || prefillBoxNumber === undefined || prefillBoxNumber.length === 0) {
1036
- this.setAddress(address, ADDRESSLEVEL.STREET_NUMBER);
1037
- }
1038
- else {
1039
- // address.boxNumber = prefillBoxNumber;
1040
- address.searchBarString = prefillBoxNumber;
1041
- this.setAddress(address, ADDRESSLEVEL.BOX_NUMBER);
1042
- }
1043
- }
1044
- this.quitPrefillMode();
1045
- }
1046
- };
1047
- LibAddressAutocompleteByComponentComponent.ctorParameters = () => [
1048
- { type: Nis9Service },
1049
- { type: HttpService }
1050
- ];
1051
- __decorate([
1052
- ViewChild(LocalityComponent, { static: false })
1053
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteLocality", void 0);
1054
- __decorate([
1055
- ViewChild(StreetComponent, { static: false })
1056
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteStreet", void 0);
1057
- __decorate([
1058
- ViewChild(StreetNumberComponent, { static: false })
1059
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteStreetNb", void 0);
1060
- __decorate([
1061
- ViewChild(BoxNumberComponent, { static: false })
1062
- ], LibAddressAutocompleteByComponentComponent.prototype, "autocompleteBoxNb", void 0);
1063
- __decorate([
1064
- Input()
1065
- ], LibAddressAutocompleteByComponentComponent.prototype, "inputLang", null);
1066
- __decorate([
1067
- Input()
1068
- ], LibAddressAutocompleteByComponentComponent.prototype, "clearInput", null);
1069
- __decorate([
1070
- Input()
1071
- ], LibAddressAutocompleteByComponentComponent.prototype, "validationMessageOption", null);
1072
- __decorate([
1073
- Input()
1074
- ], LibAddressAutocompleteByComponentComponent.prototype, "defaultLang", void 0);
1075
- __decorate([
1076
- Input()
1077
- ], LibAddressAutocompleteByComponentComponent.prototype, "showDebugMessageToConsole", void 0);
1078
- __decorate([
1079
- Input()
1080
- ], LibAddressAutocompleteByComponentComponent.prototype, "minLevel", void 0);
1081
- __decorate([
1082
- Input()
1083
- ], LibAddressAutocompleteByComponentComponent.prototype, "notInListAllowed", void 0);
1084
- __decorate([
1085
- Input()
1086
- ], LibAddressAutocompleteByComponentComponent.prototype, "addressParams", void 0);
1087
- __decorate([
1088
- Input()
1089
- ], LibAddressAutocompleteByComponentComponent.prototype, "messageOption", void 0);
1090
- __decorate([
1091
- Input()
1092
- ], LibAddressAutocompleteByComponentComponent.prototype, "localityUrl", void 0);
1093
- __decorate([
1094
- Input()
1095
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionLocality", void 0);
1096
- __decorate([
1097
- Input()
1098
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionLocalityCount", void 0);
1099
- __decorate([
1100
- Input()
1101
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaLocality", void 0);
1102
- __decorate([
1103
- Input()
1104
- ], LibAddressAutocompleteByComponentComponent.prototype, "streetUrl", void 0);
1105
- __decorate([
1106
- Input()
1107
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionStreet", void 0);
1108
- __decorate([
1109
- Input()
1110
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionStreetCount", void 0);
1111
- __decorate([
1112
- Input()
1113
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaStreet", void 0);
1114
- __decorate([
1115
- Input()
1116
- ], LibAddressAutocompleteByComponentComponent.prototype, "streetNumberUrl", void 0);
1117
- __decorate([
1118
- Input()
1119
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionStreetNb", void 0);
1120
- __decorate([
1121
- Input()
1122
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionStreetNbCount", void 0);
1123
- __decorate([
1124
- Input()
1125
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaStreetNb", void 0);
1126
- __decorate([
1127
- Input()
1128
- ], LibAddressAutocompleteByComponentComponent.prototype, "boxNumberUrl", void 0);
1129
- __decorate([
1130
- Input()
1131
- ], LibAddressAutocompleteByComponentComponent.prototype, "maxSuggestionBoxNb", void 0);
1132
- __decorate([
1133
- Input()
1134
- ], LibAddressAutocompleteByComponentComponent.prototype, "visibleSuggestionBoxNbCount", void 0);
1135
- __decorate([
1136
- Input()
1137
- ], LibAddressAutocompleteByComponentComponent.prototype, "sortCriteriaBoxNb", void 0);
1138
- __decorate([
1139
- Output()
1140
- ], LibAddressAutocompleteByComponentComponent.prototype, "addressCompleteEventEmitter", void 0);
1141
- __decorate([
1142
- Output()
1143
- ], LibAddressAutocompleteByComponentComponent.prototype, "validationMessageEventEmitter", void 0);
1144
- __decorate([
1145
- Output()
1146
- ], LibAddressAutocompleteByComponentComponent.prototype, "clearInputEventEmitter", void 0);
1147
- __decorate([
1148
- Input()
1149
- ], LibAddressAutocompleteByComponentComponent.prototype, "apiKey", void 0);
1150
- __decorate([
1151
- Input()
1152
- ], LibAddressAutocompleteByComponentComponent.prototype, "isReadonly", void 0);
1153
- __decorate([
1154
- Input()
1155
- ], LibAddressAutocompleteByComponentComponent.prototype, "nis9InResponse", void 0);
1156
- __decorate([
1157
- Input()
1158
- ], LibAddressAutocompleteByComponentComponent.prototype, "nis9ServiceURL", void 0);
1159
- LibAddressAutocompleteByComponentComponent = __decorate([
1160
- Component({
1161
- selector: 'bp-lib-address-autocomplete-by-component',
1162
- template: "\r\n<div class=\"aacwidget-address-container\">\r\n\r\n <div class=\"bpaac-dropdown-validation\" *ngIf=\"validationMessageOptionType === 'SHOW' \">\r\n <div class=\"bpaac-validated-icon\" *ngIf=\"selectedAddress && validationMessage!==null && validationMessage.messageType!==null\"></div>\r\n <!-- {{ validationMessage | translate }} -->\r\n {{ validationMessage.translatedMessage }}\r\n </div>\r\n\r\n <!-- bp-aacwidget-autocomplete-locality -->\r\n <bp-locality class=\"aacwidget-address-locality\" *ngIf=\"isComponentReady\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedLocalityUrl\"\r\n [prefillData]=\"localityPrefillData\"\r\n [labelResourceKey]=\"'common.label.postalCode'\"\r\n [inputText]=\"postalCodeLocality\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [sortCriteria]=\"sortCriteriaLocality\"\r\n [maxSuggesionCount]=\"maxSuggestionLocality\" \r\n [visibleSuggestionCount]=\"visibleSuggestionLocalityCount\"\r\n (addressChanged)=\"setAddress($event, 4)\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (focusEvent)=\"changeMinLevel($event)\" \r\n (textChangeEvent)=\"resetLocality($event)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onLocalityPrefillEvent($event)\"></bp-locality>\r\n\r\n <bp-street class=\"aacwidget-address-street\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedStreetUrl\"\r\n [prefillData]=\"streetPrefillData\"\r\n [labelResourceKey]=\"'common.label.streetName'\"\r\n [inputText]=\"streetNameInput\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [postalCode]=\"postalCode\"\r\n [locality]=\"locality\"\r\n [sortCriteria]=\"sortCriteriaStreet\" \r\n [maxSuggesionCount]=\"maxSuggestionStreet\"\r\n [visibleSuggesionCount]=\"visibleSuggestionStreetCount\"\r\n (addressChanged)=\"setAddress($event, 3)\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (focusEvent)=\"changeMinLevel($event)\"\r\n (textChangeEvent)=\"resetStreet($event)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onStreetPrefillEvent($event)\"></bp-street>\r\n\r\n <bp-street-number class=\"aacwidget-address-streetnumber\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedStreetNumberUrl\"\r\n [selectedAddress]=\"streetAddress\"\r\n [prefillData]=\"streetNumberPrefillData\"\r\n [labelResourceKey]=\"'common.label.streetNumber'\"\r\n [inputText]=\"streetNumberInput\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [postalCode]=\"postalCode\" \r\n [locality]=\"locality\" \r\n [streetName]=\"street\"\r\n [sortCriteria]=\"sortCriteriaStreetNb\"\r\n [maxSuggesionCount]=\"maxSuggestionStreetNb\" \r\n [visibleSuggesionCount]=\"visibleSuggestionStreetNbCount\"\r\n [notInListAllowed]=\"notInListAllowed\"\r\n (addressChanged)=\"setAddress($event, 2)\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (focusEvent)=\"changeMinLevel($event)\"\r\n (textChangeEvent)=\"resetStreetNumber($event, false)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onStreetNumberPrefillEvent($event)\"></bp-street-number>\r\n\r\n <bp-box-number class=\"aacwidget-address-boxnumber\"\r\n [isReadonly]=\"isReadonly\"\r\n [showDebugMessageToConsole]=\"showDebugMessageToConsole\"\r\n [baseUrl]=\"usedBoxNumberUrl\"\r\n [selectedAddress]=\"streetNumberAddress\"\r\n [prefillData]=\"boxNumberPrefillData\"\r\n [labelResourceKey]=\"'common.label.boxNumber'\"\r\n [inputLang]=\"selectedLanguage\"\r\n [messageOption]=\"messageOption\"\r\n [postalCode]=\"postalCode\" \r\n [locality]=\"locality\" \r\n [streetName]=\"street\" \r\n [streetNumber]=\"streetNumber\"\r\n [sortCriteria]=\"sortCriteriaBoxNb\" \r\n [maxSuggesionCount]=\"maxSuggestionBoxNb\"\r\n [visibleSuggesionCount]=\"visibleSuggestionBoxNbCount\"\r\n [notInListAllowed]=\"notInListAllowed\"\r\n (messageChanged)=\"setValidationMessage($event)\"\r\n (addressChanged)=\"setAddress($event, 1)\" \r\n (focusEvent)=\"changeMinLevel($event)\"\r\n (textChangeEvent)=\"resetBoxNumber($event, false)\"\r\n (clearInputEventEmitter)=\"onClearInputEventEmitter($event)\"\r\n (prefillEventEmitter)=\"onBoxNumberPrefillEvent($event)\"></bp-box-number>\r\n</div>",
1163
- styles: [""]
1164
- })
1165
- ], LibAddressAutocompleteByComponentComponent);
1166
- export { LibAddressAutocompleteByComponentComponent };
1167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLWFkZHJlc3MtYXV0b2NvbXBsZXRlLWJ5LWNvbXBvbmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYnBvc3QvYnAtYWRkcmVzcy1hdXRvLWNvbXBsZXRlLWJ5LWNvbXBvbmVudC8iLCJzb3VyY2VzIjpbImxpYi9saWItYWRkcmVzcy1hdXRvY29tcGxldGUtYnktY29tcG9uZW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBRy9ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXpGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU90RCxJQUFhLDBDQUEwQyxHQUF2RCxNQUFhLDBDQUEwQztJQXdIckQsWUFDVSxXQUF3QixFQUN4QixXQUF3QjtRQUR4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQW5IbEMscUJBQWdCLEdBQVcsSUFBSSxDQUFDO1FB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LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBWaWV3Q2hpbGQsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcmVmaWxsZWRQYXJhbWV0ZXJzIH0gZnJvbSAnLi91dGlscy9wcmVmaWxsZWQtcGFyYW1ldGVycyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZU9wdGlvblR5cGUgfSBmcm9tICcuL2VudW0vdmFsaWRhdGlvbi1tZXNzYWdlLW9wdGlvbi10eXBlLmVudW0nO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9lbnVtL3ZhbGlkYXRpb24tbWVzc2FnZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgTG9jYWxpdHlDb21wb25lbnQgfSBmcm9tICcuL2xvY2FsaXR5L2xvY2FsaXR5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdHJlZXRDb21wb25lbnQgfSBmcm9tICcuL3N0cmVldC9zdHJlZXQuY29tcG9uZW50JztcbmltcG9ydCB7IFN0cmVldE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vc3RyZWV0LW51bWJlci9zdHJlZXQtbnVtYmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCb3hOdW1iZXJDb21wb25lbnQgfSBmcm9tICcuL2JveC1udW1iZXIvYm94LW51bWJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQUREUkVTU0xFVkVMIH0gZnJvbSAnLi9lbnVtJztcbmltcG9ydCB7IFByZWZpbGxEYXRhIH0gZnJvbSAnLi91dGlscy9wcmVmaWxsLWRhdGEnO1xuaW1wb3J0IHsgUHJlZmlsbEV2ZW50IH0gZnJvbSAnLi91dGlscy9wcmVmbGxsLmV2ZW50JztcbmltcG9ydCB7IElucHV0TmFtZVR5cGUgfSBmcm9tICcuL2VudW0vaW5wdXQtbmFtZS5lbnVtJztcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmlzOVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL25pczkuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLWxpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGliLWFkZHJlc3MtYXV0b2NvbXBsZXRlLWJ5LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWyAnLi9saWItYWRkcmVzcy1hdXRvY29tcGxldGUtYnktY29tcG9uZW50LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTGliQWRkcmVzc0F1dG9jb21wbGV0ZUJ5Q29tcG9uZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQFZpZXdDaGlsZChMb2NhbGl0eUNvbXBvbmVudCwge3N0YXRpYzogZmFsc2V9ICkgYXV0b2NvbXBsZXRlTG9jYWxpdHk7XG4gIEBWaWV3Q2hpbGQoU3RyZWV0Q29tcG9uZW50LCB7c3RhdGljOiBmYWxzZX0gKSBhdXRvY29tcGxldGVTdHJlZXQ7XG4gIEBWaWV3Q2hpbGQoU3RyZWV0TnVtYmVyQ29tcG9uZW50LCB7c3RhdGljOiBmYWxzZX0gKSBhdXRvY29tcGxldGVTdHJlZXROYjtcbiAgQFZpZXdDaGlsZChCb3hOdW1iZXJDb21wb25lbnQsIHtzdGF0aWM6IGZhbHNlfSApIGF1dG9jb21wbGV0ZUJveE5iO1xuXG4gIHNlbGVjdGVkTGFuZ3VhZ2U6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBiYXNlVXJsID0gXCJodHRwczovL2FwaS5tYWlsb3BzLmJwb3N0LmNsb3VkL3JvYS1pbmZvL2V4dGVybmFsTWFpbGluZ0FkZHJlc3NQcm9vZmluZ1Jlc3QvYXV0b2NvbXBsZXRlL1wiO1xuICBwcml2YXRlIGRlZmF1bHRBcGlLZXk9J2N5UmtLT0Q3M08xRE9kZ2NETExuc2FPaURoNk95T2t0M0JCVDVKVTEnO1xuICBcbiAgdXNlZExvY2FsaXR5VXJsID0gdGhpcy5iYXNlVXJsICsgJ2xvY2FsaXR5JztcbiAgdXNlZFN0cmVldFVybCA9IHRoaXMuYmFzZVVybCArICdzdHJlZXQnO1xuICB1c2VkU3RyZWV0TnVtYmVyVXJsID0gdGhpcy5iYXNlVXJsICsgJ3N0cmVldE51bWJlcic7XG4gIHVzZWRCb3hOdW1iZXJVcmwgPSB0aGlzLmJhc2VVcmwgKyAnYm94TnVtYmVyJztcblxuICAvLyBAdHMtaWdub3JlXG4gIEBJbnB1dCgpIHNldCBpbnB1dExhbmcodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExhbmd1YWdlKHZhbCk7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIEBJbnB1dCgpIHNldCBjbGVhcklucHV0KGZvY3VzOiB7c2V0Rm9jdXM6IGJvb2xlYW4sIHRpbWVzdGFtcDogRGF0ZX0pIHtcbiAgICB0aGlzLm9uQ2xlYXJJbnB1dChmb2N1cyk7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIEBJbnB1dCgpIHNldCB2YWxpZGF0aW9uTWVzc2FnZU9wdGlvbihvcHRpb246IHt2YWxpZGF0aW9uVHlwZTogVmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25UeXBlLCB0aW1lc3RhbXA6IERhdGV9KSB7XG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uTWVzc2FnZU9wdGlvbkZyb21JbnB1dChvcHRpb24pO1xuICB9XG5cbiAgQElucHV0KClcbiAgZGVmYXVsdExhbmc6IHN0cmluZztcblxuICBASW5wdXQoKSBzaG93RGVidWdNZXNzYWdlVG9Db25zb2xlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbkxldmVsOiBudW1iZXI7XG4gIEBJbnB1dCgpIG5vdEluTGlzdEFsbG93ZWQgPSB0cnVlO1xuICBASW5wdXQoKSBhZGRyZXNzUGFyYW1zOiBQcmVmaWxsZWRQYXJhbWV0ZXJzO1xuICBASW5wdXQoKSBtZXNzYWdlT3B0aW9uID0gJ1knO1xuXG4gIC8vIExPQ0FMSVRZXG4gIEBJbnB1dCgpIGxvY2FsaXR5VXJsID0gdGhpcy5iYXNlVXJsICsgJ2xvY2FsaXR5JztcbiAgQElucHV0KCkgbWF4U3VnZ2VzdGlvbkxvY2FsaXR5ID0gNTtcbiAgQElucHV0KCkgdmlzaWJsZVN1Z2dlc3Rpb25Mb2NhbGl0eUNvdW50ID0gNTtcbiAgQElucHV0KCkgc29ydENyaXRlcmlhTG9jYWxpdHk6IHN0cmluZztcbiAgcG9zdGFsQ29kZUxvY2FsaXR5OiBzdHJpbmc7XG4gIC8vIGxvY2FsaXR5UGFyYW1zOiBQcmVmaWxsZWRQYXJhbWV0ZXJzO1xuICBsb2NhbGl0eVByZWZpbGxEYXRhOiBQcmVmaWxsRGF0YSA9IG51bGw7XG5cbiAgLy8gU1RSRUVUXG4gIEBJbnB1dCgpIHN0cmVldFVybCA9IHRoaXMuYmFzZVVybCArICdzdHJlZXQnO1xuICBASW5wdXQoKSBtYXhTdWdnZXN0aW9uU3RyZWV0ID0gNTtcbiAgQElucHV0KCkgdmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXRDb3VudCA9IDU7XG4gIEBJbnB1dCgpIHNvcnRDcml0ZXJpYVN0cmVldDogc3RyaW5nO1xuICAvLyBzdHJlZXRQYXJhbXM6IFByZWZpbGxlZFBhcmFtZXRlcnM7XG4gIHN0cmVldFByZWZpbGxEYXRhOiBQcmVmaWxsRGF0YSA9IG51bGw7XG5cbiAgLy8gU1RSRUVUIE5VTUJFUlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIEBJbnB1dCgpIHN0cmVldE51bWJlclVybCA9IHRoaXMuYmFzZVVybCArICdzdHJlZXROdW1iZXInO1xuICBASW5wdXQoKSBtYXhTdWdnZXN0aW9uU3RyZWV0TmIgPSA1O1xuICBASW5wdXQoKSB2aXNpYmxlU3VnZ2VzdGlvblN0cmVldE5iQ291bnQgPSA1O1xuICBASW5wdXQoKSBzb3J0Q3JpdGVyaWFTdHJlZXROYjogc3RyaW5nO1xuICAvLyBzdHJlZXROdW1iZXJQYXJhbXM6IFByZWZpbGxlZFBhcmFtZXRlcnM7XG4gIHN0cmVldE51bWJlclByZWZpbGxEYXRhOiBQcmVmaWxsRGF0YSA9IG51bGw7XG5cbiAgLy8gQk9YIE5VTUJFUlxuICBASW5wdXQoKSBib3hOdW1iZXJVcmwgPSB0aGlzLmJhc2VVcmwgKyAnYm94TnVtYmVyJztcbiAgQElucHV0KCkgbWF4U3VnZ2VzdGlvbkJveE5iID0gNTtcbiAgQElucHV0KCkgdmlzaWJsZVN1Z2dlc3Rpb25Cb3hOYkNvdW50ID0gNTtcbiAgQElucHV0KCkgc29ydENyaXRlcmlhQm94TmI6IHN0cmluZztcbiAgLy8gYm94UGFyYW1zOiBQcmVmaWxsZWRQYXJhbWV0ZXJzO1xuICBib3hOdW1iZXJQcmVmaWxsRGF0YTogUHJlZmlsbERhdGEgPSBudWxsO1xuXG5cbiAgYm94TnVtYmVyOiBzdHJpbmc7XG4gIGNvbXBsZXRlQWRkcmVzczogc3RyaW5nO1xuICBlbWl0dGVkQWRkcmVzczogYW55ID0gbnVsbDtcbiAgbG9jYWxpdHk6IHN0cmluZztcbiAgcG9zdGFsQ29kZTogc3RyaW5nO1xuICBzZWxlY3RlZEFkZHJlc3M6IGFueTtcbiAgc3RyZWV0OiBzdHJpbmc7XG4gIHN0cmVldEFkZHJlc3M6IGFueTtcbiAgc3RyZWV0TmFtZUlucHV0OiBzdHJpbmc7XG4gIHN0cmVldE51bWJlcjogc3RyaW5nO1xuICBzdHJlZXROdW1iZXJBZGRyZXNzOiBhbnk7XG4gIHN0cmVldE51bWJlcklucHV0OiBzdHJpbmc7XG4gIHZhbGlkYXRpb25NZXNzYWdlOiB7bWVzc2FnZVR5cGU6IFZhbGlkYXRpb25NZXNzYWdlVHlwZSwgdHJhbnNsYXRlZE1lc3NhZ2U6IHN0cmluZ30gPSB7bWVzc2FnZVR5cGU6IG51bGwsIHRyYW5zbGF0ZWRNZXNzYWdlOiAnJ307XG4gIHZhbGlkYXRpb25NZXNzYWdlT3B0aW9uVHlwZTogVmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25UeXBlO1xuXG5cbiAgQE91dHB1dCgpIGFkZHJlc3NDb21wbGV0ZUV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uTWVzc2FnZUV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjbGVhcklucHV0RXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXG4gIHByZWZpbGxEYXRhOiBQcmVmaWxsRGF0YTtcbiAgcHJvY2Vzc2luZ1ByZWZpbGxEYXRhID0gZmFsc2U7XG5cblxuICAvLyBQYXNzIHRoZSBBUEkga2V5IGFzIGEgcHJvcGVydHkgb2YgdGhlIGxpYnJhcnkgIVxuICBASW5wdXQoKVxuICBhcGlLZXk9dGhpcy5kZWZhdWx0QXBpS2V5O1xuXG5cbiAgLy8gc2V0IHRoZSB3aWRnZXQgYXMgcmVhZG9ubHkgYW5kIGFkZCBOSVM5IHF1ZXJ5IHBhcmFtZXRlclxuICBASW5wdXQoKVxuICBpc1JlYWRvbmx5PWZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIG5pczlJblJlc3BvbnNlPWZhbHNlO1xuXG4gIC8vIGh0dHBzOi8vYmdzLmJwb3N0LmJlL3NldC1zZWxlY3Rpb24tY2lyY2xlP2xuZz00LjM2MDUzNzU3MjU0MTk0OCZsYXQ9NTAuODQwNjM1ODI4MDYwMzcmcmFkaXVzPTAuMDAxXG4gIEBJbnB1dCgpXG4gIG5pczlTZXJ2aWNlVVJMPScnO1xuXG4gIGlzQ29tcG9uZW50UmVhZHkgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5pczlTZXJ2aWNlOiBOaXM5U2VydmljZSxcbiAgICBwcml2YXRlIGh0dHBTZXJ2aWNlOiBIdHRwU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWRcbiAge1xuICAgIC8vY29uc29sZS53YXJuKCdsaWIgLSBuZ09uSW5pdCcpO1xuXG4gICAgdGhpcy5uaXM5U2VydmljZS5zZXROaXM5U2VydmljZVVSTCh0aGlzLm5pczlTZXJ2aWNlVVJMKTtcblxuICAgIGNvbnN0IGFwaUtleSA9IHRoaXMuaXNWYWxpZERhdGEodGhpcy5hcGlLZXkpID8gdGhpcy5hcGlLZXkgOiB0aGlzLmRlZmF1bHRBcGlLZXk7XG4gICAgdGhpcy5odHRwU2VydmljZS5zZXRBcGlLZXkoIGFwaUtleSApO1xuICAgIFxuICAgIGlmKCB0aGlzLmlzVmFsaWREYXRhKHRoaXMubG9jYWxpdHlVcmwpICkgdGhpcy51c2VkTG9jYWxpdHlVcmw9dGhpcy5sb2NhbGl0eVVybDtcbiAgICBpZiggdGhpcy5pc1ZhbGlkRGF0YSh0aGlzLnN0cmVldFVybCkgKSB0aGlzLnVzZWRTdHJlZXRVcmw9dGhpcy5zdHJlZXRVcmw7XG4gICAgaWYoIHRoaXMuaXNWYWxpZERhdGEodGhpcy5zdHJlZXROdW1iZXJVcmwpICkgdGhpcy51c2VkU3RyZWV0TnVtYmVyVXJsPXRoaXMuc3RyZWV0TnVtYmVyVXJsO1xuICAgIGlmKCB0aGlzLmlzVmFsaWREYXRhKHRoaXMuYm94TnVtYmVyVXJsKSApIHRoaXMudXNlZEJveE51bWJlclVybD10aGlzLmJveE51bWJlclVybDtcblxuICAgIGlmICh0aGlzLmFkZHJlc3NQYXJhbXMpXG4gICAge1xuICAgICAgdGhpcy5wcmVmaWxsRGF0YSA9IHRoaXMuYWRkcmVzc1BhcmFtcyBhcyBhbnkgYXMgUHJlZmlsbERhdGE7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaXNDb21wb25lbnRSZWFkeSA9IHRydWU7XG4gIH1cblxuICBpc1ZhbGlkRGF0YSggc3RyOiBzdHJpbmcpOiBib29sZWFuXG4gIHtcbiAgICByZXR1cm4gc3RyIT09dW5kZWZpbmVkICYmIHN0ciE9PW51bGwgJiYgc3RyLmxlbmd0aD4wO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKVxuICB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKVxuICAgIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcylcbiAge1xuICAgIGlmIChjaGFuZ2VzKVxuICAgIHtcbiAgICAgIC8vIGNvZGUgZm9yIHRyYWNpbmdcbiAgICAgIC8vIHZpc2libGVTdWdnZXN0aW9uU3RyZWV0TmJDb3VudFxuICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge1xuICAgICAgICB0aGlzLmRpc3BsYXlQYXJhbWV0ZXJzQ2hhbmdlc1RvQ29uc29sZShjaGFuZ2VzKTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdhcGlLZXknKSAmJiAhY2hhbmdlcy5hcGlLZXkuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgY29uc3QgYXBpS2V5ID0gdGhpcy5hcGlLZXkhPT1udWxsICYmIHRoaXMuYXBpS2V5IT09dW5kZWZpbmVkICYmIHRoaXMuYXBpS2V5Lmxlbmd0aD4wIFxuICAgICAgICAgICAgPyB0aGlzLmFwaUtleVxuICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRBcGlLZXk7XG4gICAgICAgIHRoaXMuaHR0cFNlcnZpY2Uuc2V0QXBpS2V5KCBhcGlLZXkgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xvY2FsaXR5VXJsJykgJiYgIWNoYW5nZXMubG9jYWxpdHlVcmwuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgY29uc3QgbG9jYWxpdHlVcmwgPSB0aGlzLmxvY2FsaXR5VXJsIT09bnVsbCAmJiB0aGlzLmxvY2FsaXR5VXJsIT09dW5kZWZpbmVkICYmIHRoaXMubG9jYWxpdHlVcmwubGVuZ3RoPjAgXG4gICAgICAgICAgICA/IHRoaXMubG9jYWxpdHlVcmxcbiAgICAgICAgICAgIDogdGhpcy5iYXNlVXJsICsgJ2xvY2FsaXR5JztcbiAgICAgICAgdGhpcy51c2VkTG9jYWxpdHlVcmw9bG9jYWxpdHlVcmw7XG4gICAgICAgIGNvbnNvbGUubG9nKCduZ09uQ2hhbmdlcyAtIGxvY2FsaXR5VXJsOiAnLCBsb2NhbGl0eVVybCk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnc3RyZWV0VXJsJykgJiYgIWNoYW5nZXMuc3RyZWV0VXJsLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IHN0cmVldFVybCA9IHRoaXMuc3RyZWV0VXJsIT09bnVsbCAmJiB0aGlzLnN0cmVldFVybCE9PXVuZGVmaW5lZCAmJiB0aGlzLnN0cmVldFVybC5sZW5ndGg+MCBcbiAgICAgICAgICAgID8gdGhpcy5zdHJlZXRVcmxcbiAgICAgICAgICAgIDogdGhpcy5iYXNlVXJsICsgJ3N0cmVldCc7XG4gICAgICAgIHRoaXMuc3RyZWV0VXJsPXN0cmVldFVybDtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdzdHJlZXROdW1iZXJVcmwnKSAmJiAhY2hhbmdlcy5zdHJlZXROdW1iZXJVcmwuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgY29uc3Qgc3RyZWV0TnVtYmVyVXJsID0gdGhpcy5zdHJlZXROdW1iZXJVcmwhPT1udWxsICYmIHRoaXMuc3RyZWV0TnVtYmVyVXJsIT09dW5kZWZpbmVkICYmIHRoaXMuc3RyZWV0TnVtYmVyVXJsLmxlbmd0aD4wIFxuICAgICAgICAgICAgPyB0aGlzLnN0cmVldE51bWJlclVybFxuICAgICAgICAgICAgOiB0aGlzLmJhc2VVcmwgKyAnc3RyZWV0TnVtYmVyJztcbiAgICAgICAgdGhpcy5zdHJlZXROdW1iZXJVcmw9c3RyZWV0TnVtYmVyVXJsO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2JveE51bWJlclVybCcpICYmICFjaGFuZ2VzLmJveE51bWJlclVybC5maXJzdENoYW5nZSkge1xuICAgICAgICBjb25zdCBib3hOdW1iZXJVcmwgPSB0aGlzLmJveE51bWJlclVybCE9PW51bGwgJiYgdGhpcy5ib3hOdW1iZXJVcmwhPT11bmRlZmluZWQgJiYgdGhpcy5ib3hOdW1iZXJVcmwubGVuZ3RoPjAgXG4gICAgICAgICAgICA/IHRoaXMuYm94TnVtYmVyVXJsXG4gICAgICAgICAgICA6IHRoaXMuYmFzZVVybCArICdib3hOdW1iZXInO1xuICAgICAgICB0aGlzLmJveE51bWJlclVybD1ib3hOdW1iZXJVcmw7XG4gICAgICB9XG4gICAgICAqL1xuXG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnYWRkcmVzc1BhcmFtcycpICYmICFjaGFuZ2VzLmFkZHJlc3NQYXJhbXMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIC8vIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdhZGRyZXNzUGFyYW1zJykpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nUHJlZmlsbERhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmVudGVyUHJlZmlsbE1vZGUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBudWxsO1xuICAgICAgICB0aGlzLm5vdGlmeUFkZHJlc3NDb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgIC8qXG4gICAgICAgIGlmICh0aGlzLmxvY2FsaXR5UHJlZmlsbERhdGEgIT09IG51bGwgJiYgdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyB0aGlzLm9uQ2xlYXJJbnB1dEV2ZW50RW1pdHRlcihJbnB1dE5hbWVUeXBlLkxPQ0FMSVRZKTtcbiAgICAgICAgICB0aGlzLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ib3hOdW1iZXJQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RyZWV0TnVtYmVyUHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnN0cmVldFByZWZpbGxEYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6d2lkZ2V0IGRldGVjdGVkIHByZWZpbGxpbmcnLCB0aGlzLmFkZHJlc3NQYXJhbXMpOyB9XG4gICAgICAgIHRoaXMuYWRkcmVzc1BhcmFtcy5taW5MZXZlbCA9IC8qNCovIEFERFJFU1NMRVZFTC5MT0NBTElUWTtcbiAgICAgICAgLy8gdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhID0gdGhpcy5hZGRyZXNzUGFyYW1zOyAvLyBhcyBhbnkgYXMgUHJlZmlsbERhdGE7XG4gICAgICAgIHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSA9IG5ldyBQcmVmaWxsRGF0YSh0aGlzLmFkZHJlc3NQYXJhbXMpO1xuICAgICAgICAvLyBPYmplY3QuYXNzaWduKHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSwgdGhpcy5hZGRyZXNzUGFyYW1zKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge2NvbnNvbGUubG9nKCdsaWI6OmNoZWNraW5nIGxvY2FsaXR5IG1hdGNoLi4uICcsIHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSk7IH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkaXNwbGF5UGFyYW1ldGVyc0NoYW5nZXNUb0NvbnNvbGUoY2hhbmdlczogU2ltcGxlQ2hhbmdlcylcbiAge1xuICAgIC8vIG1lc3NhZ2VPcHRpb25cbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWVzc2FnZU9wdGlvbicpICYmICFjaGFuZ2VzLm1lc3NhZ2VPcHRpb24uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IHdjQ2hhbmdlcyA9IGNoYW5nZXMubWVzc2FnZU9wdGlvbi5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSBtZXNzYWdlT3B0aW9uJywgd2NDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBtYXhTdWdnZXN0aW9uTG9jYWxpdHlcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWF4U3VnZ2VzdGlvbkxvY2FsaXR5JykgJiYgIWNoYW5nZXMubWF4U3VnZ2VzdGlvbkxvY2FsaXR5LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLm1heFN1Z2dlc3Rpb25Mb2NhbGl0eS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSBtYXhTdWdnZXN0aW9uTG9jYWxpdHknLCB3Y0NoYW5nZXMpO1xuICAgIH1cblxuICAgIC8vIHZpc2libGVTdWdnZXN0aW9uTG9jYWxpdHlDb3VudFxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCd2aXNpYmxlU3VnZ2VzdGlvbkxvY2FsaXR5Q291bnQnKSAmJiAhY2hhbmdlcy52aXNpYmxlU3VnZ2VzdGlvbkxvY2FsaXR5Q291bnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IHdjQ2hhbmdlcyA9IGNoYW5nZXMudmlzaWJsZVN1Z2dlc3Rpb25Mb2NhbGl0eUNvdW50LmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIHZpc2libGVTdWdnZXN0aW9uTG9jYWxpdHlDb3VudCcsIHdjQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gc29ydENyaXRlcmlhTG9jYWxpdHlcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnc29ydENyaXRlcmlhTG9jYWxpdHknKSAmJiAhY2hhbmdlcy5zb3J0Q3JpdGVyaWFMb2NhbGl0eS5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5zb3J0Q3JpdGVyaWFMb2NhbGl0eS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSBzb3J0Q3JpdGVyaWFMb2NhbGl0eScsIHdjQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gbWF4U3VnZ2VzdGlvblN0cmVldFxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdtYXhTdWdnZXN0aW9uU3RyZWV0JykgJiYgIWNoYW5nZXMubWF4U3VnZ2VzdGlvblN0cmVldC5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5tYXhTdWdnZXN0aW9uU3RyZWV0LmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIG1heFN1Z2dlc3Rpb25TdHJlZXQnLCB3Y0NoYW5nZXMpO1xuICAgIH1cbiAgICAvLyB2aXNpYmxlU3VnZ2VzdGlvblN0cmVldENvdW50XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3Zpc2libGVTdWdnZXN0aW9uU3RyZWV0Q291bnQnKSAmJiAhY2hhbmdlcy52aXNpYmxlU3VnZ2VzdGlvblN0cmVldENvdW50LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB3Y0NoYW5nZXMgPSBjaGFuZ2VzLnZpc2libGVTdWdnZXN0aW9uU3RyZWV0Q291bnQuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gdmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXRDb3VudCcsIHdjQ2hhbmdlcyk7XG4gICAgfVxuICAgIC8vIHNvcnRDcml0ZXJpYVN0cmVldFxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdzb3J0Q3JpdGVyaWFTdHJlZXQnKSAmJiAhY2hhbmdlcy5zb3J0Q3JpdGVyaWFTdHJlZXQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IHdjQ2hhbmdlcyA9IGNoYW5nZXMuc29ydENyaXRlcmlhU3RyZWV0LmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdsaWIgd2lkZ2V0OSAtIHNvcnRDcml0ZXJpYVN0cmVldCcsIHdjQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gbWF4U3VnZ2VzdGlvblN0cmVldE5iXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21heFN1Z2dlc3Rpb25TdHJlZXROYicpICYmICFjaGFuZ2VzLm1heFN1Z2dlc3Rpb25TdHJlZXROYi5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5tYXhTdWdnZXN0aW9uU3RyZWV0TmIuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gbWF4U3VnZ2VzdGlvblN0cmVldE5iJywgd2NDaGFuZ2VzKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXROYkNvdW50XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3Zpc2libGVTdWdnZXN0aW9uU3RyZWV0TmJDb3VudCcpICYmICFjaGFuZ2VzLnZpc2libGVTdWdnZXN0aW9uU3RyZWV0TmJDb3VudC5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy52aXNpYmxlU3VnZ2VzdGlvblN0cmVldE5iQ291bnQuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gdmlzaWJsZVN1Z2dlc3Rpb25TdHJlZXROYkNvdW50Jywgd2NDaGFuZ2VzKTtcbiAgICB9XG4gICAgLy8gc29ydENyaXRlcmlhU3RyZWV0TmJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnc29ydENyaXRlcmlhU3RyZWV0TmInKSAmJiAhY2hhbmdlcy5zb3J0Q3JpdGVyaWFTdHJlZXROYi5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5zb3J0Q3JpdGVyaWFTdHJlZXROYi5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSBzb3J0Q3JpdGVyaWFTdHJlZXROYicsIHdjQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gbWF4U3VnZ2VzdGlvbkJveE5iXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21heFN1Z2dlc3Rpb25Cb3hOYicpICYmICFjaGFuZ2VzLm1heFN1Z2dlc3Rpb25Cb3hOYi5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5tYXhTdWdnZXN0aW9uQm94TmIuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gbWF4U3VnZ2VzdGlvbkJveE5iJywgd2NDaGFuZ2VzKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZVN1Z2dlc3Rpb25Cb3hOYkNvdW50XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3Zpc2libGVTdWdnZXN0aW9uQm94TmJDb3VudCcpICYmICFjaGFuZ2VzLnZpc2libGVTdWdnZXN0aW9uQm94TmJDb3VudC5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy52aXNpYmxlU3VnZ2VzdGlvbkJveE5iQ291bnQuY3VycmVudFZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2xpYiB3aWRnZXQ5IC0gdmlzaWJsZVN1Z2dlc3Rpb25Cb3hOYkNvdW50Jywgd2NDaGFuZ2VzKTtcbiAgICB9XG4gICAgLy8gc29ydENyaXRlcmlhQm94TmJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnc29ydENyaXRlcmlhQm94TmInKSAmJiAhY2hhbmdlcy5zb3J0Q3JpdGVyaWFCb3hOYi5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgd2NDaGFuZ2VzID0gY2hhbmdlcy5zb3J0Q3JpdGVyaWFCb3hOYi5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnbGliIHdpZGdldDkgLSBzb3J0Q3JpdGVyaWFCb3hOYicsIHdjQ2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJXaWRnZXQoKSB7XG4gICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcldpZGdldCgpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuY2xlYXJXaWRnZXQoKTtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5jbGVhcldpZGdldCgpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkuY2xlYXJXaWRnZXQoKTtcbiAgfVxuXG4gIGNoYW5nZU1pbkxldmVsKG1pbkxldmVsOiBudW1iZXIpIHtcbiAgICB0aGlzLm1pbkxldmVsID0gbWluTGV2ZWw7XG4gIH1cblxuICAvLyBDYWxsZWQgYnkgdGhlIHNwZWNpZmljIGJ1dHRvbnMgaW4gdGhlIGFwcFxuICBvbkNsZWFySW5wdXQoZm9jdXM6IHtzZXRGb2N1czogYm9vbGVhbiwgdGltZXN0YW1wOiBEYXRlfSkge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ2xpYjo6b25DbGVhcklucHV0JywgZm9jdXMpOyB9XG5cbiAgICAvKlxuICAgIGlmIChmb2N1cyA9PT0gbnVsbCB8fCBmb2N1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSovXG5cbiAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuXG4gICAgY29uc3Qgc2V0Rm9jdXMgPSAoZm9jdXMgPT09IG51bGwgfHwgZm9jdXMgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IGZvY3VzLnNldEZvY3VzO1xuXG4gICAgc3dpdGNoICh0aGlzLm1pbkxldmVsKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0aGlzLmJveE51bWJlciA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dEV2ZW50RW1pdHRlci5lbWl0KCdCT1hfTlVNQkVSJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0aGlzLmJveE51bWJlciA9ICcnO1xuICAgICAgICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFySW5wdXQoc2V0Rm9jdXMsIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dEV2ZW50RW1pdHRlci5lbWl0KCdTVFJFRVRfTlVNQkVSJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICB0aGlzLmJveE51bWJlciA9ICcnO1xuICAgICAgICAgIHRoaXMuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgdGhpcy5zdHJlZXQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmNsZWFySW5wdXQoc2V0Rm9jdXMsIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmNsZWFySW5wdXRFdmVudEVtaXR0ZXIuZW1pdCgnU1RSRUVUJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQm94IG51bWJlclxuICAgICAgICAgIHRoaXMuYm94TnVtYmVyID0gJyc7XG4gICAgICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlQm94TmIpXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KHNldEZvY3VzLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFN0cmVldCBudW1iZXJcbiAgICAgICAgICB0aGlzLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLm9uQ2xlYXJTdHJlZXROdW1iZXJJbnB1dChzZXRGb2N1cywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTdHJlZXQgbmFtZVxuICAgICAgICAgIHRoaXMuc3RyZWV0ID0gJyc7XG4gICAgICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0KVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmNsZWFySW5wdXQoc2V0Rm9jdXMsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTG9jYWxpdHlcbiAgICAgICAgICB0aGlzLmxvY2FsaXR5ID0gJyc7XG4gICAgICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkpXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LmNsZWFySW5wdXQoc2V0Rm9jdXMsIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNsZWFySW5wdXRFdmVudEVtaXR0ZXIuZW1pdCgnTE9DQUxJVFknKTtcbiAgICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBnZXRCb3hQcmVmaXgoKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UpIHtcbiAgICAgIGNhc2UgJ2ZyJzpcbiAgICAgICAgcHJlZml4ID0gJ0JURSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbmwnOlxuICAgICAgICAgIHByZWZpeCA9ICdCVVMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcHJlZml4ID0gJ0JPWCc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcHJlZml4O1xuICB9XG5cbiAgbm90aWZ5QWRkcmVzc0NvbXBsZXRlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdub3RpZnkgZm9yIGFkZHJlc3MgY29tcGxldGUnKTtcbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKVxuICAgIHtcbiAgICAgIGNvbnNvbGUubG9nKCdub3RpZnlBZGRyZXNzQ29tcGxldGUnLCB0aGlzLnNlbGVjdGVkQWRkcmVzcywgJ25pczlJblJlc3BvbnNlOicrdGhpcy5uaXM5SW5SZXNwb25zZSwgdHlwZW9mIHRoaXMubmlzOUluUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGlmKCAodGhpcy5uaXM5SW5SZXNwb25zZSA9PT0gdHJ1ZSB8fCAnJyt0aGlzLm5pczlJblJlc3BvbnNlID09PSAndHJ1ZScpICYmIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmhhc093blByb3BlcnR5KCdsYXRpdHVkZScpICYmIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmhhc093blByb3BlcnR5KCdsb25naXR1ZGUnKSlcbiAgICB7XG4gICAgICBjb25zdCBsYXRpdHVkZSA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmxhdGl0dWRlO1xuICAgICAgY29uc3QgbG9uZ2l0dWRlID0gdGhpcy5zZWxlY3RlZEFkZHJlc3MubG9uZ2l0dWRlO1xuICAgICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgY29uc29sZS5sb2coJ2NhbGxpbmcgbmlzOSBzZXJ2aWNlIHRvIGdldCBuaXM5IGRhdGEgKDEpOicsIGxvbmdpdHVkZSwgbGF0aXR1ZGUpO1xuXG4gICAgICB0aGlzLm5pczlTZXJ2aWNlLmRldGVybWluZU5pczlEYXRhKGxvbmdpdHVkZSwgbGF0aXR1ZGUpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnbmlzIERBVEE6JywgZGF0YSk7XG4gICAgICAgICAgLypcbiAgICAgICAgICBuaXMgREFUQTogXG4gICAgICAgICAge1N0YXR1czogJ3N1Y2Nlc3MnLCBkYXRhOiBBcnJheSgxKX1cbiAgICAgICAgICBTdGF0dXM6IFwic3VjY2Vzc1wiXG4gICAgICAgICAgZGF0YTogWycyNTExMkEyMS0nXVxuICAgICAgICAgICovXG4gICAgICAgICAgaWYoZGF0YSE9PXVuZGVmaW5lZCAmJiBkYXRhICE9PW51bGwgJiYgZGF0YS5oYXNPd25Qcm9wZXJ0eSgnU3RhdHVzJykgJiYgZGF0YS5TdGF0dXM9PT0nc3VjY2VzcycpXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbmlzOURhdGEgPSBkYXRhLmRhdGE7XG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KG5pczlEYXRhKSAmJiBuaXM5RGF0YS5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLm5pczkgPSBuaXM5RGF0YVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmFkZHJlc3NDb21wbGV0ZUV2ZW50RW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgICB0aGlzLmVtaXR0ZWRBZGRyZXNzID0gdGhpcy5zZWxlY3RlZEFkZHJlc3M7XG4gICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlTG9jYWxpdHkodGhpcy5lbWl0dGVkQWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSBjb25zb2xlLmxvZygnTk9UIGNhbGxpbmcgbmlzOSBzZXJ2aWNlIHRvIGdldCBuaXM5IGRhdGEgKDEpJyk7XG4gICAgICB0aGlzLmFkZHJlc3NDb21wbGV0ZUV2ZW50RW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgIHRoaXMuZW1pdHRlZEFkZHJlc3MgPSB0aGlzLnNlbGVjdGVkQWRkcmVzcztcbiAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHRoaXMuZW1pdHRlZEFkZHJlc3MpO1xuICAgIH1cblxuICB9XG5cbiAgb25DbGVhcklucHV0RXZlbnRFbWl0dGVyKGV2ZW50KSB7XG5cbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdsaWI6Om9uQ2xlYXJJbnB1dEV2ZW50RW1pdHRlcicsIGV2ZW50KTsgfVxuXG4gICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcblxuICAgIGxldCBuZXh0QWRkcmVzcyA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzOyAvLyB0aGlzLmVtaXR0ZWRBZGRyZXNzO1xuXG4gICAgaWYgKGV2ZW50ID09PSBJbnB1dE5hbWVUeXBlLkxPQ0FMSVRZKVxuICAgIHtcbiAgICAgIC8vIEJveCBudW1iZXJcbiAgICAgIHRoaXMuYm94TnVtYmVyID0gJyc7XG4gICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVCb3hOYilcbiAgICAgIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gU3RyZWV0IG51bWJlclxuICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iKVxuICAgICAge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBTdHJlZXQgbmFtZVxuICAgICAgdGhpcy5zdHJlZXQgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZVN0cmVldClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBMb2NhbGl0eVxuICAgICAgdGhpcy5sb2NhbGl0eSA9ICcnO1xuICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkpXG4gICAgICB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgbmV4dEFkZHJlc3MgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudCA9PT0gSW5wdXROYW1lVHlwZS5TVFJFRVQpXG4gICAge1xuICAgICAgLy8gQm94IG51bWJlclxuICAgICAgdGhpcy5ib3hOdW1iZXIgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUJveE5iKVxuICAgICAge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBTdHJlZXQgbnVtYmVyXG4gICAgICB0aGlzLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIpXG4gICAgICB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5vbkNsZWFyU3RyZWV0TnVtYmVySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0cmVldCBuYW1lXG4gICAgICB0aGlzLnN0cmVldCA9ICcnO1xuICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0KVxuICAgICAge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgbmV4dEFkZHJlc3MgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudCA9PT0gSW5wdXROYW1lVHlwZS5TVFJFRVRfTlVNQkVSKVxuICAgIHtcbiAgICAgIC8vIEJveCBudW1iZXJcbiAgICAgIHRoaXMuYm94TnVtYmVyID0gJyc7XG4gICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVCb3hOYilcbiAgICAgIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gU3RyZWV0IG51bWJlclxuICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iKVxuICAgICAge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgLy8gdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIG5leHRBZGRyZXNzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQgPT09IElucHV0TmFtZVR5cGUuQk9YX05VTUJFUilcbiAgICB7XG4gICAgICAvLyBCb3ggbnVtYmVyXG4gICAgICB0aGlzLmJveE51bWJlciA9ICcnO1xuICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlQm94TmIpXG4gICAgICB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAvLyB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW50aW9uOiBpZiBub3QtaW4tbGlzdCBkb24ndCByZXNldCB0aGUgYWRkcmVzcywganVzdCBtb2RpZnkgaXRcbiAgICAgIGNvbnN0IGFkZHJlc3NJc05vdEluTGlzdFxuICAgICAgICA9IG5leHRBZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgIG5leHRBZGRyZXNzICE9PSBudWxsXG4gICAgICAgICAgJiYgbmV4dEFkZHJlc3MuaGFzT3duUHJvcGVydHkoJ25vdC1pbi1saXN0JykgJiYgbmV4dEFkZHJlc3NbJ25vdC1pbi1saXN0J10gPT09IHRydWVcbiAgICAgICAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgLypcbiAgICAgIGlmIChhZGRyZXNzSXNOb3RJbkxpc3QpXG4gICAgICB7XG4gICAgICAgIGRlbGV0ZSBuZXh0QWRkcmVzcy5ib3hOdW1iZXI7XG4gICAgICAgIG5leHRBZGRyZXNzLmlzQ29tcGxldGVOb3RpZmljYXRpb25Eb25lID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnN0cmVldE51bWJlckFkZHJlc3MgIT09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdyZXNldCBib3ggb24gbm90LWluLWxpc3QnLCB0aGlzLnN0cmVldE51bWJlckFkZHJlc3MpO1xuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgIHtcbiAgICAgICAgbmV4dEFkZHJlc3MgPSBudWxsO1xuICAgICAgfVxuICAgICAgKi9cblxuICAgICAgbmV4dEFkZHJlc3MgPSB0aGlzLnN0cmVldE51bWJlckFkZHJlc3MgIT09IG51bGwgPyB0aGlzLnN0cmVldE51bWJlckFkZHJlc3MgOiBudWxsO1xuICAgICAgLypcbiAgICAgIGNvbnN0IGFkZHJlc3NJc05vdEluTGlzdFxuICAgICAgICA9IG5leHRBZGRyZXNzICE9PSBudWxsICYmIG5leHRBZGRyZXNzLmhhc093blByb3BlcnR5KCdub3QtaW4tbGlzdCcpICYmIG5leHRBZGRyZXNzWydub3QtaW4tbGlzdCddID09PSB0cnVlXG4gICAgICAgID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgKi9cbiAgICAgIGNvbnN0IGFkZHJlc3NJc0NvbXBsZXRlXG4gICAgICAgID0gbmV4dEFkZHJlc3MgIT09IHVuZGVmaW5lZCAmJiBuZXh0QWRkcmVzcyAhPT0gbnVsbFxuICAgICAgICAgICYmIG5leHRBZGRyZXNzLmhhc093blByb3BlcnR5KCdpc0NvbXBsZXRlJykgJiYgbmV4dEFkZHJlc3MuaXNDb21wbGV0ZSA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuYWRkcmVzc0lzQ29tcGxldGUgPSBhZGRyZXNzSXNDb21wbGV0ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFySW5wdXRFdmVudEVtaXR0ZXIuZW1pdChldmVudCk7XG5cbiAgICBpZiAodGhpcy5lbWl0dGVkQWRkcmVzcyAhPT0gbnVsbCApIHtcbiAgICAgIGlmKG5leHRBZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgbmV4dEFkZHJlc3MgIT09IG51bGwgJiYgbmV4dEFkZHJlc3MuaGFzT3duUHJvcGVydHkoJ2xhdGl0dWRlJykgJiYgbmV4dEFkZHJlc3MuaGFzT3duUHJvcGVydHkoJ2xvbmdpdHVkZScpKVxuICAgICAge1xuICAgICAgICBjb25zdCBsYXRpdHVkZSA9IG5leHRBZGRyZXNzLmxhdGl0dWRlO1xuICAgICAgICBjb25zdCBsb25naXR1ZGUgPSBuZXh0QWRkcmVzcy5sb25naXR1ZGU7XG4gICAgICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIGNvbnNvbGUubG9nKCdjYWxsaW5nIG5pczkgc2VydmljZSB0byBnZXQgbmlzOSBkYXRhICgyKScsIGxvbmdpdHVkZSwgbGF0aXR1ZGUpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSBjb25zb2xlLmxvZygnTk9UIGNhbGxpbmcgbmlzOSBzZXJ2aWNlIHRvIGdldCBuaXM5IGRhdGEgKDIpJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZHJlc3NDb21wbGV0ZUV2ZW50RW1pdHRlci5lbWl0KG5leHRBZGRyZXNzKTtcbiAgICAgIHRoaXMuZW1pdHRlZEFkZHJlc3MgPSBuZXh0QWRkcmVzcztcbiAgICB9XG5cblxuICAgIC8vIGdrYVxuICAgIC8qXG4gICAgaWYgKGV2ZW50ID09PSBJbnB1dE5hbWVUeXBlLkxPQ0FMSVRZKVxuICAgIHtcbiAgICAgIHRoaXMubWluTGV2ZWwgPSBBRERSRVNTTEVWRUwuTE9DQUxJVFk7XG4gICAgICB0aGlzLmJveE51bWJlclByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVyUHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgdGhpcy5zdHJlZXRQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICB0aGlzLmxvY2FsaXR5UHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgLy8gdGhpcy5jbGVhcklucHV0KGZvY3VzOiB7c2V0Rm9jdXM6IGJvb2xlYW4sIHRpbWVzdGFtcDogRGF0ZX0pO1xuICAgICAgdGhpcy5sb2NhbGl0eSA9ICcnO1xuICAgICAgdGhpcy5wb3N0YWxDb2RlID0gJyc7XG4gICAgICB0aGlzLnN0cmVldCA9IG51bGw7XG4gICAgICB0aGlzLnN0cmVldE51bWJlciA9IG51bGw7XG4gICAgICB0aGlzLmJveE51bWJlciA9IG51bGw7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5vbkNsZWFyU3RyZWV0TnVtYmVySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQubG9jYWxpdHkgPSAnJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQgPT09IElucHV0TmFtZVR5cGUuU1RSRUVUKVxuICAgIHtcbiAgICAgIHRoaXMubWluTGV2ZWwgPSBBRERSRVNTTEVWRUwuU1RSRUVUO1xuICAgICAgdGhpcy5ib3hOdW1iZXJQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnN0cmVldE51bWJlclByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuc3RyZWV0UHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgLy8gdGhpcy5jbGVhcklucHV0KGZvY3VzOiB7c2V0Rm9jdXM6IGJvb2xlYW4sIHRpbWVzdGFtcDogRGF0ZX0pO1xuICAgICAgdGhpcy5zdHJlZXQgPSBudWxsO1xuICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSBudWxsO1xuICAgICAgdGhpcy5ib3hOdW1iZXIgPSBudWxsO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIC8vIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkuY2xlYXJJbnB1dChmYWxzZSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQgPT09IElucHV0TmFtZVR5cGUuU1RSRUVUX05VTUJFUilcbiAgICB7XG4gICAgICB0aGlzLm1pbkxldmVsID0gQUREUkVTU0xFVkVMLlNUUkVFVF9OVU1CRVI7XG4gICAgICB0aGlzLmJveE51bWJlclByZWZpbGxEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVyUHJlZmlsbERhdGEgPSBudWxsO1xuICAgICAgLy8gdGhpcy5jbGVhcklucHV0KGZvY3VzOiB7c2V0Rm9jdXM6IGJvb2xlYW4sIHRpbWVzdGFtcDogRGF0ZX0pO1xuICAgICAgdGhpcy5zdHJlZXROdW1iZXIgPSBudWxsO1xuICAgICAgdGhpcy5ib3hOdW1iZXIgPSBudWxsO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE5hbWUgPSAnJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAvLyB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAvLyB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50ID09PSBJbnB1dE5hbWVUeXBlLkJPWF9OVU1CRVIpXG4gICAge1xuICAgICAgdGhpcy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5CT1hfTlVNQkVSO1xuICAgICAgdGhpcy5ib3hOdW1iZXJQcmVmaWxsRGF0YSA9IG51bGw7XG4gICAgICB0aGlzLmJveE51bWJlciA9IG51bGw7XG4gICAgICAvLyB0aGlzLmNsZWFySW5wdXQoZm9jdXM6IHtzZXRGb2N1czogYm9vbGVhbiwgdGltZXN0YW1wOiBEYXRlfSk7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICAgIC8vIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIub25DbGVhclN0cmVldE51bWJlcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAvLyB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5jbGVhcklucHV0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAvLyB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LmNsZWFySW5wdXQoZmFsc2UsIGZhbHNlKTtcbiAgICB9XG4gICAgKi9cbiAgfVxuXG4gIHJlc2V0TG9jYWxpdHkoZXZlbnQpIHtcbiAgICB0aGlzLnBvc3RhbENvZGUgPSAnJztcbiAgICB0aGlzLmxvY2FsaXR5ID0gJyc7XG4gICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICB0aGlzLm9uQ2xlYXJJbnB1dEV2ZW50RW1pdHRlcihJbnB1dE5hbWVUeXBlLlNUUkVFVCk7XG4gICAgdGhpcy5zZXRBZGRyZXNzKG51bGwsIDQpO1xuICB9XG5cbiAgcmVzZXRTdHJlZXQoZXZlbnQpIHtcbiAgICB0aGlzLnN0cmVldCA9ICcnO1xuICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgdGhpcy5vbkNsZWFySW5wdXRFdmVudEVtaXR0ZXIoSW5wdXROYW1lVHlwZS5TVFJFRVRfTlVNQkVSKTtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLmFkZHJlc3NJc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG4gICAgdGhpcy5zZXRBZGRyZXNzKG51bGwsIDMpO1xuICB9XG5cbiAgcmVzZXRTdHJlZXROdW1iZXIoZXZlbnQsIHJlc2V0QWRkcmVzczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3Jlc2V0IHN0cmVldCBudW1uZXIhJywgZXZlbnQsIHJlc2V0QWRkcmVzcyk7XG4gICAgdGhpcy5zdHJlZXROdW1iZXIgPSAnJztcbiAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgIHRoaXMub25DbGVhcklucHV0RXZlbnRFbWl0dGVyKElucHV0TmFtZVR5cGUuQk9YX05VTUJFUik7XG5cbiAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmFkZHJlc3NJc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROdW1iZXIgPSAnJztcbiAgICB0aGlzLnNldEFkZHJlc3MobnVsbCwgMik7XG4gICAgLy8gJCQgNyB0aGlzLnNldEFkZHJlc3MobnVsbCwgMik7IC8vICQkID8/Pz8/XG4gICAgLypcbiAgICBpZiAocmVzZXRBZGRyZXNzID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNldEFkZHJlc3MoLyAqbnVsbCogLyB0aGlzLnNlbGVjdGVkQWRkcmVzcyk7XG4gICAgfSovXG4gIH1cblxuICByZXNldEJveE51bWJlcihldmVudCwgcmVzZXRBZGRyZXNzOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAvLyBjb25zb2xlLmxvZygncmVzZXQgc3RyZWV0IG51bW5lciEnLCBldmVudCwgcmVzZXRBZGRyZXNzKTtcbiAgICB0aGlzLmJveE51bWJlciA9ICcnO1xuICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5hZGRyZXNzSXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgIHRoaXMuc2V0QWRkcmVzcyhudWxsLCAxKTtcbiAgICAvLyB0aGlzLm9uQ2xlYXJJbnB1dEV2ZW50RW1pdHRlcihJbnB1dE5hbWVUeXBlLkJPWF9OVU1CRVIpO1xuICAgIC8vICQkIDcgdGhpcy5zZXRBZGRyZXNzKG51bGwsIDEpOyAvLyAkJCA/Pz8/P1xuICAgIC8qXG4gICAgaWYgKHJlc2V0QWRkcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRBZGRyZXNzKC8gKm51bGwqIC8gdGhpcy5zZWxlY3RlZEFkZHJlc3MpO1xuICAgIH0qL1xuICB9XG5cbiAgZW50ZXJQcmVmaWxsTW9kZSgpIHtcbiAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6ZW50ZXJQcmVmaWxsTW9kZSgpJyk7IH1cbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGVCb3hOYiAmJiB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iICYmIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0ICYmIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkgKVxuICAgIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIucHJlZmlsbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnByZWZpbGxpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQucHJlZmlsbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5LnByZWZpbGxpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldC5sb2NhbGl0eSA9ICcnO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnN0cmVldE51bWJlciA9ICcnO1xuICAgIH1cblxuICB9XG5cbiAgcXVpdFByZWZpbGxNb2RlKCkge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHtjb25zb2xlLmxvZygnbGliOjpxdWl0UHJlZmlsbE1vZGUoKScpOyB9XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlQm94TmIgJiYgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYiAmJiB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldCAmJiB0aGlzLmF1dG9jb21wbGV0ZUxvY2FsaXR5IClcbiAgICB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIucHJlZmlsbGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQucHJlZmlsbGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9jZXNzaW5nUHJlZmlsbERhdGEgPSBmYWxzZTtcbiAgfVxuXG4gIHNldEFkZHJlc3MoYWRkcmVzczogYW55LCBsZXZlbD86IG51bWJlcikge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHtjb25zb2xlLmxvZygnbGliOjpzZXRBZGRyZXNzIC0gYWRkcmVzcyBwYXJ0LCBsZXZlbCcsIGFkZHJlc3MsIGxldmVsKTsgfVxuXG4gICAgLyogJCQgJCRcbiAgICBpZiAodGhpcy5zZWxlY3RlZEFkZHJlc3MgJiYgIWFkZHJlc3MpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXNldCBhZGRyZXNzIScpO1xuICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBudWxsO1xuICAgICAgdGhpcy5zdHJlZXRBZGRyZXNzID0gbnVsbDtcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVyQWRkcmVzcyA9IG51bGw7XG4gICAgICB0aGlzLm5vdGlmeUFkZHJlc3NDb21wbGV0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAqL1xuICAgIGlmIChhZGRyZXNzID09PSBudWxsIHx8IGFkZHJlc3MgPT09IHVuZGVmaW5lZCApXG4gICAge1xuICAgICAgY29uc3QgZG9Ob3RpZnkgPSAodGhpcy5zZWxlY3RlZEFkZHJlc3MgIT09IG51bGwgJiYgdGhpcy5zZWxlY3RlZEFkZHJlc3MgIT09IHVuZGVmaW5lZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcyA9IG51bGw7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLmFkZHJlc3NJc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmFkZHJlc3NJc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgICBpZiAoZG9Ob3RpZnkpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlBZGRyZXNzQ29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWRkcmVzcykge1xuICAgICAgZGVsZXRlIGFkZHJlc3MubWVzc2FnZXM7XG4gICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlQWRkcmVzcygpO1xuICAgICAgdGhpcy5wb3N0YWxDb2RlID0gYWRkcmVzcy5wb3N0YWxDb2RlID8gYWRkcmVzcy5wb3N0YWxDb2RlIDogJyc7XG4gICAgICB0aGlzLmxvY2FsaXR5ID0gYWRkcmVzcy5sb2NhbGl0eU5hbWUgPyBhZGRyZXNzLmxvY2FsaXR5TmFtZSA6ICcnO1xuICAgICAgdGhpcy5zdHJlZXQgPSBhZGRyZXNzLnN0cmVldE5hbWUgPyBhZGRyZXNzLnN0cmVldE5hbWUgOiAnJztcbiAgICAgIC8vIGNvbnN0IG5vdEluTGlzdCA9IGFkZHJlc3NbJ25vdC1pbi1saXN0J107XG4gICAgICAvLyBjb25zdCBpc05vdEluTGlzdCA9IG5vdEluTGlzdCAhPT0gbnVsbCAmJiBub3RJbkxpc3QgIT09IHVuZGVmaW5lZCAmJiBub3RJbkxpc3QgPT09IHRydWU7XG4gICAgICAvKlxuICAgICAgaWYgKGFkZHJlc3MuaG91c2VOdW1iZXIpIHtcbiAgICAgICAgaWYgKCFhZGRyZXNzLmlzQ29tcGxldGUgfHwgaXNOb3RJbkxpc3QpIHtcbiAgICAgICAgICB0aGlzLnN0cmVldE51bWJlciA9IGFkZHJlc3MuaG91c2VOdW1iZXIgPyBhZGRyZXNzLmhvdXNlTnVtYmVyIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFhZGRyZXNzLmJveE51bWJlcikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgcmVzZXQgc3RyZWV0IG51bWJlciAhJyk7XG4gICAgICAgICAgICBpZiAoICF0aGlzLnByb2Nlc3NpbmdQcmVmaWxsRGF0YSApIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldFN0cmVldE51bWJlcihudWxsLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGlzLnN0cmVldE51bWJlciA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cblxuICAgICAgY29uc3QgYWRkcmVzc0lzQ29tcGxldGUgPSBhZGRyZXNzICE9PSBudWxsICYmIGFkZHJlc3MgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiBhZGRyZXNzLmhhc093blByb3BlcnR5KCdpc0NvbXBsZXRlJykgJiYgYWRkcmVzcy5pc0NvbXBsZXRlID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgY29uc3QgYWRkcmVzc0lzTm90SW5MaXN0ID0gYWRkcmVzcyAhPT0gbnVsbCAmJiBhZGRyZXNzICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgYWRkcmVzcy5oYXNPd25Qcm9wZXJ0eSgnbm90LWluLWxpc3QnKSAmJiBhZGRyZXNzWydub3QtaW4tbGlzdCddID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICBzd2l0Y2ggKGxldmVsKSB7XG5cbiAgICAgICAgLy8gTG9jYWxpdHkgLyBNdW5pY2lwYWxpdHkgYW5kIFBPc3RhbENvZGVcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KGFkZHJlc3MpO1xuICAgICAgICAgIC8qXG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcldpZGdldCgpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5zdHJlZXRBZGRyZXNzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnN0cmVldE51bWJlckFkZHJlc3MgPSBudWxsO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlU3RyZWV0TmIuc3RyZWV0TmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gU3RyZWV0IE5hbWVcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KGFkZHJlc3MpO1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RyZWV0TmFtZShhZGRyZXNzKTtcbiAgICAgICAgICB0aGlzLnN0cmVldEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgICAgIHRoaXMuc3RyZWV0TnVtYmVyQWRkcmVzcyA9IG51bGw7XG4gICAgICAgICAgLypcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5jbGVhcldpZGdldCgpO1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICAvLyBTVFJFRVQgTnVtYmVyXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVMb2NhbGl0eShhZGRyZXNzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0cmVldE5hbWUoYWRkcmVzcyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVTdHJlZXROdW1iZXIoYWRkcmVzcyk7IC8vICQkXG4gICAgICAgICAgdGhpcy5zdHJlZXRBZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgICB0aGlzLnN0cmVldE51bWJlckFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgICAgIGlmIChhZGRyZXNzLmhhc093blByb3BlcnR5KCdpc0NvbXBsZXRlJykgJiYgYWRkcmVzcy5pc0NvbXBsZXRlID09PSB0cnVlIClcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLmFkZHJlc3NJc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChhZGRyZXNzSXNOb3RJbkxpc3QpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gYWRkcmVzcy5ob3VzZU51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zdHJlZXROdW1iZXIgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gYWRkcmVzcy5ob3VzZU51bWJlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLypcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgKi9cbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJveE5iLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICAvLyBCT1ggTnVtYmVyXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoYWRkcmVzc0lzTm90SW5MaXN0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLmFkZHJlc3NJc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICggdGhpcy5zZWxlY3RlZEFkZHJlc3MgJiYgdGhpcy5zZWxlY3RlZEFkZHJlc3MuaXNDb21wbGV0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgIGlmIChhZGRyZXNzLmlzQ29tcGxldGUgPT09IHRydWUgKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEFkZHJlc3MuaXNDb21wbGV0ZU5vdGlmaWNhdGlvbkRvbmUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcy5pc0NvbXBsZXRlTm90aWZpY2F0aW9uRG9uZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5ub3RpZnlBZGRyZXNzQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ub3RpZnlBZGRyZXNzQ29tcGxldGUoKTtcbiAgICAgIH1cbiAgICAgICovXG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmlzQ29tcGxldGVOb3RpZmljYXRpb25Eb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMubm90aWZ5QWRkcmVzc0NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0TGFuZ3VhZ2UobGFuZzogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0gbGFuZztcbiAgfVxuXG4gIHNldFZhbGlkYXRpb25NZXNzYWdlKC8qbWVzc2FnZTogc3RyaW5nKi9tZXNzYWdlOiB7bWVzc2FnZVR5cGU6IFZhbGlkYXRpb25NZXNzYWdlVHlwZSwgdHJhbnNsYXRlZE1lc3NhZ2U6IHN0cmluZ30pIHtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gbWVzc2FnZTtcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uTWVzc2FnZU9wdGlvblR5cGUgPT09IFZhbGlkYXRpb25NZXNzYWdlT3B0aW9uVHlwZS5FTUlUKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlRXZlbnRFbWl0dGVyLmVtaXQobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cblxuICB1cGRhdGVQb3N0YWxDb2RlTG9jYWxpdHkoYWRkcmVzcykge1xuICAgIGlmIChhZGRyZXNzICYmIGFkZHJlc3MucG9zdGFsQ29kZSAmJiBhZGRyZXNzLmxvY2FsaXR5TmFtZSkge1xuICAgICAgdGhpcy5wb3N0YWxDb2RlTG9jYWxpdHkgPSAgYWRkcmVzcy5wb3N0YWxDb2RlICArICcgJyArIGFkZHJlc3MubG9jYWxpdHlOYW1lO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVMb2NhbGl0eS5zZWFyY2hUZXh0ID0gdGhpcy5wb3N0YWxDb2RlTG9jYWxpdHk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlU3RyZWV0TmFtZShhZGRyZXNzKSB7XG4gICAgaWYgKGFkZHJlc3MgJiYgYWRkcmVzcy5zdHJlZXROYW1lKSB7XG4gICAgICB0aGlzLnN0cmVldE5hbWVJbnB1dCA9IGFkZHJlc3Muc3RyZWV0TmFtZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVTdHJlZXROdW1iZXIoYWRkcmVzcykge1xuICAgIGlmIChhZGRyZXNzICYmIGFkZHJlc3MuaG91c2VOdW1iZXIpIHtcbiAgICAgIHRoaXMuc3RyZWV0TnVtYmVySW5wdXQgPSBhZGRyZXNzLmhvdXNlTnVtYmVyO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbXBsZXRlQWRkcmVzcygpIHtcbiAgICBsZXQgY29uY2F0U3RyID0gJyc7XG4gICAgY29uY2F0U3RyICs9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzLnN0cmVldE5hbWUgPyBgJHt0aGlzLnNlbGVjdGVkQWRkcmVzcy5zdHJlZXROYW1lfSBgIDogJyc7XG4gICAgY29uY2F0U3RyICs9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmhvdXNlTnVtYmVyID8gYCR7dGhpcy5zZWxlY3RlZEFkZHJlc3MuaG91c2VOdW1iZXJ9IGAgOiAnJztcbiAgICBjb25jYXRTdHIgKz0gdGhpcy5zZWxlY3RlZEFkZHJlc3MuYm94TnVtYmVyID8gYCR7dGhpcy5nZXRCb3hQcmVmaXgoKX0gJHt0aGlzLnNlbGVjdGVkQWRkcmVzcy5ib3hOdW1iZXJ9IGAgOiAnJztcbiAgICBjb25jYXRTdHIgKz0gdGhpcy5zZWxlY3RlZEFkZHJlc3MucG9zdGFsQ29kZSA/IGAke3RoaXMuc2VsZWN0ZWRBZGRyZXNzLnBvc3RhbENvZGV9IGAgOiAnJztcbiAgICBjb25jYXRTdHIgKz0gdGhpcy5zZWxlY3RlZEFkZHJlc3MubXVuaWNpcGFsaXR5TmFtZSA/IGAke3RoaXMuc2VsZWN0ZWRBZGRyZXNzLm11bmljaXBhbGl0eU5hbWV9IGAgOiAnJztcbiAgICB0aGlzLmNvbXBsZXRlQWRkcmVzcyA9IGNvbmNhdFN0cjtcbiAgfVxuXG4gIHNldFZhbGlkYXRpb25NZXNzYWdlT3B0aW9uRnJvbUlucHV0KG9wdGlvbjoge3ZhbGlkYXRpb25UeXBlOiBWYWxpZGF0aW9uTWVzc2FnZU9wdGlvblR5cGUsIHRpbWVzdGFtcDogRGF0ZX0pIHtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9uVHlwZSA9IG9wdGlvbi52YWxpZGF0aW9uVHlwZTtcbiAgICAvLyBjb25zb2xlLmxvZygnYWRkcmVzc2UgYXV0b2NvbXBsZXRlIC0gdmFsaWRhdGlvbiBtZXNzYWdlIG9wdGlvbicsIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VPcHRpb25UeXBlKTtcbiAgfVxuXG4gIG9uTG9jYWxpdHlQcmVmaWxsRXZlbnQoZXZlbnQ6IFByZWZpbGxFdmVudCkge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHtjb25zb2xlLmxvZygnbGliOjpsb2NhbGl0eSBwcmVmaWxsIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTsgfVxuICAgIC8qXG4gICAgaWYgKGV2ZW50LnBlcmZlY3RNYXRjaClcbiAgICB7XG4gICAgICB0aGlzLmFkZHJlc3NQYXJhbXMubWluTGV2ZWwgPSAvICozKiAvIEFERFJFU1NMRVZFTC5TVFJFRVQ7XG4gICAgICB0aGlzLnN0cmVldFBhcmFtcyA9IHRoaXMuYWRkcmVzc1BhcmFtcztcbiAgICB9XG4gICAgKi9cbiAgICBjb25zdCBkYXRhID0gZXZlbnQucHJlZmlsbERhdGE7XG4gICAgaWYgKGV2ZW50LnByZWZpbGxEYXRhLnByZWZpbGxNdW5pY2lwYWxpdHlQZXJmZWN0TWF0Y2hGb3VuZCA9PT0gdHJ1ZSApXG4gICAge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGRhdGEucHJlZmlsbE11bmljaXBhbGl0eVBlcmZlY3RNYXRjaFN1Z2dlc3Rpb247XG4gICAgICBjb25zdCBhZGRyZXNzID0gc3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlTG9jYWxpdHkoYWRkcmVzcyk7XG4gICAgICB0aGlzLmFkZHJlc3NQYXJhbXMubWluTGV2ZWwgPSAvKjQqLyBBRERSRVNTTEVWRUwuU1RSRUVUO1xuICAgICAgLy8gdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhID0gdGhpcy5hZGRyZXNzUGFyYW1zOyAvLyBhcyBhbnkgYXMgUHJlZmlsbERhdGE7XG4gICAgICAvLyB0aGlzLmxvY2FsaXR5UHJlZmlsbERhdGEgPSBuZXcgUHJlZmlsbERhdGEodGhpcy5hZGRyZXNzUGFyYW1zKTtcbiAgICAgIC8vIE9iamVjdC5hc3NpZ24odGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhLCB0aGlzLmFkZHJlc3NQYXJhbXMpO1xuICAgICAgdGhpcy5wcmVmaWxsRGF0YSA9IGV2ZW50LnByZWZpbGxEYXRhO1xuICAgICAgdGhpcy5wcmVmaWxsRGF0YS50cyA9IG5ldyBEYXRlKCk7XG4gICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMubWluTGV2ZWwgPSBBRERSRVNTTEVWRUwuU1RSRUVUO1xuICAgICAgLy8gQmUgc3VyZSB0byBwcm9wYWdhdGUgdGhlIGxvY2FsaXR5TmFtZSBpbiBwbGFjZSBvZiB0aGUgbXVuaWNpcGFsaXR5TmFtZSAhXG4gICAgICBjb25zdCBzdWdnZXN0aW9uQWRkcmVzcyA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eVBlcmZlY3RNYXRjaFN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25BZGRyZXNzTG9jYWxpdHlOYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3MubG9jYWxpdHlOYW1lO1xuICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm11bmljaXBhbGl0eU5hbWUgPSBzdWdnZXN0aW9uQWRkcmVzc0xvY2FsaXR5TmFtZTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5wb3N0YWxDb2RlID0gc3VnZ2VzdGlvbkFkZHJlc3MucG9zdGFsQ29kZTtcbiAgICAgIC8vIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHN1Z2dlc3Rpb25BZGRyZXNzKTtcblxuICAgICAgY29uc3Qgc3RyZWV0TmFtZSA9IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lO1xuICAgICAgaWYgKHN0cmVldE5hbWUgPT09IG51bGwgfHwgc3RyZWV0TmFtZSA9PT0gdW5kZWZpbmVkIHx8IHN0cmVldE5hbWUgPT09ICcnKVxuICAgICAge1xuICAgICAgICB0aGlzLnNldEFkZHJlc3MoYWRkcmVzcywgQUREUkVTU0xFVkVMLkxPQ0FMSVRZKTtcbiAgICAgICAgLy8gdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVQb3N0YWxDb2RlTG9jYWxpdHkoc3VnZ2VzdGlvbkFkZHJlc3MpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgY29uc3Qgc3RyZWV0TmFtZSA9IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lO1xuICAgICAgaWYgKHN0cmVldE5hbWUgPT09IG51bGwgfHwgc3RyZWV0TmFtZSA9PT0gdW5kZWZpbmVkIHx8IHN0cmVldE5hbWUgPT09ICcnKVxuICAgICAge1xuICAgICAgICB0aGlzLnNldEFkZHJlc3MoYWRkcmVzcywgQUREUkVTU0xFVkVMLkxPQ0FMSVRZKTtcbiAgICAgICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVQb3N0YWxDb2RlTG9jYWxpdHkoc3VnZ2VzdGlvbkFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdsaWI6OnByZWZpbGw6IHRyaWdnZXIgY2hlY2tpbmcgc3RyZWV0IG1hdGNoLi4uICcsIHRoaXMucHJlZmlsbERhdGEpOyB9XG4gICAgICAgIHRoaXMuc3RyZWV0UHJlZmlsbERhdGEgPSB0aGlzLnByZWZpbGxEYXRhO1xuICAgICAgfVxuICAgICAgKi9cblxuICAgICAgdGhpcy5zdHJlZXRQcmVmaWxsRGF0YSA9IHRoaXMucHJlZmlsbERhdGE7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAvLyBjb25zdCBjcEFuZExvY2FsaXR5ID0gdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnBvc3RhbENvZGUgKyB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZTtcbiAgICAgIGNvbnN0IGNwQW5kTG9jYWxpdHkgPSBkYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZSArIGRhdGEucGFyYW1ldGVycy5tdW5pY2lwYWxpdHlOYW1lO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXQubG9jYWxpdHkgPSAnJztcbiAgICAgIGlmICggY3BBbmRMb2NhbGl0eSA9PT0gbnVsbCB8fCBjcEFuZExvY2FsaXR5ID09PSB1bmRlZmluZWQgfHwgY3BBbmRMb2NhbGl0eS5sZW5ndGggPT09IDAgKVxuICAgICAge1xuICAgICAgICB0aGlzLnNldEFkZHJlc3MobnVsbCwgQUREUkVTU0xFVkVMLkxPQ0FMSVRZKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgb25TdHJlZXRQcmVmaWxsRXZlbnQoZXZlbnQ6IFByZWZpbGxFdmVudCkge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHtjb25zb2xlLmxvZygnbGliOjpzdHJlZXQ6IHByZWZpbGwgZXZlbnQgcmVjZWl2ZWQnLCBldmVudCk7IH1cbiAgICAvKlxuICAgIGNvbnN0IGRhdGE6IFByZWZpbGxEYXRhID0gZXZlbnQucHJlZmlsbERhdGE7XG4gICAgaWYgKGRhdGEucHJlZmlsbFN0cmVldFBlcmZlY3RNYXRjaEZvdW5kID09PSB0cnVlIClcbiAgICB7XG4gICAgICBjb25zb2xlLmxvZygnbGliOjpvblN0cmVldFByZWZpbGxFdmVudDogTUFUQ0ggRk9VTkQnLCBkYXRhKTtcbiAgICAgIHRoaXMucG9zdGFsQ29kZUxvY2FsaXR5ID0gJ1RSVUMtTVVDSEUnO1xuICAgICAgdGhpcy5wb3N0YWxDb2RlTG9jYWxpdHkgPSAnVFJVQy1NVUNIRSAyJztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTG9jYWxpdHkuc2VhcmNoVGV4dCA9IHRoaXMucG9zdGFsQ29kZUxvY2FsaXR5O1xuICAgIH1cbiAgICAqL1xuICAgIGNvbnN0IGRhdGEgPSBldmVudC5wcmVmaWxsRGF0YTtcbiAgICBpZiAoZXZlbnQucHJlZmlsbERhdGEucHJlZmlsbFN0cmVldFBlcmZlY3RNYXRjaEZvdW5kID09PSB0cnVlIClcbiAgICB7XG4gICAgICAvLyBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdsaWI6Om9uU3RyZWV0UHJlZmlsbEV2ZW50OiBNQVRDSCBGT1VORCcsIGRhdGEpOyB9XG4gICAgICBjb25zdCBzdWdnZXN0aW9uID0gZGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoU3VnZ2VzdGlvbjtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBzdWdnZXN0aW9uLmFkZHJlc3M7XG4gICAgICB0aGlzLnVwZGF0ZVN0cmVldE5hbWUoYWRkcmVzcyk7XG4gICAgICB0aGlzLmFkZHJlc3NQYXJhbXMubWluTGV2ZWwgPSBBRERSRVNTTEVWRUwuU1RSRUVUX05VTUJFUjtcbiAgICAgIC8vIHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSA9IHRoaXMuYWRkcmVzc1BhcmFtczsgLy8gYXMgYW55IGFzIFByZWZpbGxEYXRhO1xuICAgICAgLy8gdGhpcy5sb2NhbGl0eVByZWZpbGxEYXRhID0gbmV3IFByZWZpbGxEYXRhKHRoaXMuYWRkcmVzc1BhcmFtcyk7XG4gICAgICAvLyBPYmplY3QuYXNzaWduKHRoaXMubG9jYWxpdHlQcmVmaWxsRGF0YSwgdGhpcy5hZGRyZXNzUGFyYW1zKTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEgPSBldmVudC5wcmVmaWxsRGF0YTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEudHMgPSBuZXcgRGF0ZSgpO1xuICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm1pbkxldmVsID0gQUREUkVTU0xFVkVMLlNUUkVFVF9OVU1CRVI7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uQWRkcmVzcyA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbFN0cmVldFBlcmZlY3RNYXRjaFN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25BZGRyZXNzTG9jYWxpdHlOYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3MubG9jYWxpdHlOYW1lO1xuICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm11bmljaXBhbGl0eU5hbWUgPSBzdWdnZXN0aW9uQWRkcmVzc0xvY2FsaXR5TmFtZTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5wb3N0YWxDb2RlID0gc3VnZ2VzdGlvbkFkZHJlc3MucG9zdGFsQ29kZTtcbiAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3Muc3RyZWV0TmFtZTtcbiAgICAgIC8vIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHN1Z2dlc3Rpb25BZGRyZXNzKTtcbiAgICAgIC8vIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHN1Z2dlc3Rpb25BZGRyZXNzKTtcblxuICAgICAgY29uc3Qgc3RyZWV0TnVtYmVyID0gdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE51bWJlcjtcbiAgICAgIGlmIChzdHJlZXROdW1iZXIgPT09IG51bGwgfHwgc3RyZWV0TnVtYmVyID09PSB1bmRlZmluZWQgfHwgc3RyZWV0TnVtYmVyID09PSAnJylcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5TVFJFRVQpO1xuICAgICAgICAvLyB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgY29uc3Qgc3RyZWV0TnVtYmVyID0gdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE51bWJlcjtcbiAgICAgIGlmIChzdHJlZXROdW1iZXIgPT09IG51bGwgfHwgc3RyZWV0TnVtYmVyID09PSB1bmRlZmluZWQgfHwgc3RyZWV0TnVtYmVyID09PSAnJylcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5TVFJFRVQpO1xuICAgICAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6cHJlZmlsbDogdHJpZ2dlciBjaGVja2luZyBzdHJlZXQgbnVtYmVyIG1hdGNoLi4uICcsIHRoaXMucHJlZmlsbERhdGEpO31cbiAgICAgICAgdGhpcy5zdHJlZXROdW1iZXJQcmVmaWxsRGF0YSA9IHRoaXMucHJlZmlsbERhdGE7XG4gICAgICB9XG4gICAgICAqL1xuXG4gICAgICB0aGlzLnN0cmVldE51bWJlclByZWZpbGxEYXRhID0gdGhpcy5wcmVmaWxsRGF0YTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgIGNvbnN0IHByZWZpbGxTdHJlZXROYW1lID0gdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE5hbWU7XG4gICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsTXVuaWNpcGFsaXR5UGVyZmVjdE1hdGNoU3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5zdHJlZXROYW1lID0gJyc7XG5cbiAgICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignbGliOjpvblN0cmVldFByZWZpbGxFdmVudCAtIE5PIE1BVENIIEFUIFNUUkVFVCBMRVZFTCcsIHByZWZpbGxTdHJlZXROYW1lICk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJlZmlsbFN0cmVldE5hbWUgPT09IG51bGwgfHwgcHJlZmlsbFN0cmVldE5hbWUgPT09IHVuZGVmaW5lZCB8fCBwcmVmaWxsU3RyZWV0TmFtZS5sZW5ndGggPT09IDAgKVxuICAgICAge1xuICAgICAgICAvLyBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7Y29uc29sZS5sb2coJ2xpYjo6b25TdHJlZXRQcmVmaWxsRXZlbnQ6IE5PIE1BVENIIEZPVU5EIC0gc2V0IGFkZHJlc3MnLCBkYXRhLCBhZGRyZXNzKTsgfVxuICAgICAgICB0aGlzLnNldEFkZHJlc3MoYWRkcmVzcywgQUREUkVTU0xFVkVMLkxPQ0FMSVRZKTtcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgIHtcbiAgICAgICAgLy8gYWRkcmVzcy5zdHJlZXROYW1lID0gcHJlZmlsbFN0cmVldE5hbWU7XG4gICAgICAgIGFkZHJlc3Muc2VhcmNoQmFyU3RyaW5nID0gcHJlZmlsbFN0cmVldE5hbWU7XG4gICAgICAgIHRoaXMuc2V0QWRkcmVzcyhhZGRyZXNzLCBBRERSRVNTTEVWRUwuU1RSRUVUKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgb25TdHJlZXROdW1iZXJQcmVmaWxsRXZlbnQoZXZlbnQ6IFByZWZpbGxFdmVudCkge1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ2xpYjo6c3RyZWV0IG51bWJlciBwcmVmaWxsIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTsgfVxuICAgIGNvbnN0IGRhdGEgPSBldmVudC5wcmVmaWxsRGF0YTtcbiAgICBpZiAoZGF0YS5wcmVmaWxsU3RyZWV0TnVtYmVyUGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUpXG4gICAge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGRhdGEucHJlZmlsbFN0cmVldE51bWJlclBlcmZlY3RNYXRjaFN1Z2dlc3Rpb247XG4gICAgICBjb25zdCBhZGRyZXNzID0gc3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgICAgdGhpcy51cGRhdGVTdHJlZXROdW1iZXIoYWRkcmVzcyk7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVN0cmVldE5iLnNlbGVjdGVkQWRkcmVzcyA9IGFkZHJlc3M7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NJc0NvbXBsZXRlID0gYWRkcmVzcyAmJiBhZGRyZXNzLmhhc093blByb3BlcnR5KCdpc0NvbXBsZXRlJykgJiYgYWRkcmVzcy5pc0NvbXBsZXRlID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgY29uc3QgYWRkcmVzc0lzTm90SW5MaXN0ID0gYWRkcmVzcyAmJiBhZGRyZXNzLmhhc093blByb3BlcnR5KCdub3QtaW4tbGlzdCcpICYmIGFkZHJlc3NbJ25vdC1pbi1saXN0J10gPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgIGlmIChhZGRyZXNzSXNDb21wbGV0ZSAmJiAhIGFkZHJlc3NJc05vdEluTGlzdCApXG4gICAgICB7XG4gICAgICAgIC8vIGZvdW5kIGFkZHJlc3MgLSBwZXJmZWN0IG1hdGNoYXQgc3RyZWV0IG51bWJlciBsZXZlbFxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGFueW1vcmVcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJlZXROYi5hZGRyZXNzSXNDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgICB9XG4gICAgICBlbHNlXG4gICAgICB7XG4gICAgICAgIHRoaXMuYWRkcmVzc1BhcmFtcy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5CT1hfTlVNQkVSO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhID0gZXZlbnQucHJlZmlsbERhdGE7XG4gICAgICAgIHRoaXMucHJlZmlsbERhdGEudHMgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMubWluTGV2ZWwgPSBBRERSRVNTTEVWRUwuQk9YX05VTUJFUjtcbiAgICAgICAgLy8gY29uc3Qgc3VnZ2VzdGlvbkFkZHJlc3NMb2NhbGl0eU5hbWVcbiAgICAgICAgLy8gID0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0TnVtYmVyUGVyZmVjdE1hdGNoU3VnZ2VzdGlvbi5hZGRyZXNzLmxvY2FsaXR5TmFtZTtcblxuICAgICAgICBjb25zdCBzdWdnZXN0aW9uQWRkcmVzcyA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbFN0cmVldE51bWJlclBlcmZlY3RNYXRjaFN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbkFkZHJlc3NMb2NhbGl0eU5hbWUgPSBzdWdnZXN0aW9uQWRkcmVzcy5sb2NhbGl0eU5hbWU7XG4gICAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5tdW5pY2lwYWxpdHlOYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3NMb2NhbGl0eU5hbWU7XG4gICAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5tdW5pY2lwYWxpdHlOYW1lID0gc3VnZ2VzdGlvbkFkZHJlc3NMb2NhbGl0eU5hbWU7XG4gICAgICAgIHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5wb3N0YWxDb2RlID0gc3VnZ2VzdGlvbkFkZHJlc3MucG9zdGFsQ29kZTtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLnN0cmVldE5hbWUgPSBzdWdnZXN0aW9uQWRkcmVzcy5zdHJlZXROYW1lO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TnVtYmVyID0gc3VnZ2VzdGlvbkFkZHJlc3MuaG91c2VOdW1iZXI7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlUG9zdGFsQ29kZUxvY2FsaXR5KHN1Z2dlc3Rpb25BZGRyZXNzKTtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVQb3N0YWxDb2RlTG9jYWxpdHkoc3VnZ2VzdGlvbkFkZHJlc3MpO1xuXG4gICAgICAgIGNvbnN0IGJveE51bWJlciA9IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5ib3hOdW1iZXI7XG4gICAgICAgIGlmICggISBhZGRyZXNzSXNOb3RJbkxpc3QgJiYgKGJveE51bWJlciA9PT0gbnVsbCB8fCBib3hOdW1iZXIgPT09IHVuZGVmaW5lZCB8fCBib3hOdW1iZXIgPT09ICcnKSApXG4gICAgICAgIHtcbiAgICAgICAgICB0aGlzLnNldEFkZHJlc3MoYWRkcmVzcywgQUREUkVTU0xFVkVMLlNUUkVFVF9OVU1CRVIpO1xuICAgICAgICAgIC8vIHRoaXMucXVpdFByZWZpbGxNb2RlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICBjb25zdCBib3hOdW1iZXIgPSB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuYm94TnVtYmVyO1xuICAgICAgICBpZiAoICEgYWRkcmVzc0lzTm90SW5MaXN0ICYmIChib3hOdW1iZXIgPT09IG51bGwgfHwgYm94TnVtYmVyID09PSB1bmRlZmluZWQgfHwgYm94TnVtYmVyID09PSAnJykgKVxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5TVFJFRVRfTlVNQkVSKTtcbiAgICAgICAgICB0aGlzLnF1aXRQcmVmaWxsTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ2xpYjo6cHJlZmlsbDogdHJpZ2dlciBjaGVja2luZyBib3ggbnVtYmVyIG1hdGNoLi4uICcsIHRoaXMucHJlZmlsbERhdGEpOyB9XG4gICAgICAgICAgdGhpcy5ib3hOdW1iZXJQcmVmaWxsRGF0YSA9IHRoaXMucHJlZmlsbERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgKi9cblxuICAgICAgICB0aGlzLmJveE51bWJlclByZWZpbGxEYXRhID0gdGhpcy5wcmVmaWxsRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgIGNvbnN0IHByZWZpbGxTdHJlZXROdW1iZXIgPSB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TnVtYmVyO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbFN0cmVldFBlcmZlY3RNYXRjaFN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQm94TmIuc3RyZWV0TnVtYmVyID0gJyc7XG4gICAgICBpZiAoIHByZWZpbGxTdHJlZXROdW1iZXIgPT09IG51bGwgfHwgcHJlZmlsbFN0cmVldE51bWJlciA9PT0gdW5kZWZpbmVkIHx8IHByZWZpbGxTdHJlZXROdW1iZXIubGVuZ3RoID09PSAwIClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5TVFJFRVQpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICAvLyBhZGRyZXNzLmhvdXNlTnVtYmVyID0gcHJlZmlsbFN0cmVldE51bWJlcjtcbiAgICAgICAgYWRkcmVzcy5zZWFyY2hCYXJTdHJpbmcgPSBwcmVmaWxsU3RyZWV0TnVtYmVyO1xuICAgICAgICB0aGlzLnNldEFkZHJlc3MoYWRkcmVzcywgQUREUkVTU0xFVkVMLlNUUkVFVF9OVU1CRVIpO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgICB9XG4gIH1cblxuICBvbkJveE51bWJlclByZWZpbGxFdmVudChldmVudDogUHJlZmlsbEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnbGliOjpwcmVmaWxsOiBib3ggbnVtYmVyIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTsgfVxuICAgIGNvbnN0IGRhdGEgPSBldmVudC5wcmVmaWxsRGF0YTtcbiAgICBpZiAoZGF0YS5wcmVmaWxsQm94TnVtYmVyUGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUpXG4gICAge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGRhdGEucHJlZmlsbEJveE51bWJlclBlcmZlY3RNYXRjaFN1Z2dlc3Rpb247XG4gICAgICBjb25zdCBhZGRyZXNzID0gc3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVCb3hOYi5zZWxlY3RlZEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5CT1hfTlVNQkVSKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgIGNvbnN0IHByZWZpbGxCb3hOdW1iZXIgPSB0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMuYm94TnVtYmVyO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbFN0cmVldE51bWJlclBlcmZlY3RNYXRjaFN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICAgIGlmICggcHJlZmlsbEJveE51bWJlciA9PT0gbnVsbCB8fCBwcmVmaWxsQm94TnVtYmVyID09PSB1bmRlZmluZWQgfHwgcHJlZmlsbEJveE51bWJlci5sZW5ndGggPT09IDAgKVxuICAgICAge1xuICAgICAgICB0aGlzLnNldEFkZHJlc3MoYWRkcmVzcywgQUREUkVTU0xFVkVMLlNUUkVFVF9OVU1CRVIpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICAvLyBhZGRyZXNzLmJveE51bWJlciA9IHByZWZpbGxCb3hOdW1iZXI7XG4gICAgICAgIGFkZHJlc3Muc2VhcmNoQmFyU3RyaW5nID0gcHJlZmlsbEJveE51bWJlcjtcbiAgICAgICAgdGhpcy5zZXRBZGRyZXNzKGFkZHJlc3MsIEFERFJFU1NMRVZFTC5CT1hfTlVNQkVSKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5xdWl0UHJlZmlsbE1vZGUoKTtcbiAgfVxufVxuIl19