angular-odata 0.78.1 → 0.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +133 -62
  2. package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
  3. package/esm2020/lib/api.mjs +303 -0
  4. package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +12 -5
  5. package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
  6. package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +0 -0
  7. package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +1 -1
  8. package/esm2020/lib/client.mjs +271 -0
  9. package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +9 -3
  10. package/esm2020/lib/helper.mjs +268 -0
  11. package/esm2020/lib/index.mjs +19 -0
  12. package/esm2020/lib/models/collection.mjs +741 -0
  13. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  14. package/esm2020/lib/models/model.mjs +453 -0
  15. package/esm2020/lib/models/options.mjs +945 -0
  16. package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +6 -6
  17. package/esm2020/lib/options.mjs +32 -0
  18. package/esm2020/lib/resources/index.mjs +7 -0
  19. package/esm2020/lib/resources/path/handlers.mjs +69 -0
  20. package/esm2020/lib/resources/path/index.mjs +3 -0
  21. package/esm2020/lib/resources/path/segments.mjs +124 -0
  22. package/esm2020/lib/resources/query/builder.mjs +590 -0
  23. package/esm2020/lib/resources/query/expressions.mjs +207 -0
  24. package/esm2020/lib/resources/query/handlers.mjs +186 -0
  25. package/esm2020/lib/resources/query/index.mjs +4 -0
  26. package/esm2020/lib/resources/query/options.mjs +103 -0
  27. package/esm2020/lib/resources/query/syntax.mjs +406 -0
  28. package/esm2020/lib/resources/request.mjs +167 -0
  29. package/esm2020/lib/resources/resource.mjs +326 -0
  30. package/esm2020/lib/resources/responses/annotations.mjs +119 -0
  31. package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
  32. package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
  33. package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
  34. package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
  35. package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
  36. package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
  37. package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
  38. package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
  39. package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
  40. package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
  41. package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
  42. package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
  43. package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
  44. package/esm2020/lib/resources/responses/metadata.mjs +547 -0
  45. package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +1 -1
  46. package/esm2020/lib/resources/responses/response.mjs +170 -0
  47. package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +1 -1
  48. package/esm2020/lib/resources/types/action.mjs +101 -0
  49. package/esm2020/lib/resources/types/batch.mjs +288 -0
  50. package/esm2020/lib/resources/types/count.mjs +27 -0
  51. package/esm2020/lib/resources/types/entity-set.mjs +94 -0
  52. package/esm2020/lib/resources/types/entity.mjs +106 -0
  53. package/esm2020/lib/resources/types/function.mjs +137 -0
  54. package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
  55. package/esm2020/lib/resources/types/media.mjs +41 -0
  56. package/esm2020/lib/resources/types/metadata.mjs +30 -0
  57. package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
  58. package/esm2020/lib/resources/types/options.mjs +2 -0
  59. package/esm2020/lib/resources/types/property.mjs +183 -0
  60. package/esm2020/lib/resources/types/reference.mjs +85 -0
  61. package/esm2020/lib/resources/types/singleton.mjs +126 -0
  62. package/esm2020/lib/resources/types/value.mjs +41 -0
  63. package/esm2020/lib/schema/annotation.mjs +37 -0
  64. package/esm2020/lib/schema/callable.mjs +62 -0
  65. package/esm2020/lib/schema/element.mjs +51 -0
  66. package/esm2020/lib/schema/entity-container.mjs +9 -0
  67. package/esm2020/lib/schema/entity-set.mjs +9 -0
  68. package/esm2020/lib/schema/enum-type.mjs +71 -0
  69. package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
  70. package/esm2020/lib/schema/parsers/callable.mjs +113 -0
  71. package/esm2020/lib/schema/parsers/edm.mjs +95 -0
  72. package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
  73. package/esm2020/lib/schema/parsers/index.mjs +5 -0
  74. package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
  75. package/esm2020/lib/schema/schema.mjs +61 -0
  76. package/esm2020/lib/schema/structured-type.mjs +198 -0
  77. package/esm2020/lib/services/base.mjs +29 -0
  78. package/esm2020/lib/services/entity-set.mjs +143 -0
  79. package/esm2020/lib/services/entity.mjs +12 -0
  80. package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
  81. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  82. package/esm2020/lib/services/singleton.mjs +48 -0
  83. package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
  84. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  85. package/esm2020/lib/types.mjs +37 -0
  86. package/esm2020/lib/utils/arraybuffers.mjs +46 -0
  87. package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
  88. package/esm2020/lib/utils/durations.mjs +40 -0
  89. package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
  90. package/esm2020/lib/utils/http.mjs +93 -0
  91. package/esm2020/lib/utils/index.mjs +10 -0
  92. package/esm2020/lib/utils/objects.mjs +195 -0
  93. package/esm2020/lib/utils/odata.mjs +22 -0
  94. package/esm2020/lib/utils/strings.mjs +20 -0
  95. package/esm2020/lib/utils/types.mjs +134 -0
  96. package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
  97. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  98. package/fesm2015/{angular-odata.js → angular-odata.mjs} +5068 -3943
  99. package/fesm2015/angular-odata.mjs.map +1 -0
  100. package/fesm2020/angular-odata.mjs +10274 -0
  101. package/fesm2020/angular-odata.mjs.map +1 -0
  102. package/lib/api.d.ts +17 -16
  103. package/lib/cache/cache.d.ts +2 -2
  104. package/lib/client.d.ts +93 -18
  105. package/lib/constants.d.ts +6 -2
  106. package/lib/helper.d.ts +3 -3
  107. package/lib/index.d.ts +0 -1
  108. package/lib/models/collection.d.ts +36 -47
  109. package/lib/models/model.d.ts +47 -40
  110. package/lib/models/options.d.ts +53 -52
  111. package/lib/options.d.ts +50 -2
  112. package/lib/resources/index.d.ts +2 -3
  113. package/lib/resources/path/handlers.d.ts +27 -0
  114. package/lib/resources/path/index.d.ts +2 -0
  115. package/lib/resources/{path-segments.d.ts → path/segments.d.ts} +4 -16
  116. package/lib/resources/{builder.d.ts → query/builder.d.ts} +12 -7
  117. package/lib/resources/query/expressions.d.ts +63 -0
  118. package/lib/resources/query/handlers.d.ts +89 -0
  119. package/lib/resources/query/index.d.ts +3 -0
  120. package/lib/resources/query/options.d.ts +38 -0
  121. package/lib/resources/query/syntax.d.ts +175 -0
  122. package/lib/resources/request.d.ts +8 -6
  123. package/lib/resources/resource.d.ts +49 -55
  124. package/lib/resources/responses/metadata.d.ts +1 -1
  125. package/lib/resources/responses/types.d.ts +1 -1
  126. package/lib/resources/types/action.d.ts +55 -69
  127. package/lib/resources/types/batch.d.ts +13 -8
  128. package/lib/resources/types/count.d.ts +16 -19
  129. package/lib/resources/types/entity-set.d.ts +24 -62
  130. package/lib/resources/types/entity.d.ts +35 -43
  131. package/lib/resources/types/function.d.ts +63 -71
  132. package/lib/resources/types/media.d.ts +20 -22
  133. package/lib/resources/types/metadata.d.ts +5 -7
  134. package/lib/resources/types/navigation-property.d.ts +100 -85
  135. package/lib/resources/types/options.d.ts +8 -8
  136. package/lib/resources/types/property.d.ts +63 -73
  137. package/lib/resources/types/reference.d.ts +72 -16
  138. package/lib/resources/types/singleton.d.ts +75 -43
  139. package/lib/resources/types/value.d.ts +18 -9
  140. package/lib/schema/annotation.d.ts +18 -0
  141. package/lib/schema/callable.d.ts +27 -11
  142. package/lib/schema/element.d.ts +39 -0
  143. package/lib/schema/entity-container.d.ts +3 -8
  144. package/lib/schema/entity-set.d.ts +3 -9
  145. package/lib/schema/enum-type.d.ts +41 -14
  146. package/lib/schema/index.d.ts +1 -0
  147. package/lib/{parsers → schema/parsers}/callable.d.ts +2 -2
  148. package/lib/schema/parsers/edm.d.ts +4 -0
  149. package/lib/{parsers → schema/parsers}/enum-type.d.ts +13 -7
  150. package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
  151. package/lib/{parsers → schema/parsers}/structured-type.d.ts +14 -9
  152. package/lib/schema/schema.d.ts +6 -8
  153. package/lib/schema/structured-type.d.ts +97 -18
  154. package/lib/services/base.d.ts +12 -12
  155. package/lib/services/entity-set.d.ts +15 -12
  156. package/lib/services/entity.d.ts +4 -1
  157. package/lib/services/singleton.d.ts +6 -3
  158. package/lib/settings.d.ts +4 -4
  159. package/lib/types.d.ts +7 -3
  160. package/lib/utils/arraybuffers.d.ts +4 -0
  161. package/lib/{parsers/edm.d.ts → utils/durations.d.ts} +3 -3
  162. package/lib/utils/http.d.ts +9 -0
  163. package/lib/utils/index.d.ts +5 -2
  164. package/lib/utils/objects.d.ts +1 -1
  165. package/lib/utils/strings.d.ts +4 -0
  166. package/lib/utils/types.d.ts +2 -0
  167. package/package.json +21 -8
  168. package/bundles/angular-odata.umd.js +0 -10756
  169. package/bundles/angular-odata.umd.js.map +0 -1
  170. package/esm2015/lib/api.js +0 -251
  171. package/esm2015/lib/client.js +0 -197
  172. package/esm2015/lib/helper.js +0 -269
  173. package/esm2015/lib/index.js +0 -21
  174. package/esm2015/lib/models/collection.js +0 -660
  175. package/esm2015/lib/models/model.js +0 -421
  176. package/esm2015/lib/models/options.js +0 -889
  177. package/esm2015/lib/options.js +0 -31
  178. package/esm2015/lib/parsers/callable.js +0 -110
  179. package/esm2015/lib/parsers/edm.js +0 -310
  180. package/esm2015/lib/parsers/enum-type.js +0 -97
  181. package/esm2015/lib/parsers/index.js +0 -5
  182. package/esm2015/lib/parsers/structured-type.js +0 -394
  183. package/esm2015/lib/resources/builder.js +0 -537
  184. package/esm2015/lib/resources/index.js +0 -8
  185. package/esm2015/lib/resources/path-segments.js +0 -156
  186. package/esm2015/lib/resources/query-options.js +0 -157
  187. package/esm2015/lib/resources/request.js +0 -141
  188. package/esm2015/lib/resources/resource.js +0 -328
  189. package/esm2015/lib/resources/responses/annotations.js +0 -121
  190. package/esm2015/lib/resources/responses/metadata.js +0 -548
  191. package/esm2015/lib/resources/responses/response.js +0 -170
  192. package/esm2015/lib/resources/types/action.js +0 -146
  193. package/esm2015/lib/resources/types/batch.js +0 -330
  194. package/esm2015/lib/resources/types/count.js +0 -50
  195. package/esm2015/lib/resources/types/entity-set.js +0 -164
  196. package/esm2015/lib/resources/types/entity.js +0 -158
  197. package/esm2015/lib/resources/types/function.js +0 -166
  198. package/esm2015/lib/resources/types/media.js +0 -46
  199. package/esm2015/lib/resources/types/metadata.js +0 -36
  200. package/esm2015/lib/resources/types/navigation-property.js +0 -214
  201. package/esm2015/lib/resources/types/options.js +0 -2
  202. package/esm2015/lib/resources/types/property.js +0 -190
  203. package/esm2015/lib/resources/types/reference.js +0 -50
  204. package/esm2015/lib/resources/types/singleton.js +0 -147
  205. package/esm2015/lib/resources/types/value.js +0 -30
  206. package/esm2015/lib/schema/annotation.js +0 -7
  207. package/esm2015/lib/schema/callable.js +0 -50
  208. package/esm2015/lib/schema/entity-container.js +0 -17
  209. package/esm2015/lib/schema/entity-set.js +0 -23
  210. package/esm2015/lib/schema/enum-type.js +0 -68
  211. package/esm2015/lib/schema/schema.js +0 -55
  212. package/esm2015/lib/schema/structured-type.js +0 -107
  213. package/esm2015/lib/services/base.js +0 -23
  214. package/esm2015/lib/services/entity-set.js +0 -143
  215. package/esm2015/lib/services/entity.js +0 -10
  216. package/esm2015/lib/services/singleton.js +0 -46
  217. package/esm2015/lib/types.js +0 -37
  218. package/esm2015/lib/utils/http.js +0 -59
  219. package/esm2015/lib/utils/index.js +0 -7
  220. package/esm2015/lib/utils/objects.js +0 -140
  221. package/esm2015/lib/utils/odata.js +0 -21
  222. package/esm2015/lib/utils/types.js +0 -103
  223. package/fesm2015/angular-odata.js.map +0 -1
  224. package/lib/resources/query-options.d.ts +0 -57
@@ -1,889 +0,0 @@
1
- import { __rest } from "tslib";
2
- import { tap } from 'rxjs/operators';
3
- import { COMPUTED, DEFAULT_VERSION, OPTIMISTIC_CONCURRENCY, } from '../constants';
4
- import { ODataHelper } from '../helper';
5
- import { ODataParserOptions } from '../options';
6
- import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPathSegments, ODataPropertyResource, ODataQueryOptions, } from '../resources';
7
- import { Objects, Types } from '../utils';
8
- export const CID = '_cid';
9
- export class ODataModelEvent {
10
- constructor(name, { model, collection, previous, value, track, options, } = {}) {
11
- this.bubbling = true;
12
- this.name = name;
13
- this.model = model;
14
- this.collection = collection;
15
- this.previous = previous;
16
- this.value = value;
17
- this.options = options;
18
- this.chain = [
19
- [
20
- this.collection ||
21
- this.model,
22
- track || null,
23
- ],
24
- ];
25
- }
26
- stopPropagation() {
27
- this.bubbling = false;
28
- }
29
- push(model, track) {
30
- this.chain.splice(0, 0, [model, track]);
31
- }
32
- visited(model) {
33
- return this.chain.some((c) => c[0] === model);
34
- }
35
- get path() {
36
- return this.chain
37
- .map(([, track], index) => typeof track === 'number'
38
- ? `[${track}]`
39
- : typeof track === 'string'
40
- ? index === 0
41
- ? track
42
- : `.${track}`
43
- : '')
44
- .join('');
45
- }
46
- }
47
- export const BUBBLING = [
48
- 'change',
49
- 'reset',
50
- 'update',
51
- 'destroy',
52
- 'add',
53
- 'remove',
54
- ];
55
- export const INCLUDE_ALL = {
56
- include_navigation: true,
57
- include_concurrency: true,
58
- include_computed: true,
59
- include_key: true,
60
- include_non_field: true,
61
- };
62
- export var ODataModelState;
63
- (function (ODataModelState) {
64
- ODataModelState[ODataModelState["Added"] = 0] = "Added";
65
- ODataModelState[ODataModelState["Removed"] = 1] = "Removed";
66
- ODataModelState[ODataModelState["Changed"] = 2] = "Changed";
67
- ODataModelState[ODataModelState["Unchanged"] = 3] = "Unchanged";
68
- })(ODataModelState || (ODataModelState = {}));
69
- export function Model({ cid = CID } = {}) {
70
- return (constructor) => {
71
- const Klass = constructor;
72
- if (!Klass.hasOwnProperty('options'))
73
- Klass.options = { fields: {} };
74
- Klass.options.cid = cid;
75
- return constructor;
76
- };
77
- }
78
- export function ModelField(_a = {}) {
79
- var { name } = _a, options = __rest(_a, ["name"]);
80
- return (target, key) => {
81
- const Klass = target.constructor;
82
- if (!Klass.hasOwnProperty('options'))
83
- Klass.options = { fields: {} };
84
- options.field = name || key;
85
- Klass.options.fields[key] = options;
86
- };
87
- }
88
- export class ODataModelField {
89
- constructor(modelOptions, _a) {
90
- var { name, field, parser } = _a, options = __rest(_a, ["name", "field", "parser"]);
91
- this.modelOptions = modelOptions;
92
- this.name = name;
93
- this.field = field;
94
- this.parser = parser;
95
- this.default = options.default || this.parser.default;
96
- this.required = Boolean(options.required);
97
- this.concurrency = Boolean(options.concurrency);
98
- this.maxLength = options.maxLength;
99
- this.minLength = options.minLength;
100
- this.min = options.min;
101
- this.max = options.max;
102
- this.pattern = options.pattern;
103
- }
104
- get api() {
105
- return this.modelOptions.api;
106
- }
107
- get type() {
108
- return this.parser.type;
109
- }
110
- get navigation() {
111
- return Boolean(this.parser.navigation);
112
- }
113
- get collection() {
114
- return Boolean(this.parser.collection);
115
- }
116
- get computed() {
117
- var _a;
118
- return Boolean((_a = this.parser.findAnnotation((a) => a.term === COMPUTED)) === null || _a === void 0 ? void 0 : _a.bool);
119
- }
120
- configure({ findOptionsForType, concurrency, }) {
121
- this.meta = findOptionsForType(this.parser.type);
122
- if (concurrency)
123
- this.concurrency = concurrency;
124
- }
125
- isKey() {
126
- return this.parser.isKey();
127
- }
128
- hasReferentials() {
129
- return this.parser.hasReferentials();
130
- }
131
- get referentials() {
132
- return this.parser.referentials;
133
- }
134
- isStructuredType() {
135
- return this.parser.isStructuredType();
136
- }
137
- structured() {
138
- return this.api.findStructuredTypeForType(this.parser.type);
139
- }
140
- isEnumType() {
141
- return this.parser.isEnumType();
142
- }
143
- enum() {
144
- return this.api.findEnumTypeForType(this.parser.type);
145
- }
146
- validate(value, { method, navigation = false, } = {}) {
147
- var _a;
148
- /*
149
- if ('isValid' in value && typeof value.isValid === 'function') {
150
- return !value.isValid({ method, navigation }) ? value._errors : undefined;
151
- } else if ('models' in value && typeof value.models === 'function') {
152
- */
153
- if (ODataModelOptions.isModel(value)) {
154
- return !value.isValid({ method, navigation }) ? value._errors : undefined;
155
- }
156
- else if (ODataModelOptions.isCollection(value)) {
157
- return value
158
- .models()
159
- .some((m) => !m.isValid({ method, navigation }))
160
- ? value.models().map((m) => m._errors)
161
- : undefined;
162
- }
163
- else {
164
- let errors = ((_a = this.parser) === null || _a === void 0 ? void 0 : _a.validate(value, { method, navigation })) || [];
165
- if (this.required &&
166
- (value === null || (value === undefined && method !== 'patch')) // Is null or undefined without patch?
167
- ) {
168
- errors.push(`required`);
169
- }
170
- if (this.maxLength !== undefined &&
171
- typeof value === 'string' &&
172
- value.length > this.maxLength) {
173
- errors.push(`maxlength`);
174
- }
175
- if (this.minLength !== undefined &&
176
- typeof value === 'string' &&
177
- value.length < this.minLength) {
178
- errors.push(`minlength`);
179
- }
180
- if (this.min !== undefined &&
181
- typeof value === 'number' &&
182
- value < this.min) {
183
- errors.push(`min`);
184
- }
185
- if (this.max !== undefined &&
186
- typeof value === 'number' &&
187
- value > this.max) {
188
- errors.push(`max`);
189
- }
190
- if (this.pattern !== undefined &&
191
- typeof value === 'string' &&
192
- !this.pattern.test(value)) {
193
- errors.push(`pattern`);
194
- }
195
- return !Types.isEmpty(errors) ? errors : undefined;
196
- }
197
- }
198
- defaults() {
199
- return this.isStructuredType() && this.meta !== undefined
200
- ? this.meta.defaults()
201
- : this.default;
202
- }
203
- deserialize(value, options) {
204
- const parserOptions = options !== undefined
205
- ? new ODataParserOptions(options)
206
- : this.api.options;
207
- return this.parser.deserialize(value, parserOptions);
208
- }
209
- serialize(value, options) {
210
- const parserOptions = options !== undefined
211
- ? new ODataParserOptions(options)
212
- : this.api.options;
213
- return this.parser.serialize(value, parserOptions);
214
- }
215
- encode(value, options) {
216
- const parserOptions = options !== undefined
217
- ? new ODataParserOptions(options)
218
- : this.api.options;
219
- return this.parser.encode(value, parserOptions);
220
- }
221
- resourceFactory(resource) {
222
- if (!(resource instanceof ODataEntityResource ||
223
- resource instanceof ODataNavigationPropertyResource ||
224
- resource instanceof ODataPropertyResource))
225
- throw new Error("Can't build resource for non compatible base type");
226
- return this.navigation
227
- ? resource.navigationProperty(this.parser.name)
228
- : resource.property(this.parser.name);
229
- }
230
- annotationsFactory(annots) {
231
- return this.parser.collection
232
- ? new ODataEntitiesAnnotations(annots.helper, annots.property(this.parser.name) || {})
233
- : new ODataEntityAnnotations(annots.helper, annots.property(this.parser.name) || {});
234
- }
235
- schemaFactory(schema) {
236
- return schema.api.findStructuredTypeForType(this.parser.type);
237
- }
238
- modelCollectionFactory({ parent, value, reset, }) {
239
- const schema = this.schemaFactory(parent.schema());
240
- const annots = this.annotationsFactory(parent.annots());
241
- const Model = schema === null || schema === void 0 ? void 0 : schema.model;
242
- const Collection = schema === null || schema === void 0 ? void 0 : schema.collection;
243
- if (Model === undefined || Collection === undefined)
244
- throw Error(`No model for ${this.name}`);
245
- return this.parser.collection
246
- ? new Collection((value || []), {
247
- annots: annots,
248
- parent: [parent, this],
249
- reset,
250
- })
251
- : new Model((value || {}), {
252
- annots: annots,
253
- parent: [parent, this],
254
- reset,
255
- });
256
- }
257
- }
258
- export class ODataModelOptions {
259
- constructor(options, schema) {
260
- this.children = [];
261
- this.name = schema.name;
262
- this.base = schema.base;
263
- this.open = schema.open;
264
- this.schema = schema;
265
- this.cid = options.cid || CID;
266
- const schemaFields = this.schema.fields({ include_navigation: true });
267
- this._fields = Object.entries(options.fields).map(([name, options]) => {
268
- const { field } = options, opts = __rest(options, ["field"]);
269
- if (field === undefined || name === undefined)
270
- throw new Error('Model Properties need name and field');
271
- const parser = schemaFields.find((f) => f.name === field);
272
- if (parser === undefined)
273
- throw new Error(`No parser for ${field} with name = ${name}`);
274
- return new ODataModelField(this, Object.assign({ name, field, parser }, opts));
275
- });
276
- }
277
- get api() {
278
- return this.schema.api;
279
- }
280
- type() {
281
- return this.schema.type();
282
- }
283
- isTypeOf(type) {
284
- return this.schema.isTypeOf(type);
285
- }
286
- findChildOptions(predicate) {
287
- if (predicate(this))
288
- return this;
289
- let match;
290
- for (let ch of this.children) {
291
- match = ch.findChildOptions(predicate);
292
- if (match !== undefined)
293
- break;
294
- }
295
- return match;
296
- }
297
- configure({ findOptionsForType, }) {
298
- var _a;
299
- if (this.base) {
300
- const parent = findOptionsForType(this.base);
301
- parent.children.push(this);
302
- this.parent = parent;
303
- }
304
- this.entitySet = this.api.findEntitySetForEntityType(this.type());
305
- let concurrencyFields = [];
306
- if (this.entitySet !== undefined) {
307
- concurrencyFields =
308
- ((_a = this.entitySet.findAnnotation((a) => a.term === OPTIMISTIC_CONCURRENCY)) === null || _a === void 0 ? void 0 : _a.properties) || [];
309
- }
310
- this._fields.forEach((field) => {
311
- let concurrency = concurrencyFields.indexOf(field.field) !== -1;
312
- field.configure({
313
- findOptionsForType,
314
- concurrency,
315
- });
316
- });
317
- }
318
- fields({ include_navigation = false, include_parents = true, } = {}) {
319
- return [
320
- ...(include_parents && this.parent !== undefined
321
- ? this.parent.fields({ include_navigation, include_parents })
322
- : []),
323
- ...this._fields.filter((field) => include_navigation || !field.navigation),
324
- ];
325
- }
326
- field(name) {
327
- return this.fields({
328
- include_parents: true,
329
- include_navigation: true,
330
- }).find((modelField) => modelField.name === name || modelField.field === name);
331
- }
332
- attach(self, resource) {
333
- if (self._resource !== undefined &&
334
- resource.type() !== self._resource.type() &&
335
- !resource.isSubtypeOf(self._resource))
336
- throw new Error(`Can't reattach ${resource.type()} to ${self._resource.type()}`);
337
- const current = self._resource;
338
- if (current === undefined || !current.isEqualTo(resource)) {
339
- self._resource = resource;
340
- self.events$.emit(new ODataModelEvent('attach', {
341
- model: self,
342
- previous: current,
343
- value: resource,
344
- }));
345
- }
346
- }
347
- //# region Resource
348
- static chain(child) {
349
- const chain = [];
350
- let tuple = [child, null];
351
- while (tuple !== null) {
352
- const parent = tuple;
353
- if (chain.some((p) => p[0] === parent[0]))
354
- break;
355
- chain.splice(0, 0, parent);
356
- tuple = tuple[0]._parent;
357
- }
358
- return chain;
359
- }
360
- static resource(child) {
361
- var _a;
362
- let resource = undefined;
363
- for (let [model, field] of ODataModelOptions.chain(child)) {
364
- resource =
365
- resource ||
366
- //model._resource ||
367
- (ODataModelOptions.isModel(model)
368
- ? model._meta.modelResourceFactory()
369
- : model._model.meta.collectionResourceFactory());
370
- if (resource === undefined)
371
- break;
372
- if (ODataModelOptions.isModel(model)) {
373
- let key = model.key({
374
- field_mapping: true,
375
- });
376
- if (key !== undefined)
377
- resource =
378
- resource instanceof ODataEntitySetResource
379
- ? resource.entity(key)
380
- : resource.key(key);
381
- }
382
- if (field === null) {
383
- const query = (_a = model._resource) === null || _a === void 0 ? void 0 : _a.cloneQuery().toQueryArguments();
384
- if (query !== undefined)
385
- resource.query.apply(query);
386
- continue;
387
- }
388
- resource = field.resourceFactory(resource);
389
- }
390
- if (resource === undefined)
391
- throw new Error(`resource: Can't build resource for ${child}`);
392
- return resource;
393
- }
394
- collectionResourceFactory({ baseResource, } = {}) {
395
- if (this.entitySet !== undefined)
396
- return ODataEntitySetResource.factory(this.api, this.entitySet.name, this.type(), new ODataPathSegments(), (baseResource === null || baseResource === void 0 ? void 0 : baseResource.cloneQuery()) || new ODataQueryOptions());
397
- if (baseResource === undefined)
398
- throw new Error("collectionResourceFactory: Can't build resource");
399
- return baseResource.clone();
400
- }
401
- modelResourceFactory({ baseResource, } = {}) {
402
- const resource = this.collectionResourceFactory({ baseResource });
403
- if (resource instanceof ODataEntitySetResource)
404
- return resource.entity();
405
- return resource;
406
- }
407
- entityResource(self) {
408
- let resource = this.modelResourceFactory({
409
- baseResource: self._resource,
410
- fromSet: true,
411
- });
412
- const key = self.key({ field_mapping: true });
413
- if (key !== undefined)
414
- return resource.key(key);
415
- return resource;
416
- }
417
- //#endregion
418
- bind(self, { parent, resource, annots, } = {}) {
419
- // Parent
420
- if (parent !== undefined) {
421
- self._parent = parent;
422
- }
423
- else if (resource !== undefined) {
424
- // Resource
425
- this.attach(self, resource);
426
- }
427
- // Annotations
428
- self._annotations =
429
- annots || new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
430
- const fields = this.fields({
431
- include_navigation: true,
432
- include_parents: true,
433
- });
434
- for (let field of fields) {
435
- Object.defineProperty(self, field.name, {
436
- configurable: true,
437
- get: () => this._get(self, field),
438
- set: (value) => this._set(self, field, value),
439
- });
440
- }
441
- }
442
- query(self, resource, func) {
443
- func(resource.query);
444
- this.attach(self, resource);
445
- }
446
- resolveKey(value, { field_mapping = false, resolve = true, } = {}) {
447
- const keyTypes = this.schema.keys({ include_parents: true });
448
- const key = {};
449
- for (var kt of keyTypes) {
450
- let v = value;
451
- let options = this;
452
- let field;
453
- for (let name of kt.name.split('/')) {
454
- if (options === undefined)
455
- break;
456
- field = options
457
- .fields({ include_parents: true })
458
- .find((field) => field.field === name);
459
- if (field !== undefined) {
460
- v =
461
- Types.isPlainObject(v) || ODataModelOptions.isModel(v)
462
- ? v[field.name]
463
- : v;
464
- options = field.meta;
465
- }
466
- }
467
- if (field === undefined)
468
- return undefined;
469
- let name = field_mapping ? field.field : field.name;
470
- if (kt.alias !== undefined)
471
- name = kt.alias;
472
- key[name] = v;
473
- }
474
- if (Types.isEmpty(key))
475
- return undefined;
476
- return resolve ? Objects.resolveKey(key) : key;
477
- }
478
- resolveReferential(self, field, { field_mapping = false, resolve = true, } = {}) {
479
- const referential = {};
480
- for (var ref of field.referentials) {
481
- let from = this.fields({ include_parents: true }).find((p) => p.field === ref.referencedProperty);
482
- let to = field.modelOptions
483
- .fields({ include_parents: true })
484
- .find((field) => field.field === ref.property);
485
- if (from !== undefined && to !== undefined) {
486
- let name = field_mapping ? to.field : to.name;
487
- referential[name] = self[from.name];
488
- }
489
- }
490
- if (Types.isEmpty(referential))
491
- return undefined;
492
- return resolve
493
- ? Objects.resolveKey(referential, { single: false })
494
- : referential;
495
- }
496
- resolveReferenced(self, field, { field_mapping = false, resolve = true, } = {}) {
497
- const referenced = {};
498
- for (var ref of field.referentials) {
499
- let from = this.fields({ include_parents: true }).find((field) => field.field === ref.property);
500
- let to = field.meta
501
- .fields({ include_parents: true })
502
- .find((field) => field.field === ref.referencedProperty);
503
- if (from !== undefined && to !== undefined) {
504
- let name = field_mapping ? to.field : to.name;
505
- referenced[name] = self[from.name];
506
- }
507
- }
508
- if (Types.isEmpty(referenced))
509
- return undefined;
510
- return resolve
511
- ? Objects.resolveKey(referenced, { single: false })
512
- : referenced;
513
- }
514
- validate(self, { method, navigation = false, } = {}) {
515
- const errors = this.fields({
516
- include_parents: true,
517
- include_navigation: navigation,
518
- }).reduce((acc, field) => {
519
- let value = self[field.name];
520
- let errs = field.validate(value, { method });
521
- return errs !== undefined
522
- ? Object.assign(acc, { [field.name]: errs })
523
- : acc;
524
- }, {});
525
- return !Types.isEmpty(errors) ? errors : undefined;
526
- }
527
- defaults() {
528
- const defs = this.fields().reduce((acc, field) => {
529
- let value = field.defaults();
530
- return value !== undefined
531
- ? Object.assign(acc, { [field.name]: value })
532
- : acc;
533
- }, {});
534
- return !Types.isEmpty(defs) ? defs : undefined;
535
- }
536
- hasChanged(self, { include_navigation = false } = {}) {
537
- return (!Types.isEmpty(self._changes) ||
538
- Object.values(self._relations)
539
- .filter(({ field }) => !field.navigation || include_navigation)
540
- .some(({ field, state, model }) => (!include_navigation || field.navigation) &&
541
- (state === ODataModelState.Changed ||
542
- (model !== null && model.hasChanged({ include_navigation })))));
543
- }
544
- asEntity(self, func) {
545
- const parent = self._parent;
546
- self._parent = null;
547
- return func(self).pipe(tap(() => (self._parent = parent)));
548
- }
549
- toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
550
- let attrs = self.attributes({
551
- changes_only,
552
- field_mapping,
553
- include_concurrency,
554
- include_computed,
555
- include_non_field,
556
- });
557
- let relations = Object.entries(self._relations)
558
- .filter(
559
- // Chain
560
- ([, { model }]) => chain.every((c) => c !== model))
561
- .filter(
562
- // Changes only
563
- ([, { model, state }]) => !changes_only ||
564
- (changes_only &&
565
- (state === ODataModelState.Changed ||
566
- (model !== null && model.hasChanged({ include_navigation })))))
567
- .filter(([, { field, model }]) =>
568
- // Navigation
569
- (include_navigation && field.navigation && model !== null) ||
570
- !field.navigation)
571
- .map(([k, { model, field, state }]) => {
572
- let changesOnly = changes_only &&
573
- state !== ODataModelState.Changed &&
574
- !!field.navigation;
575
- let includeKey = include_key && !!field.navigation;
576
- if (ODataModelOptions.isModel(model)) {
577
- return [
578
- k,
579
- model.toEntity({
580
- client_id,
581
- include_navigation,
582
- include_concurrency,
583
- include_non_field,
584
- field_mapping,
585
- changes_only: changesOnly,
586
- include_key: includeKey,
587
- chain: [self, ...chain],
588
- }),
589
- ];
590
- }
591
- else if (ODataModelOptions.isCollection(model)) {
592
- return [
593
- k,
594
- model.toEntities({
595
- client_id,
596
- include_navigation,
597
- include_concurrency,
598
- include_non_field,
599
- field_mapping,
600
- changes_only: changesOnly,
601
- include_key: includeKey,
602
- chain: [self, ...chain],
603
- }),
604
- ];
605
- }
606
- return [k, model];
607
- })
608
- .reduce((acc, [k, v]) => {
609
- var _a;
610
- const name = field_mapping
611
- ? ((_a = this.fields().find((field) => field.name === k)) === null || _a === void 0 ? void 0 : _a.field) || k
612
- : k;
613
- return Object.assign(acc, { [name]: v });
614
- }, {});
615
- // Create entity
616
- let entity = Object.assign(attrs, relations);
617
- // Add client_id
618
- if (client_id) {
619
- entity[this.cid] = self[this.cid];
620
- }
621
- // Add key
622
- if (include_key) {
623
- entity = Object.assign(entity, this.resolveKey(self, { field_mapping, resolve: false }));
624
- }
625
- return entity;
626
- }
627
- attributes(self, { changes_only = false, include_concurrency = false, include_computed = false, include_non_field = false, field_mapping = false, } = {}) {
628
- // Attributes by fields (attributes for the model type)
629
- const fieldAttrs = this.fields().reduce((acc, f) => {
630
- const isChanged = f.name in self._changes;
631
- const name = field_mapping ? f.field : f.name;
632
- const value = isChanged
633
- ? self._changes[f.name]
634
- : self._attributes[f.name];
635
- if (f.concurrency && include_concurrency) {
636
- return Object.assign(acc, { [name]: value });
637
- }
638
- else if (f.computed && include_computed) {
639
- return Object.assign(acc, { [name]: value });
640
- }
641
- else if (changes_only && isChanged) {
642
- return Object.assign(acc, { [name]: value });
643
- }
644
- else if (!changes_only && !f.concurrency && !f.computed) {
645
- return Object.assign(acc, { [name]: value });
646
- }
647
- else {
648
- return acc;
649
- }
650
- }, {});
651
- if (!include_non_field)
652
- return fieldAttrs;
653
- const names = Object.keys(fieldAttrs);
654
- // Attributes from object (attributes for object)
655
- const nonFieldAttrs = Object.entries(self)
656
- .filter(([k]) => names.indexOf(k) === -1 && !k.startsWith('_') && !k.endsWith('$'))
657
- .reduce((acc, [k, v]) => Object.assign(acc, { [k]: v }), {});
658
- return Object.assign(Object.assign({}, fieldAttrs), nonFieldAttrs);
659
- }
660
- reset(self, { name, silent = false } = {}) {
661
- if (!Types.isEmpty(name) && name in self._changes) {
662
- const value = self._attributes[name];
663
- const previous = self._changes[name];
664
- delete self._changes[name];
665
- if (!silent) {
666
- self.events$.emit(new ODataModelEvent('change', {
667
- model: self,
668
- track: name,
669
- value,
670
- previous,
671
- }));
672
- }
673
- }
674
- else if (Types.isEmpty(name)) {
675
- const entries = Object.entries(self._changes);
676
- self._changes = {};
677
- if (!silent) {
678
- entries.forEach((entry) => {
679
- self.events$.emit(new ODataModelEvent('change', {
680
- track: entry[0],
681
- model: self,
682
- value: self._attributes[entry[0]],
683
- previous: entry[1],
684
- }));
685
- });
686
- }
687
- }
688
- }
689
- assign(self, entity, { reset = false, silent = false, } = {}) {
690
- self._resetting = reset;
691
- self._silent = silent;
692
- const changes = [];
693
- // Apply entity
694
- const model = self;
695
- Object.entries(entity)
696
- .filter(([, value]) => value !== undefined) // Filter undefined
697
- .forEach(([key, value]) => {
698
- const field = this.fields({
699
- include_parents: true,
700
- include_navigation: true,
701
- }).find((field) => (self._resetting && field.field === key) || field.name === key);
702
- if (field !== undefined) {
703
- // Delegated to private setter
704
- if (this._set(self, field, value))
705
- changes.push(field.name);
706
- }
707
- else {
708
- // Basic assignment
709
- const current = model[key];
710
- model[key] = value;
711
- if (current !== value)
712
- changes.push(key);
713
- }
714
- });
715
- if (!self._silent && changes.length > 0) {
716
- self.events$.emit(new ODataModelEvent(self._resetting ? 'reset' : 'update', {
717
- model: self,
718
- options: { changes },
719
- }));
720
- }
721
- self._resetting = false;
722
- self._silent = false;
723
- }
724
- static isModel(obj) {
725
- return {}.toString.call(obj) === '[object Model]';
726
- }
727
- static isCollection(obj) {
728
- return {}.toString.call(obj) === '[object Collection]';
729
- }
730
- updateCollection(self, field, collection, value) {
731
- if (ODataModelOptions.isCollection(value)) {
732
- value = value.toEntities(INCLUDE_ALL);
733
- }
734
- collection._annotations = field.annotationsFactory(self.annots());
735
- collection.assign(value, {
736
- reset: self._resetting,
737
- silent: self._silent,
738
- });
739
- return collection.hasChanged();
740
- }
741
- updateModel(self, field, model, value) {
742
- if (ODataModelOptions.isModel(value)) {
743
- value = value.toEntity(INCLUDE_ALL);
744
- }
745
- model._annotations = field.annotationsFactory(self.annots());
746
- model.assign(value, {
747
- reset: self._resetting,
748
- silent: self._silent,
749
- });
750
- return model.hasChanged();
751
- }
752
- _get(self, field) {
753
- var _a;
754
- if (field.isStructuredType()) {
755
- return (_a = self._relations[field.name]) === null || _a === void 0 ? void 0 : _a.model;
756
- }
757
- else {
758
- return this.attributes(self, {
759
- include_concurrency: true,
760
- include_computed: true,
761
- })[field.name];
762
- }
763
- }
764
- _set(self, field, value) {
765
- let changed = false;
766
- if (field.isStructuredType()) {
767
- // Ensures that the relation exists
768
- if (!(field.name in self._relations)) {
769
- self._relations[field.name] = {
770
- state: ODataModelState.Unchanged,
771
- model: null,
772
- field: field,
773
- subscription: null,
774
- };
775
- }
776
- const relation = self._relations[field.name];
777
- const currentModel = relation.model;
778
- if (value === null) {
779
- relation.model = value;
780
- changed = currentModel !== value;
781
- this._unsubscribe(self, relation);
782
- }
783
- else if (ODataModelOptions.isCollection(currentModel)) {
784
- changed = this.updateCollection(self, field, currentModel, value);
785
- }
786
- else if (ODataModelOptions.isModel(currentModel)) {
787
- changed = this.updateModel(self, field, currentModel, value);
788
- }
789
- else if (Types.isArray(value) || Types.isPlainObject(value)) {
790
- relation.model = field.modelCollectionFactory({
791
- parent: self,
792
- value: value,
793
- reset: self._resetting,
794
- });
795
- changed = true;
796
- this._subscribe(self, relation);
797
- }
798
- else if (ODataModelOptions.isCollection(value) ||
799
- ODataModelOptions.isModel(value)) {
800
- relation.model = value;
801
- changed = true;
802
- this._subscribe(self, relation);
803
- }
804
- if (ODataModelOptions.isModel(relation.model)) {
805
- var ref = relation.model.referential(field);
806
- if (ref !== undefined) {
807
- Object.assign(self, ref);
808
- }
809
- }
810
- relation.state =
811
- self._resetting || !changed
812
- ? ODataModelState.Unchanged
813
- : ODataModelState.Changed;
814
- if (!self._silent && changed) {
815
- self.events$.emit(new ODataModelEvent('change', {
816
- track: field.name,
817
- model: self,
818
- value: relation.model,
819
- previous: currentModel,
820
- }));
821
- }
822
- }
823
- else {
824
- const attrs = this.attributes(self, {
825
- include_concurrency: true,
826
- include_computed: true,
827
- });
828
- const currentValue = attrs[field.name];
829
- changed = !Types.isEqual(currentValue, value);
830
- if (self._resetting) {
831
- delete self._changes[field.name];
832
- self._attributes[field.name] = value;
833
- }
834
- else if (Types.isEqual(value, self._attributes[field.name])) {
835
- delete self._changes[field.name];
836
- }
837
- else if (changed) {
838
- self._changes[field.name] = value;
839
- }
840
- if (!self._silent && changed) {
841
- self.events$.emit(new ODataModelEvent('change', {
842
- track: field.name,
843
- model: self,
844
- value,
845
- previous: currentValue,
846
- options: { key: field.isKey() },
847
- }));
848
- }
849
- }
850
- return changed;
851
- }
852
- _unsubscribe(self, relation) {
853
- if (relation.subscription !== null) {
854
- relation.subscription.unsubscribe();
855
- relation.subscription = null;
856
- }
857
- }
858
- _subscribe(self, relation) {
859
- if (relation.subscription !== null) {
860
- throw new Error('Subscription already exists');
861
- }
862
- if (relation.model === null) {
863
- throw new Error('Subscription model is null');
864
- }
865
- if (!relation.model.isParentOf(self)) {
866
- relation.model._parent = [self, relation.field];
867
- }
868
- relation.subscription = relation.model.events$.subscribe((event) => {
869
- var _a;
870
- if (BUBBLING.indexOf(event.name) !== -1 &&
871
- event.bubbling &&
872
- !event.visited(self)) {
873
- if (event.model === relation.model) {
874
- if (event.name === 'change' &&
875
- relation.field.navigation &&
876
- ((_a = event.options) === null || _a === void 0 ? void 0 : _a.key)) {
877
- var ref = relation.model.referential(relation.field);
878
- if (ref !== undefined) {
879
- Object.assign(self, ref);
880
- }
881
- }
882
- }
883
- event.push(self, relation.field.name);
884
- self.events$.emit(event);
885
- }
886
- });
887
- }
888
- }
889
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVoRCxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLCtCQUErQixFQUMvQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGlCQUFpQixHQU9sQixNQUFNLGNBQWMsQ0FBQztBQUd0QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUkxQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBc0IxQixNQUFNLE9BQU8sZUFBZTtJQVkxQixZQUNFLElBQXlCLEVBQ3pCLEVBQ0UsS0FBSyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLE1BUUwsRUFBRTtRQTFCUixhQUFRLEdBQVksSUFBSSxDQUFDO1FBNEJ2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJ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QUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzt5QkFDMUI7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ09NUFVURUQsXG4gIERFRkFVTFRfVkVSU0lPTixcbiAgT1BUSU1JU1RJQ19DT05DVVJSRU5DWSxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IE9EYXRhUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyIH0gZnJvbSAnLi4vcGFyc2Vycyc7XG5pbXBvcnQge1xuICBFeHBhbmQsXG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFQYXRoU2VnbWVudHMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnMsXG4gIEVudGl0eUtleSxcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbiAgT3B0aW9uSGFuZGxlcixcbiAgUXVlcnlBcmd1bWVudHMsXG4gIFNlbGVjdCxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhRW50aXR5U2V0LCBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzLCBUeXBlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgT0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9jb2xsZWN0aW9uJztcbmltcG9ydCB0eXBlIHsgT0RhdGFNb2RlbCB9IGZyb20gJy4vbW9kZWwnO1xuXG5leHBvcnQgY29uc3QgQ0lEID0gJ19jaWQnO1xuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbFJlc291cmNlPFQ+ID1cbiAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD47XG5leHBvcnQgdHlwZSBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPiA9XG4gIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD47XG5cbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxFdmVudFR5cGUgPVxuICB8ICdjaGFuZ2UnXG4gIHwgJ3Jlc2V0J1xuICB8ICd1cGRhdGUnXG4gIHwgJ2Rlc3Ryb3knXG4gIHwgJ2FkZCdcbiAgfCAncmVtb3ZlJ1xuICB8ICdpbnZhbGlkJ1xuICB8ICdyZXF1ZXN0J1xuICB8ICdzeW5jJ1xuICB8ICdhdHRhY2gnO1xuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxFdmVudDxUPiB7XG4gIG5hbWU6IE9EYXRhTW9kZWxFdmVudFR5cGU7XG4gIGJ1YmJsaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICBjaGFpbjogW1xuICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBdW107XG4gIHZhbHVlPzogYW55O1xuICBwcmV2aW91cz86IGFueTtcbiAgb3B0aW9ucz86IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogT0RhdGFNb2RlbEV2ZW50VHlwZSxcbiAgICB7XG4gICAgICBtb2RlbCxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBwcmV2aW91cyxcbiAgICAgIHZhbHVlLFxuICAgICAgdHJhY2ssXG4gICAgICBvcHRpb25zLFxuICAgIH06IHtcbiAgICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICAgIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gICAgICB0cmFjaz86IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIHByZXZpb3VzPzogYW55O1xuICAgICAgdmFsdWU/OiBhbnk7XG4gICAgICBvcHRpb25zPzogYW55O1xuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgIHRoaXMucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmNoYWluID0gW1xuICAgICAgW1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb24gfHxcbiAgICAgICAgICAodGhpcy5tb2RlbCBhc1xuICAgICAgICAgICAgfCBPRGF0YU1vZGVsPGFueT5cbiAgICAgICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PiksXG4gICAgICAgIHRyYWNrIHx8IG51bGwsXG4gICAgICBdLFxuICAgIF07XG4gIH1cbiAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuYnViYmxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHB1c2goXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgdHJhY2s6IHN0cmluZyB8IG51bWJlclxuICApIHtcbiAgICB0aGlzLmNoYWluLnNwbGljZSgwLCAwLCBbbW9kZWwsIHRyYWNrXSk7XG4gIH1cblxuICB2aXNpdGVkKG1vZGVsOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhaW4uc29tZSgoYykgPT4gY1swXSA9PT0gbW9kZWwpO1xuICB9XG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmNoYWluXG4gICAgICAubWFwKChbLCB0cmFja10sIGluZGV4KSA9PlxuICAgICAgICB0eXBlb2YgdHJhY2sgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBgWyR7dHJhY2t9XWBcbiAgICAgICAgICA6IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGluZGV4ID09PSAwXG4gICAgICAgICAgICA/IHRyYWNrXG4gICAgICAgICAgICA6IGAuJHt0cmFja31gXG4gICAgICAgICAgOiAnJ1xuICAgICAgKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBCVUJCTElORyA9IFtcbiAgJ2NoYW5nZScsXG4gICdyZXNldCcsXG4gICd1cGRhdGUnLFxuICAnZGVzdHJveScsXG4gICdhZGQnLFxuICAncmVtb3ZlJyxcbl07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX0FMTCA9IHtcbiAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICBpbmNsdWRlX2tleTogdHJ1ZSxcbiAgaW5jbHVkZV9ub25fZmllbGQ6IHRydWUsXG59O1xuXG5leHBvcnQgZW51bSBPRGF0YU1vZGVsU3RhdGUge1xuICBBZGRlZCxcbiAgUmVtb3ZlZCxcbiAgQ2hhbmdlZCxcbiAgVW5jaGFuZ2VkLFxufVxuXG5leHBvcnQgdHlwZSBNb2RlbE9wdGlvbnMgPSB7XG4gIGNpZD86IHN0cmluZztcbiAgZmllbGRzOiB7IFtuYW1lOiBzdHJpbmddOiBNb2RlbEZpZWxkT3B0aW9ucyB9O1xufTtcblxuZXhwb3J0IHR5cGUgTW9kZWxGaWVsZE9wdGlvbnMgPSB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGNvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBtaW5MZW5ndGg/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBwYXR0ZXJuPzogUmVnRXhwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsKHsgY2lkID0gQ0lEIH06IHsgY2lkPzogc3RyaW5nIH0gPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyB7IG5ldyAoLi4uYXJnczogYW55W10pOiB7fSB9Pihjb25zdHJ1Y3RvcjogVCkgPT4ge1xuICAgIGNvbnN0IEtsYXNzID0gPGFueT5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIEtsYXNzLm9wdGlvbnMuY2lkID0gY2lkO1xuICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsRmllbGQoe1xuICBuYW1lLFxuICAuLi5vcHRpb25zXG59OiB7IG5hbWU/OiBzdHJpbmcgfSAmIE1vZGVsRmllbGRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIG9wdGlvbnMuZmllbGQgPSBuYW1lIHx8IGtleTtcbiAgICBLbGFzcy5vcHRpb25zLmZpZWxkc1trZXldID0gb3B0aW9ucztcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPiA9IE1vZGVsRmllbGRPcHRpb25zICYge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxGaWVsZDxGPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj47XG4gIG1vZGVsT3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgbWV0YT86IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIHJlcXVpcmVkOiBib29sZWFuO1xuICBjb25jdXJyZW5jeTogYm9vbGVhbjtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBtaW5MZW5ndGg/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBwYXR0ZXJuPzogUmVnRXhwO1xuICBjb25zdHJ1Y3RvcihcbiAgICBtb2RlbE9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4sXG4gICAgeyBuYW1lLCBmaWVsZCwgcGFyc2VyLCAuLi5vcHRpb25zIH06IE9EYXRhTW9kZWxGaWVsZE9wdGlvbnM8Rj5cbiAgKSB7XG4gICAgdGhpcy5tb2RlbE9wdGlvbnMgPSBtb2RlbE9wdGlvbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy5kZWZhdWx0ID0gb3B0aW9ucy5kZWZhdWx0IHx8IHRoaXMucGFyc2VyLmRlZmF1bHQ7XG4gICAgdGhpcy5yZXF1aXJlZCA9IEJvb2xlYW4ob3B0aW9ucy5yZXF1aXJlZCk7XG4gICAgdGhpcy5jb25jdXJyZW5jeSA9IEJvb2xlYW4ob3B0aW9ucy5jb25jdXJyZW5jeSk7XG4gICAgdGhpcy5tYXhMZW5ndGggPSBvcHRpb25zLm1heExlbmd0aDtcbiAgICB0aGlzLm1pbkxlbmd0aCA9IG9wdGlvbnMubWluTGVuZ3RoO1xuICAgIHRoaXMubWluID0gb3B0aW9ucy5taW47XG4gICAgdGhpcy5tYXggPSBvcHRpb25zLm1heDtcbiAgICB0aGlzLnBhdHRlcm4gPSBvcHRpb25zLnBhdHRlcm47XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsT3B0aW9ucy5hcGk7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIudHlwZTtcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMucGFyc2VyLm5hdmlnYXRpb24pO1xuICB9XG5cbiAgZ2V0IGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXJzZXIuY29sbGVjdGlvbik7XG4gIH1cblxuICBnZXQgY29tcHV0ZWQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICB0aGlzLnBhcnNlci5maW5kQW5ub3RhdGlvbigoYSkgPT4gYS50ZXJtID09PSBDT01QVVRFRCk/LmJvb2xcbiAgICApO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gICAgY29uY3VycmVuY3ksXG4gIH06IHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gIH0pIHtcbiAgICB0aGlzLm1ldGEgPSBmaW5kT3B0aW9uc0ZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG4gICAgaWYgKGNvbmN1cnJlbmN5KSB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gIH1cblxuICBpc0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNLZXkoKTtcbiAgfVxuXG4gIGhhc1JlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaGFzUmVmZXJlbnRpYWxzKCk7XG4gIH1cblxuICBnZXQgcmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5yZWZlcmVudGlhbHM7XG4gIH1cblxuICBpc1N0cnVjdHVyZWRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc1N0cnVjdHVyZWRUeXBlKCk7XG4gIH1cblxuICBzdHJ1Y3R1cmVkKCkge1xuICAgIHJldHVybiB0aGlzLmFwaS5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPEY+KHRoaXMucGFyc2VyLnR5cGUpO1xuICB9XG5cbiAgaXNFbnVtVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNFbnVtVHlwZSgpO1xuICB9XG5cbiAgZW51bSgpIHtcbiAgICByZXR1cm4gdGhpcy5hcGkuZmluZEVudW1UeXBlRm9yVHlwZTxGPih0aGlzLnBhcnNlci50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAncGF0Y2gnO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8qXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICF2YWx1ZS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pID8gdmFsdWUuX2Vycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKCdtb2RlbHMnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5tb2RlbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICovXG4gICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gIXZhbHVlLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgPyB2YWx1ZS5fZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAuc29tZSgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiAhbS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKVxuICAgICAgICA/IHZhbHVlLm1vZGVscygpLm1hcCgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiBtLl9lcnJvcnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXJyb3JzID0gdGhpcy5wYXJzZXI/LnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZXF1aXJlZCAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAncGF0Y2gnKSkgLy8gSXMgbnVsbCBvciB1bmRlZmluZWQgd2l0aG91dCBwYXRjaD9cbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgcmVxdWlyZWRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYG1heGxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgbWlubGVuZ3RoYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA8IHRoaXMubWluXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYG1pbmApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1heCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiB0aGlzLm1heFxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtYXhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wYXR0ZXJuICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAhdGhpcy5wYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGRlZmF1bHRzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIHRoaXMubWV0YSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMubWV0YS5kZWZhdWx0cygpXG4gICAgICA6IHRoaXMuZGVmYXVsdDtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBPcHRpb25zKTogRiB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5hcGkub3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgc2VyaWFsaXplKHZhbHVlOiBGLCBvcHRpb25zPzogT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5hcGkub3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIGVuY29kZSh2YWx1ZTogRiwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICByZXNvdXJjZUZhY3Rvcnk8VCwgRj4oXG4gICAgcmVzb3VyY2U6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPlxuICApOiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPEY+IHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPEY+IHtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIHx8XG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yIG5vbiBjb21wYXRpYmxlIGJhc2UgdHlwZVwiKTtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uXG4gICAgICA/IChyZXNvdXJjZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5uYXZpZ2F0aW9uUHJvcGVydHk8Rj4oXG4gICAgICAgICAgdGhpcy5wYXJzZXIubmFtZVxuICAgICAgICApXG4gICAgICA6IChyZXNvdXJjZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5wcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKTtcbiAgfVxuXG4gIGFubm90YXRpb25zRmFjdG9yeShcbiAgICBhbm5vdHM6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnNcbiAgKTogT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyB8IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmNvbGxlY3Rpb25cbiAgICAgID8gbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyhcbiAgICAgICAgICBhbm5vdHMuaGVscGVyLFxuICAgICAgICAgIGFubm90cy5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lKSB8fCB7fVxuICAgICAgICApXG4gICAgICA6IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKFxuICAgICAgICAgIGFubm90cy5oZWxwZXIsXG4gICAgICAgICAgYW5ub3RzLnByb3BlcnR5KHRoaXMucGFyc2VyLm5hbWUpIHx8IHt9XG4gICAgICAgICk7XG4gIH1cblxuICBzY2hlbWFGYWN0b3J5PFQsIEY+KFxuICAgIHNjaGVtYTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlPEY+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc2NoZW1hLmFwaS5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlKHRoaXMucGFyc2VyLnR5cGUpO1xuICB9XG5cbiAgbW9kZWxDb2xsZWN0aW9uRmFjdG9yeTxULCBGPih7XG4gICAgcGFyZW50LFxuICAgIHZhbHVlLFxuICAgIHJlc2V0LFxuICB9OiB7XG4gICAgcGFyZW50OiBPRGF0YU1vZGVsPGFueT47XG4gICAgdmFsdWU/OiBGIHwgRltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdO1xuICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgfSk6IE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4ge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hRmFjdG9yeTxULCBGPihwYXJlbnQuc2NoZW1hKCkpO1xuICAgIGNvbnN0IGFubm90cyA9IHRoaXMuYW5ub3RhdGlvbnNGYWN0b3J5KHBhcmVudC5hbm5vdHMoKSk7XG5cbiAgICBjb25zdCBNb2RlbCA9IHNjaGVtYT8ubW9kZWw7XG4gICAgY29uc3QgQ29sbGVjdGlvbiA9IHNjaGVtYT8uY29sbGVjdGlvbjtcbiAgICBpZiAoTW9kZWwgPT09IHVuZGVmaW5lZCB8fCBDb2xsZWN0aW9uID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBFcnJvcihgTm8gbW9kZWwgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5jb2xsZWN0aW9uXG4gICAgICA/IChuZXcgQ29sbGVjdGlvbigodmFsdWUgfHwgW10pIGFzIChGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pW10sIHtcbiAgICAgICAgICBhbm5vdHM6IGFubm90cyBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gICAgICAgICAgcGFyZW50OiBbcGFyZW50LCB0aGlzXSxcbiAgICAgICAgICByZXNldCxcbiAgICAgICAgfSkgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+KVxuICAgICAgOiAobmV3IE1vZGVsKCh2YWx1ZSB8fCB7fSkgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICAgICAgYW5ub3RzOiBhbm5vdHMgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgICAgICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgICAgICAgIHJlc2V0LFxuICAgICAgICB9KSBhcyBPRGF0YU1vZGVsPEY+KTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsUmVsYXRpb248VD4gPSB7XG4gIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGU7XG4gIG1vZGVsOiBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+IHwgbnVsbDtcbiAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxUPjtcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxFbnRyeTxULCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4gPSB7XG4gIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGU7XG4gIG1vZGVsOiBNO1xuICBrZXk/OiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxPcHRpb25zPFQ+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjaWQ6IHN0cmluZztcbiAgYmFzZT86IHN0cmluZztcbiAgb3Blbj86IGJvb2xlYW47XG4gIHByaXZhdGUgX2ZpZWxkczogT0RhdGFNb2RlbEZpZWxkPGFueT5bXTtcbiAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICBlbnRpdHlTZXQ/OiBPRGF0YUVudGl0eVNldDtcbiAgLy8gSGllcmFyY2h5XG4gIHBhcmVudD86IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIGNoaWxkcmVuOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbE9wdGlvbnMsIHNjaGVtYTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPikge1xuICAgIHRoaXMubmFtZSA9IHNjaGVtYS5uYW1lO1xuICAgIHRoaXMuYmFzZSA9IHNjaGVtYS5iYXNlO1xuICAgIHRoaXMub3BlbiA9IHNjaGVtYS5vcGVuO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMuY2lkID0gb3B0aW9ucy5jaWQgfHwgQ0lEO1xuICAgIGNvbnN0IHNjaGVtYUZpZWxkcyA9IHRoaXMuc2NoZW1hLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSB9KTtcbiAgICB0aGlzLl9maWVsZHMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zLmZpZWxkcykubWFwKChbbmFtZSwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIC4uLm9wdHMgfSA9IG9wdGlvbnM7XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBuYW1lID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgUHJvcGVydGllcyBuZWVkIG5hbWUgYW5kIGZpZWxkJyk7XG4gICAgICBjb25zdCBwYXJzZXIgPSBzY2hlbWFGaWVsZHMuZmluZCgoZjogYW55KSA9PiBmLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwYXJzZXIgZm9yICR7ZmllbGR9IHdpdGggbmFtZSA9ICR7bmFtZX1gKTtcbiAgICAgIHJldHVybiBuZXcgT0RhdGFNb2RlbEZpZWxkPFQ+KHRoaXMsIHsgbmFtZSwgZmllbGQsIHBhcnNlciwgLi4ub3B0cyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBhcGkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmFwaTtcbiAgfVxuXG4gIHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLnR5cGUoKTtcbiAgfVxuXG4gIGlzVHlwZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5pc1R5cGVPZih0eXBlKTtcbiAgfVxuXG4gIGZpbmRDaGlsZE9wdGlvbnMoXG4gICAgcHJlZGljYXRlOiAob3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PikgPT4gYm9vbGVhblxuICApOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJlZGljYXRlKHRoaXMpKSByZXR1cm4gdGhpcztcbiAgICBsZXQgbWF0Y2g6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRPcHRpb25zKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICB9OiB7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICB9KSB7XG4gICAgaWYgKHRoaXMuYmFzZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMuYmFzZSkgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5U2V0ID0gdGhpcy5hcGkuZmluZEVudGl0eVNldEZvckVudGl0eVR5cGUodGhpcy50eXBlKCkpO1xuICAgIGxldCBjb25jdXJyZW5jeUZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5lbnRpdHlTZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uY3VycmVuY3lGaWVsZHMgPVxuICAgICAgICB0aGlzLmVudGl0eVNldC5maW5kQW5ub3RhdGlvbigoYSkgPT4gYS50ZXJtID09PSBPUFRJTUlTVElDX0NPTkNVUlJFTkNZKVxuICAgICAgICAgID8ucHJvcGVydGllcyB8fCBbXTtcbiAgICB9XG4gICAgdGhpcy5fZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBsZXQgY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeUZpZWxkcy5pbmRleE9mKGZpZWxkLmZpZWxkKSAhPT0gLTE7XG4gICAgICBmaWVsZC5jb25maWd1cmUoe1xuICAgICAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmaWVsZHMoe1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfcGFyZW50cyA9IHRydWUsXG4gIH06IHtcbiAgICBpbmNsdWRlX3BhcmVudHM/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9EYXRhTW9kZWxGaWVsZDxhbnk+W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4oaW5jbHVkZV9wYXJlbnRzICYmIHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnBhcmVudC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb24sIGluY2x1ZGVfcGFyZW50cyB9KVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLnRoaXMuX2ZpZWxkcy5maWx0ZXIoXG4gICAgICAgIChmaWVsZCkgPT4gaW5jbHVkZV9uYXZpZ2F0aW9uIHx8ICFmaWVsZC5uYXZpZ2F0aW9uXG4gICAgICApLFxuICAgIF07XG4gIH1cblxuICBmaWVsZChuYW1lOiBrZXlvZiBUIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICB9KS5maW5kKFxuICAgICAgKG1vZGVsRmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PlxuICAgICAgICBtb2RlbEZpZWxkLm5hbWUgPT09IG5hbWUgfHwgbW9kZWxGaWVsZC5maWVsZCA9PT0gbmFtZVxuICAgICk7XG4gIH1cblxuICBhdHRhY2goc2VsZjogT0RhdGFNb2RlbDxUPiwgcmVzb3VyY2U6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPikge1xuICAgIGlmIChcbiAgICAgIHNlbGYuX3Jlc291cmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlc291cmNlLnR5cGUoKSAhPT0gc2VsZi5fcmVzb3VyY2UudHlwZSgpICYmXG4gICAgICAhcmVzb3VyY2UuaXNTdWJ0eXBlT2Yoc2VsZi5fcmVzb3VyY2UpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FuJ3QgcmVhdHRhY2ggJHtyZXNvdXJjZS50eXBlKCl9IHRvICR7c2VsZi5fcmVzb3VyY2UudHlwZSgpfWBcbiAgICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gc2VsZi5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICBzZWxmLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2F0dGFjaCcsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIyByZWdpb24gUmVzb3VyY2VcbiAgc3RhdGljIGNoYWluKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICBdW10ge1xuICAgIGNvbnN0IGNoYWluID0gW10gYXMgYW55W107XG4gICAgbGV0IHR1cGxlOlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgICAgXVxuICAgICAgfCBudWxsID0gW2NoaWxkLCBudWxsXTtcbiAgICB3aGlsZSAodHVwbGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHR1cGxlIGFzIFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgaWYgKGNoYWluLnNvbWUoKHApID0+IHBbMF0gPT09IHBhcmVudFswXSkpIGJyZWFrO1xuICAgICAgY2hhaW4uc3BsaWNlKDAsIDAsIHBhcmVudCk7XG4gICAgICB0dXBsZSA9IHR1cGxlWzBdLl9wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFpbjtcbiAgfVxuXG4gIHN0YXRpYyByZXNvdXJjZTxUPihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICApOiBPRGF0YU1vZGVsUmVzb3VyY2U8VD4gfCBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPiB7XG4gICAgbGV0IHJlc291cmNlOlxuICAgICAgfCBPRGF0YU1vZGVsUmVzb3VyY2U8YW55PlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxhbnk+XG4gICAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBbbW9kZWwsIGZpZWxkXSBvZiBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkpIHtcbiAgICAgIHJlc291cmNlID1cbiAgICAgICAgcmVzb3VyY2UgfHxcbiAgICAgICAgLy9tb2RlbC5fcmVzb3VyY2UgfHxcbiAgICAgICAgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpXG4gICAgICAgICAgPyAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS5fbWV0YS5tb2RlbFJlc291cmNlRmFjdG9yeSgpXG4gICAgICAgICAgOiAoXG4gICAgICAgICAgICAgIG1vZGVsIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgICAgICAgICAgICkuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSgpKTtcbiAgICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSkge1xuICAgICAgICBsZXQga2V5ID0gKG1vZGVsIGFzIE9EYXRhTW9kZWw8YW55Pikua2V5KHtcbiAgICAgICAgICBmaWVsZF9tYXBwaW5nOiB0cnVlLFxuICAgICAgICB9KSBhcyBFbnRpdHlLZXk8YW55PjtcbiAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJlc291cmNlID1cbiAgICAgICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICAgICAgICA/IHJlc291cmNlLmVudGl0eShrZXkpXG4gICAgICAgICAgICAgIDogcmVzb3VyY2Uua2V5KGtleSk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBtb2RlbC5fcmVzb3VyY2U/LmNsb25lUXVlcnkoKS50b1F1ZXJ5QXJndW1lbnRzKCk7XG4gICAgICAgIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkKSByZXNvdXJjZS5xdWVyeS5hcHBseShxdWVyeSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzb3VyY2UgPSAoZmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4pLnJlc291cmNlRmFjdG9yeTxhbnksIGFueT4oXG4gICAgICAgIHJlc291cmNlIGFzIE9EYXRhTW9kZWxSZXNvdXJjZTxhbnk+XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVzb3VyY2U6IENhbid0IGJ1aWxkIHJlc291cmNlIGZvciAke2NoaWxkfWApO1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnkoe1xuICAgIGJhc2VSZXNvdXJjZSxcbiAgfTogeyBiYXNlUmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+IH0gPSB7fSk6IE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+IHtcbiAgICBpZiAodGhpcy5lbnRpdHlTZXQgIT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiBPRGF0YUVudGl0eVNldFJlc291cmNlLmZhY3Rvcnk8VD4oXG4gICAgICAgIHRoaXMuYXBpLFxuICAgICAgICB0aGlzLmVudGl0eVNldC5uYW1lLFxuICAgICAgICB0aGlzLnR5cGUoKSxcbiAgICAgICAgbmV3IE9EYXRhUGF0aFNlZ21lbnRzKCksXG4gICAgICAgIGJhc2VSZXNvdXJjZT8uY2xvbmVRdWVyeSgpIHx8IG5ldyBPRGF0YVF1ZXJ5T3B0aW9ucygpXG4gICAgICApO1xuICAgIGlmIChiYXNlUmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENhbid0IGJ1aWxkIHJlc291cmNlXCIpO1xuICAgIHJldHVybiBiYXNlUmVzb3VyY2UuY2xvbmUoKSBhcyBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPjtcbiAgfVxuXG4gIG1vZGVsUmVzb3VyY2VGYWN0b3J5KHtcbiAgICBiYXNlUmVzb3VyY2UsXG4gIH06IHtcbiAgICBmcm9tU2V0PzogYm9vbGVhbjtcbiAgICBiYXNlUmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+O1xuICB9ID0ge30pOiBPRGF0YU1vZGVsUmVzb3VyY2U8VD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KHsgYmFzZVJlc291cmNlIH0pO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHJldHVybiByZXNvdXJjZS5lbnRpdHkoKTtcbiAgICByZXR1cm4gcmVzb3VyY2UgYXMgT0RhdGFNb2RlbFJlc291cmNlPFQ+O1xuICB9XG5cbiAgZW50aXR5UmVzb3VyY2Uoc2VsZjogT0RhdGFNb2RlbDxUPik6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPiB7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5tb2RlbFJlc291cmNlRmFjdG9yeSh7XG4gICAgICBiYXNlUmVzb3VyY2U6IHNlbGYuX3Jlc291cmNlLFxuICAgICAgZnJvbVNldDogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBrZXkgPSBzZWxmLmtleSh7IGZpZWxkX21hcHBpbmc6IHRydWUgfSkgYXMgRW50aXR5S2V5PFQ+O1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHJlc291cmNlLmtleShrZXkpO1xuICAgIHJldHVybiByZXNvdXJjZSBhcyBPRGF0YU1vZGVsUmVzb3VyY2U8VD47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgYmluZChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YU1vZGVsUmVzb3VyY2U8VD47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICAvLyBQYXJlbnRcbiAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudDtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlc291cmNlXG4gICAgICB0aGlzLmF0dGFjaChzZWxmLCByZXNvdXJjZSk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICBzZWxmLl9hbm5vdGF0aW9ucyA9XG4gICAgICBhbm5vdHMgfHwgbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMoT0RhdGFIZWxwZXJbREVGQVVMVF9WRVJTSU9OXSk7XG5cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSk7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZiwgZmllbGQubmFtZSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gdGhpcy5fZ2V0KHNlbGYsIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+KSxcbiAgICAgICAgc2V0OiAodmFsdWU6IGFueSkgPT5cbiAgICAgICAgICB0aGlzLl9zZXQoc2VsZiwgZmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4sIHZhbHVlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgcmVzb3VyY2U6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPixcbiAgICBmdW5jOiAocToge1xuICAgICAgc2VsZWN0KG9wdHM/OiBTZWxlY3Q8VD4pOiBPcHRpb25IYW5kbGVyPFNlbGVjdDxUPj47XG4gICAgICBleHBhbmQob3B0cz86IEV4cGFuZDxUPik6IE9wdGlvbkhhbmRsZXI8RXhwYW5kPFQ+PjtcbiAgICAgIGZvcm1hdChvcHRzPzogc3RyaW5nKTogT3B0aW9uSGFuZGxlcjxzdHJpbmc+O1xuICAgICAgYXBwbHkocXVlcnk6IFF1ZXJ5QXJndW1lbnRzPFQ+KTogdm9pZDtcbiAgICB9KSA9PiB2b2lkXG4gICkge1xuICAgIGZ1bmMocmVzb3VyY2UucXVlcnkpO1xuICAgIHRoaXMuYXR0YWNoKHNlbGYsIHJlc291cmNlKTtcbiAgfVxuXG4gIHJlc29sdmVLZXkoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleVR5cGVzID0gdGhpcy5zY2hlbWEua2V5cyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KTtcbiAgICBjb25zdCBrZXk6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIGt0IG9mIGtleVR5cGVzKSB7XG4gICAgICBsZXQgdiA9IHZhbHVlIGFzIGFueTtcbiAgICAgIGxldCBvcHRpb25zID0gdGhpcyBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgbGV0IGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IG5hbWUgb2Yga3QubmFtZS5zcGxpdCgnLycpKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICBmaWVsZCA9IG9wdGlvbnNcbiAgICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHYgPVxuICAgICAgICAgICAgVHlwZXMuaXNQbGFpbk9iamVjdCh2KSB8fCBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHYpXG4gICAgICAgICAgICAgID8gdltmaWVsZC5uYW1lXVxuICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgb3B0aW9ucyA9IGZpZWxkLm1ldGEgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBsZXQgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyBmaWVsZC5maWVsZCA6IGZpZWxkLm5hbWU7XG4gICAgICBpZiAoa3QuYWxpYXMgIT09IHVuZGVmaW5lZCkgbmFtZSA9IGt0LmFsaWFzO1xuICAgICAga2V5W25hbWVdID0gdjtcbiAgICB9XG4gICAgaWYgKFR5cGVzLmlzRW1wdHkoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZSA/IE9iamVjdHMucmVzb2x2ZUtleShrZXkpIDoga2V5O1xuICB9XG5cbiAgcmVzb2x2ZVJlZmVyZW50aWFsKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbnRpYWw6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIHJlZiBvZiBmaWVsZC5yZWZlcmVudGlhbHMpIHtcbiAgICAgIGxldCBmcm9tID0gdGhpcy5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSkuZmluZChcbiAgICAgICAgKHA6IGFueSkgPT4gcC5maWVsZCA9PT0gcmVmLnJlZmVyZW5jZWRQcm9wZXJ0eVxuICAgICAgKTtcbiAgICAgIGxldCB0byA9IGZpZWxkLm1vZGVsT3B0aW9uc1xuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5maW5kKChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSByZWYucHJvcGVydHkpO1xuICAgICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbnRpYWxbbmFtZV0gPSAoc2VsZiBhcyBhbnkpW2Zyb20ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KHJlZmVyZW50aWFsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbnRpYWwsIHsgc2luZ2xlOiBmYWxzZSB9KVxuICAgICAgOiByZWZlcmVudGlhbDtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVuY2VkKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbmNlZDogYW55ID0ge307XG4gICAgZm9yICh2YXIgcmVmIG9mIGZpZWxkLnJlZmVyZW50aWFscykge1xuICAgICAgbGV0IGZyb20gPSB0aGlzLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KS5maW5kKFxuICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gcmVmLnByb3BlcnR5XG4gICAgICApO1xuICAgICAgbGV0IHRvID0gKGZpZWxkLm1ldGEgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PilcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PlxuICAgICAgICAgICAgZmllbGQuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHlcbiAgICAgICAgKTtcbiAgICAgIGlmIChmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyB0by5maWVsZCA6IHRvLm5hbWU7XG4gICAgICAgIHJlZmVyZW5jZWRbbmFtZV0gPSAoc2VsZiBhcyBhbnkpW2Zyb20ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KHJlZmVyZW5jZWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShyZWZlcmVuY2VkLCB7IHNpbmdsZTogZmFsc2UgfSlcbiAgICAgIDogcmVmZXJlbmNlZDtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAncGF0Y2gnO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcbiAgICB9KS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IChzZWxmIGFzIGFueSlbZmllbGQubmFtZV07XG4gICAgICBsZXQgZXJycyA9IGZpZWxkLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCB9KTtcbiAgICAgIHJldHVybiBlcnJzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IGVycnMgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWZzID0gdGhpcy5maWVsZHMoKS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRzKCk7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtmaWVsZC5uYW1lXTogdmFsdWUgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShkZWZzKSA/IGRlZnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYXNDaGFuZ2VkKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhVHlwZXMuaXNFbXB0eShzZWxmLl9jaGFuZ2VzKSB8fFxuICAgICAgT2JqZWN0LnZhbHVlcyhzZWxmLl9yZWxhdGlvbnMpXG4gICAgICAgIC5maWx0ZXIoKHsgZmllbGQgfSkgPT4gIWZpZWxkLm5hdmlnYXRpb24gfHwgaW5jbHVkZV9uYXZpZ2F0aW9uKVxuICAgICAgICAuc29tZShcbiAgICAgICAgICAoeyBmaWVsZCwgc3RhdGUsIG1vZGVsIH0pID0+XG4gICAgICAgICAgICAoIWluY2x1ZGVfbmF2aWdhdGlvbiB8fCBmaWVsZC5uYXZpZ2F0aW9uKSAmJlxuICAgICAgICAgICAgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCB8fFxuICAgICAgICAgICAgICAobW9kZWwgIT09IG51bGwgJiYgbW9kZWwuaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSkpXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXNFbnRpdHk8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KFxuICAgIHNlbGY6IE0sXG4gICAgZnVuYzogKG1vZGVsOiBNKSA9PiBPYnNlcnZhYmxlPFI+XG4gICk6IE9ic2VydmFibGU8Uj4ge1xuICAgIGNvbnN0IHBhcmVudCA9IHNlbGYuX3BhcmVudDtcbiAgICBzZWxmLl9wYXJlbnQgPSBudWxsO1xuICAgIHJldHVybiBmdW5jKHNlbGYpLnBpcGUodGFwKCgpID0+IChzZWxmLl9wYXJlbnQgPSBwYXJlbnQpKSk7XG4gIH1cblxuICB0b0VudGl0eShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICBjaGFpbiA9IFtdLFxuICAgIH06IHtcbiAgICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gICAgfSA9IHt9XG4gICk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgbGV0IGF0dHJzID0gc2VsZi5hdHRyaWJ1dGVzKHtcbiAgICAgIGNoYW5nZXNfb25seSxcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlbGF0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHNlbGYuX3JlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYWluXG4gICAgICAgIChbLCB7IG1vZGVsIH1dKSA9PiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gbW9kZWwpXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAvLyBDaGFuZ2VzIG9ubHlcbiAgICAgICAgKFssIHsgbW9kZWwsIHN0YXRlIH1dKSA9PlxuICAgICAgICAgICFjaGFuZ2VzX29ubHkgfHxcbiAgICAgICAgICAoY2hhbmdlc19vbmx5ICYmXG4gICAgICAgICAgICAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkIHx8XG4gICAgICAgICAgICAgIChtb2RlbCAhPT0gbnVsbCAmJiBtb2RlbC5oYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pKSkpXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoWywgeyBmaWVsZCwgbW9kZWwgfV0pID0+XG4gICAgICAgICAgLy8gTmF2aWdhdGlvblxuICAgICAgICAgIChpbmNsdWRlX25hdmlnYXRpb24gJiYgZmllbGQubmF2aWdhdGlvbiAmJiBtb2RlbCAhPT0gbnVsbCkgfHxcbiAgICAgICAgICAhZmllbGQubmF2aWdhdGlvblxuICAgICAgKVxuICAgICAgLm1hcCgoW2ssIHsgbW9kZWwsIGZpZWxkLCBzdGF0ZSB9XSkgPT4ge1xuICAgICAgICBsZXQgY2hhbmdlc09ubHkgPVxuICAgICAgICAgIGNoYW5nZXNfb25seSAmJlxuICAgICAgICAgIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCAmJlxuICAgICAgICAgICEhZmllbGQubmF2aWdhdGlvbjtcbiAgICAgICAgbGV0IGluY2x1ZGVLZXkgPSBpbmNsdWRlX2tleSAmJiAhIWZpZWxkLm5hdmlnYXRpb247XG4gICAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgKG1vZGVsIGFzIE9EYXRhTW9kZWw8YW55PikudG9FbnRpdHkoe1xuICAgICAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgICAgIGluY2x1ZGVfa2V5OiBpbmNsdWRlS2V5LFxuICAgICAgICAgICAgICBjaGFpbjogW3NlbGYsIC4uLmNoYWluXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKG1vZGVsKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgKG1vZGVsIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pLnRvRW50aXRpZXMoe1xuICAgICAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgICAgIGluY2x1ZGVfa2V5OiBpbmNsdWRlS2V5LFxuICAgICAgICAgICAgICBjaGFpbjogW3NlbGYsIC4uLmNoYWluXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrLCBtb2RlbF07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBbaywgdl0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZpZWxkX21hcHBpbmdcbiAgICAgICAgICA/IHRoaXMuZmllbGRzKCkuZmluZChcbiAgICAgICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQubmFtZSA9PT0ga1xuICAgICAgICAgICAgKT8uZmllbGQgfHwga1xuICAgICAgICAgIDogaztcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdiB9KTtcbiAgICAgIH0sIHt9KTtcblxuICAgIC8vIENyZWF0ZSBlbnRpdHlcbiAgICBsZXQgZW50aXR5ID0gT2JqZWN0LmFzc2lnbihhdHRycywgcmVsYXRpb25zKTtcblxuICAgIC8vIEFkZCBjbGllbnRfaWRcbiAgICBpZiAoY2xpZW50X2lkKSB7XG4gICAgICBlbnRpdHlbdGhpcy5jaWRdID0gKDxhbnk+c2VsZilbdGhpcy5jaWRdO1xuICAgIH1cblxuICAgIC8vIEFkZCBrZXlcbiAgICBpZiAoaW5jbHVkZV9rZXkpIHtcbiAgICAgIGVudGl0eSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIGVudGl0eSxcbiAgICAgICAgdGhpcy5yZXNvbHZlS2V5KHNlbGYsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZTogZmFsc2UgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIGF0dHJpYnV0ZXMoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIC8vIEF0dHJpYnV0ZXMgYnkgZmllbGRzIChhdHRyaWJ1dGVzIGZvciB0aGUgbW9kZWwgdHlwZSlcbiAgICBjb25zdCBmaWVsZEF0dHJzID0gdGhpcy5maWVsZHMoKS5yZWR1Y2UoKGFjYywgZikgPT4ge1xuICAgICAgY29uc3QgaXNDaGFuZ2VkID0gZi5uYW1lIGluIHNlbGYuX2NoYW5nZXM7XG4gICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGYuZmllbGQgOiBmLm5hbWU7XG4gICAgICBjb25zdCB2YWx1ZSA9IGlzQ2hhbmdlZFxuICAgICAgICA/IHNlbGYuX2NoYW5nZXNbZi5uYW1lXVxuICAgICAgICA6IHNlbGYuX2F0dHJpYnV0ZXNbZi5uYW1lXTtcbiAgICAgIGlmIChmLmNvbmN1cnJlbmN5ICYmIGluY2x1ZGVfY29uY3VycmVuY3kpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGYuY29tcHV0ZWQgJiYgaW5jbHVkZV9jb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc19vbmx5ICYmIGlzQ2hhbmdlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIWNoYW5nZXNfb25seSAmJiAhZi5jb25jdXJyZW5jeSAmJiAhZi5jb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgfSwge30pO1xuICAgIGlmICghaW5jbHVkZV9ub25fZmllbGQpIHJldHVybiBmaWVsZEF0dHJzO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoZmllbGRBdHRycyk7XG4gICAgLy8gQXR0cmlidXRlcyBmcm9tIG9iamVjdCAoYXR0cmlidXRlcyBmb3Igb2JqZWN0KVxuICAgIGNvbnN0IG5vbkZpZWxkQXR0cnMgPSBPYmplY3QuZW50cmllcyhzZWxmKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICBuYW1lcy5pbmRleE9mKGspID09PSAtMSAmJiAhay5zdGFydHNXaXRoKCdfJykgJiYgIWsuZW5kc1dpdGgoJyQnKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjLCBbaywgdl0pID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrXTogdiB9KSwge30pO1xuICAgIHJldHVybiB7IC4uLmZpZWxkQXR0cnMsIC4uLm5vbkZpZWxkQXR0cnMgfTtcbiAgfVxuXG4gIHJlc2V0KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBuYW1lLCBzaWxlbnQgPSBmYWxzZSB9OiB7IG5hbWU/OiBzdHJpbmc7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGlmICghVHlwZXMuaXNFbXB0eShuYW1lKSAmJiAobmFtZSBhcyBzdHJpbmcpIGluIHNlbGYuX2NoYW5nZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc2VsZi5fYXR0cmlidXRlc1tuYW1lIGFzIHN0cmluZ107XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHNlbGYuX2NoYW5nZXNbbmFtZSBhcyBzdHJpbmddO1xuICAgICAgZGVsZXRlIHNlbGYuX2NoYW5nZXNbbmFtZSBhcyBzdHJpbmddO1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgICB0cmFjazogbmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFR5cGVzLmlzRW1wdHkobmFtZSkpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhzZWxmLl9jaGFuZ2VzKTtcbiAgICAgIHNlbGYuX2NoYW5nZXMgPSB7fTtcbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICAgICAgdHJhY2s6IGVudHJ5WzBdLFxuICAgICAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICAgICAgdmFsdWU6IHNlbGYuX2F0dHJpYnV0ZXNbZW50cnlbMF1dLFxuICAgICAgICAgICAgICBwcmV2aW91czogZW50cnlbMV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7IHJlc2V0PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgc2VsZi5fcmVzZXR0aW5nID0gcmVzZXQ7XG4gICAgc2VsZi5fc2lsZW50ID0gc2lsZW50O1xuXG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFwcGx5IGVudGl0eVxuICAgIGNvbnN0IG1vZGVsID0gc2VsZiBhcyBhbnk7XG4gICAgT2JqZWN0LmVudHJpZXMoZW50aXR5KVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSAvLyBGaWx0ZXIgdW5kZWZpbmVkXG4gICAgICAuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMoe1xuICAgICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICAgIH0pLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIChzZWxmLl9yZXNldHRpbmcgJiYgZmllbGQuZmllbGQgPT09IGtleSkgfHwgZmllbGQubmFtZSA9PT0ga2V5XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBEZWxlZ2F0ZWQgdG8gcHJpdmF0ZSBzZXR0ZXJcbiAgICAgICAgICBpZiAodGhpcy5fc2V0KHNlbGYsIGZpZWxkLCB2YWx1ZSkpIGNoYW5nZXMucHVzaChmaWVsZC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBCYXNpYyBhc3NpZ25tZW50XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG1vZGVsW2tleV07XG4gICAgICAgICAgbW9kZWxba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSB2YWx1ZSkgY2hhbmdlcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChzZWxmLl9yZXNldHRpbmcgPyAncmVzZXQnIDogJ3VwZGF0ZScsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBvcHRpb25zOiB7IGNoYW5nZXMgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHNlbGYuX3Jlc2V0dGluZyA9IGZhbHNlO1xuICAgIHNlbGYuX3NpbGVudCA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGlzTW9kZWwob2JqOiBhbnkpIHtcbiAgICByZXR1cm4ge30udG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBNb2RlbF0nO1xuICB9XG5cbiAgc3RhdGljIGlzQ29sbGVjdGlvbihvYmo6IGFueSkge1xuICAgIHJldHVybiB7fS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IENvbGxlY3Rpb25dJztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sbGVjdGlvbjxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgY29sbGVjdGlvbjogT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgIHZhbHVlOiBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4gfCBUW10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICkge1xuICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS50b0VudGl0aWVzKFxuICAgICAgICBJTkNMVURFX0FMTFxuICAgICAgKTtcbiAgICB9XG4gICAgY29sbGVjdGlvbi5fYW5ub3RhdGlvbnMgPSBmaWVsZC5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBzZWxmLmFubm90cygpXG4gICAgKSBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM7XG4gICAgY29sbGVjdGlvbi5hc3NpZ24odmFsdWUgYXMgVFtdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0dGluZyxcbiAgICAgIHNpbGVudDogc2VsZi5fc2lsZW50LFxuICAgIH0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZU1vZGVsPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICBtb2RlbDogT0RhdGFNb2RlbDxGPixcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxGPiB8IEYgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICApIHtcbiAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4pLnRvRW50aXR5KElOQ0xVREVfQUxMKTtcbiAgICB9XG4gICAgbW9kZWwuX2Fubm90YXRpb25zID0gZmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgc2VsZi5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucztcbiAgICBtb2RlbC5hc3NpZ24odmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICByZXNldDogc2VsZi5fcmVzZXR0aW5nLFxuICAgICAgc2lsZW50OiBzZWxmLl9zaWxlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVsLmhhc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj5cbiAgKTogRiB8IE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpKSB7XG4gICAgICByZXR1cm4gc2VsZi5fcmVsYXRpb25zW2ZpZWxkLm5hbWVdPy5tb2RlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlcyhzZWxmLCB7XG4gICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICAgIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gICAgICB9KVtmaWVsZC5uYW1lXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpKSB7XG4gICAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIHJlbGF0aW9uIGV4aXN0c1xuICAgICAgaWYgKCEoZmllbGQubmFtZSBpbiBzZWxmLl9yZWxhdGlvbnMpKSB7XG4gICAgICAgIHNlbGYuX3JlbGF0aW9uc1tmaWVsZC5uYW1lXSA9IHtcbiAgICAgICAgICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCxcbiAgICAgICAgICBtb2RlbDogbnVsbCxcbiAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbiA9IHNlbGYuX3JlbGF0aW9uc1tmaWVsZC5uYW1lXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHJlbGF0aW9uLm1vZGVsIGFzXG4gICAgICAgIHwgT0RhdGFNb2RlbDxhbnk+XG4gICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICAgICAgICB8IG51bGw7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZWxhdGlvbi5tb2RlbCA9IHZhbHVlIGFzIG51bGw7XG4gICAgICAgIGNoYW5nZWQgPSBjdXJyZW50TW9kZWwgIT09IHZhbHVlO1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZShzZWxmLCByZWxhdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50TW9kZWwpKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0aGlzLnVwZGF0ZUNvbGxlY3Rpb248Rj4oXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBjdXJyZW50TW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgICAgICAgIHZhbHVlIGFzXG4gICAgICAgICAgICB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PlxuICAgICAgICAgICAgfCBUW11cbiAgICAgICAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnRNb2RlbCkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRoaXMudXBkYXRlTW9kZWw8Rj4oXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBjdXJyZW50TW9kZWwgYXMgT0RhdGFNb2RlbDxGPixcbiAgICAgICAgICB2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+IHwgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKFR5cGVzLmlzQXJyYXkodmFsdWUpIHx8IFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJlbGF0aW9uLm1vZGVsID0gZmllbGQubW9kZWxDb2xsZWN0aW9uRmFjdG9yeTxULCBGPih7XG4gICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICByZXNldDogc2VsZi5fcmVzZXR0aW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZShzZWxmLCByZWxhdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpIHx8XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgcmVsYXRpb24ubW9kZWwgPSB2YWx1ZSBhc1xuICAgICAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICAgICAgfCBudWxsO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKHNlbGYsIHJlbGF0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHJlbGF0aW9uLm1vZGVsKSkge1xuICAgICAgICB2YXIgcmVmID0gKHJlbGF0aW9uLm1vZGVsIGFzIE9EYXRhTW9kZWw8Rj4pLnJlZmVyZW50aWFsKGZpZWxkKTtcbiAgICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxmLCByZWYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWxhdGlvbi5zdGF0ZSA9XG4gICAgICAgIHNlbGYuX3Jlc2V0dGluZyB8fCAhY2hhbmdlZFxuICAgICAgICAgID8gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZFxuICAgICAgICAgIDogT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQ7XG4gICAgICBpZiAoIXNlbGYuX3NpbGVudCAmJiBjaGFuZ2VkKSB7XG4gICAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICAgIHRyYWNrOiBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgICB2YWx1ZTogcmVsYXRpb24ubW9kZWwsXG4gICAgICAgICAgICBwcmV2aW91czogY3VycmVudE1vZGVsLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gdGhpcy5hdHRyaWJ1dGVzKHNlbGYsIHtcbiAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZV9jb21wdXRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gYXR0cnNbZmllbGQubmFtZV07XG4gICAgICBjaGFuZ2VkID0gIVR5cGVzLmlzRXF1YWwoY3VycmVudFZhbHVlLCB2YWx1ZSk7XG4gICAgICBpZiAoc2VsZi5fcmVzZXR0aW5nKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmLl9jaGFuZ2VzW2ZpZWxkLm5hbWVdO1xuICAgICAgICBzZWxmLl9hdHRyaWJ1dGVzW2ZpZWxkLm5hbWVdID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKFR5cGVzLmlzRXF1YWwodmFsdWUsIHNlbGYuX2F0dHJpYnV0ZXNbZmllbGQubmFtZV0pKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmLl9jaGFuZ2VzW2ZpZWxkLm5hbWVdO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHNlbGYuX2NoYW5nZXNbZmllbGQubmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi5fc2lsZW50ICYmIGNoYW5nZWQpIHtcbiAgICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgICAgdHJhY2s6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgcHJldmlvdXM6IGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsga2V5OiBmaWVsZC5pc0tleSgpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cblxuICBwcml2YXRlIF91bnN1YnNjcmliZTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlbGF0aW9uOiBPRGF0YU1vZGVsUmVsYXRpb248Rj5cbiAgKSB7XG4gICAgaWYgKHJlbGF0aW9uLnN1YnNjcmlwdGlvbiAhPT0gbnVsbCkge1xuICAgICAgcmVsYXRpb24uc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZWxhdGlvbi5zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9zdWJzY3JpYmU8Rj4oc2VsZjogT0RhdGFNb2RlbDxUPiwgcmVsYXRpb246IE9EYXRhTW9kZWxSZWxhdGlvbjxGPikge1xuICAgIGlmIChyZWxhdGlvbi5zdWJzY3JpcHRpb24gIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgfVxuICAgIGlmIChyZWxhdGlvbi5tb2RlbCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdWJzY3JpcHRpb24gbW9kZWwgaXMgbnVsbCcpO1xuICAgIH1cbiAgICBpZiAoIXJlbGF0aW9uLm1vZGVsLmlzUGFyZW50T2Yoc2VsZikpIHtcbiAgICAgIHJlbGF0aW9uLm1vZGVsLl9wYXJlbnQgPSBbc2VsZiwgcmVsYXRpb24uZmllbGRdO1xuICAgIH1cbiAgICByZWxhdGlvbi5zdWJzY3JpcHRpb24gPSByZWxhdGlvbi5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PGFueT4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEJVQkJMSU5HLmluZGV4T2YoZXZlbnQubmFtZSkgIT09IC0xICYmXG4gICAgICAgICAgZXZlbnQuYnViYmxpbmcgJiZcbiAgICAgICAgICAhZXZlbnQudmlzaXRlZChzZWxmKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IHJlbGF0aW9uLm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV2ZW50Lm5hbWUgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgICAgICAgIHJlbGF0aW9uLmZpZWxkLm5hdmlnYXRpb24gJiZcbiAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucz8ua2V5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIHJlZiA9IHJlbGF0aW9uLm1vZGVsLnJlZmVyZW50aWFsKHJlbGF0aW9uLmZpZWxkKTtcbiAgICAgICAgICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxmLCByZWYpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHVzaChzZWxmLCByZWxhdGlvbi5maWVsZC5uYW1lKTtcbiAgICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=