@expressive/mvc 0.63.6 → 0.64.2

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.
package/dist/esm/model.js CHANGED
@@ -1,4 +1,4 @@
1
- import { addListener, createEffect, event, pending, PENDING_KEYS, watch } from "./control";
1
+ import { addListener, createEffect, event, Observable, PENDING_KEYS } from "./control";
2
2
  const define = Object.defineProperty;
3
3
  const ID = /* @__PURE__ */ new WeakMap();
4
4
  const STATE = /* @__PURE__ */ new WeakMap();
@@ -12,14 +12,28 @@ class Model {
12
12
  define(this, "is", { value: this });
13
13
  init(this, args);
14
14
  }
15
+ [Observable](callback, required) {
16
+ const watch2 = /* @__PURE__ */ new Set();
17
+ const proxy = Object.create(this);
18
+ addListener(this, () => void callback(), watch2);
19
+ OBSERVER.set(proxy, (key, value) => {
20
+ if (value === void 0 && required)
21
+ throw new Error(`${this}.${key} is required in this context.`);
22
+ watch2.add(key);
23
+ if (value instanceof Object && Observable in value)
24
+ return value[Observable](callback, required);
25
+ return value;
26
+ });
27
+ return proxy;
28
+ }
15
29
  get(arg1, arg2) {
16
30
  const self = this.is;
17
31
  if (typeof arg1 == "function") {
18
- let pending2 = /* @__PURE__ */ new Set();
32
+ let pending = /* @__PURE__ */ new Set();
19
33
  return createEffect(self, (proxy) => {
20
- const cb = arg1.call(proxy, proxy, pending2);
34
+ const cb = arg1.call(proxy, proxy, pending);
21
35
  return cb === null ? null : (update2) => {
22
- pending2 = PENDING_KEYS.get(self);
36
+ pending = PENDING_KEYS.get(self);
23
37
  if (typeof cb == "function")
24
38
  cb(update2);
25
39
  };
@@ -27,23 +41,33 @@ class Model {
27
41
  }
28
42
  return arg1 === void 0 ? snapshot(self) : typeof arg2 == "function" ? addListener(self, arg2, arg1) : arg1 === null ? Object.isFrozen(STATE.get(self)) : fetch(self, arg1, arg2);
29
43
  }
30
- set(arg1, arg2) {
44
+ set(arg1, arg2, arg3) {
31
45
  const self = this.is;
32
46
  if (typeof arg1 == "function")
33
47
  return addListener(self, (key) => {
34
- if (typeof key == "string")
48
+ if (arg2 === key || arg2 === void 0 && typeof key == "string")
35
49
  return arg1.call(self, key, self);
36
50
  });
37
- if (typeof arg2 == "function")
38
- return addListener(self, (key) => {
39
- if (key === arg1)
40
- return arg2.call(self, key, self);
41
- });
42
51
  if (arg1 && typeof arg1 == "object")
43
52
  assign(self, arg1, arg2 === true);
44
- else
53
+ else if (!arg2)
45
54
  event(self, arg1);
46
- return pending(self);
55
+ else if (arg3)
56
+ manage(self, arg1, arg2);
57
+ else
58
+ update(self, arg1, arg2);
59
+ const pending = PENDING_KEYS.get(this);
60
+ if (pending)
61
+ return {
62
+ then: (res) => new Promise((res2) => {
63
+ const remove = addListener(this, (key) => {
64
+ if (key !== true) {
65
+ remove();
66
+ return res2.bind(null, Array.from(pending));
67
+ }
68
+ });
69
+ }).then(res)
70
+ };
47
71
  }
48
72
  /**
49
73
  * Iterate over managed properties in this instance of Model.
@@ -103,7 +127,7 @@ function assign(subject, data, silent) {
103
127
  else if (key in subject && key !== "is") {
104
128
  const desc = Object.getOwnPropertyDescriptor(subject, key);
105
129
  const set = desc && desc.set;
106
- set.call(subject, data[key], silent === true);
130
+ set.call(subject, data[key], silent);
107
131
  }
108
132
  }
109
133
  }
@@ -161,26 +185,10 @@ function init(model, args) {
161
185
  PARENT.set(model, null);
162
186
  for (const key in model) {
163
187
  const desc = Object.getOwnPropertyDescriptor(model, key);
164
- if ("value" in desc) {
165
- let set2 = function(value, silent) {
166
- update(model, key, value, silent);
167
- if (value instanceof Model && !PARENT.has(value)) {
168
- PARENT.set(value, model);
169
- event(value);
170
- }
171
- };
172
- var set = set2;
173
- set2(desc.value, true);
174
- define(model, key, {
175
- configurable: false,
176
- set: set2,
177
- get() {
178
- return watch(this, key, state[key]);
179
- }
180
- });
181
- }
188
+ if ("value" in desc)
189
+ manage(model, key, desc.value, true);
182
190
  }
183
- args.forEach((arg) => {
191
+ for (const arg of args) {
184
192
  const use = typeof arg == "function" ? arg.call(model, model) : arg;
185
193
  if (use instanceof Promise)
186
194
  use.catch((err) => {
@@ -191,7 +199,7 @@ function init(model, args) {
191
199
  addListener(model, use, null);
192
200
  else if (typeof use == "object")
193
201
  assign(model, use, true);
194
- });
202
+ }
195
203
  addListener(model, () => {
196
204
  for (const [_, value] of model)
197
205
  if (value instanceof Model && PARENT.get(value) === model)
@@ -201,6 +209,26 @@ function init(model, args) {
201
209
  return null;
202
210
  });
203
211
  }
212
+ function manage(target, key, value, silent) {
213
+ const state = STATE.get(target);
214
+ function get() {
215
+ return watch(this, key, state[key]);
216
+ }
217
+ function set(value2, silent2) {
218
+ update(target, key, value2, silent2);
219
+ if (value2 instanceof Model && !PARENT.has(value2)) {
220
+ PARENT.set(value2, target);
221
+ event(value2);
222
+ }
223
+ }
224
+ define(target, key, { set, get });
225
+ set(value, silent);
226
+ }
227
+ const OBSERVER = /* @__PURE__ */ new WeakMap();
228
+ function watch(from, key, value) {
229
+ const access = OBSERVER.get(from);
230
+ return access ? access(key, value) : value;
231
+ }
204
232
  function fetch(subject, property, required) {
205
233
  const state = STATE.get(subject);
206
234
  if (property in state || required === false) {
@@ -275,6 +303,7 @@ export {
275
303
  event,
276
304
  fetch,
277
305
  uid,
278
- update
306
+ update,
307
+ watch
279
308
  };
280
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT25VcGRhdGUsIHBlbmRpbmcsIFBFTkRJTkdfS0VZUywgd2F0Y2ggfSBmcm9tICcuL2NvbnRyb2wnO1xuXG5jb25zdCBkZWZpbmUgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8qKiBSZWdpc3RlciBmb3IgYWxsIGFjdGl2ZSBtb2RlbHMgdmlhIHN0cmluZyBpZGVudGlmaWVycyAodXN1YWxseSB1bmlxdWUpLiAqL1xuY29uc3QgSUQgPSBuZXcgV2Vha01hcDxNb2RlbCwgc3RyaW5nPigpO1xuXG4vKiogSW50ZXJuYWwgc3RhdGUgYXNzaWduZWQgdG8gbW9kZWxzLiAqL1xuY29uc3QgU1RBVEUgPSBuZXcgV2Vha01hcDxNb2RlbCwgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj4+KCk7XG5cbi8qKiBFeHRlcm5hbCBsaXN0ZW5lcnMgZm9yIGFueSBnaXZlbiBNb2RlbC4gKi9cbmNvbnN0IE5PVElGWSA9IG5ldyBXZWFrTWFwPE1vZGVsLlR5cGUsIFNldDxPblVwZGF0ZT4+KCk7XG5cbi8qKiBQYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy4gKi9cbmNvbnN0IFBBUkVOVCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBNb2RlbCB8IG51bGw+KCk7XG5cbi8qKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBieSBhIGdpdmVuIHR5cGUuICovXG5jb25zdCBNRVRIT0RTID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgTWFwPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IHZvaWQ+PigpO1xuXG4vKiogUmVmZXJlbmNlIGJvdW5kIGluc3RhbmNlIG1ldGhvZHMgdG8gcmVhbCBvbmVzLiAqL1xuY29uc3QgTUVUSE9EID0gbmV3IFdlYWtNYXA8YW55LCBhbnk+KCk7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIE1vZGVsIHtcbiAgLyoqIEFueSB0eXBlIG9mIE1vZGVsLCB1c2luZyBvd24gY2xhc3MgY29uc3RydWN0b3IgYXMgaXRzIGlkZW50aWZpZXIuICovXG4gIHR5cGUgVHlwZTxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgIChhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSAmIHR5cGVvZiBNb2RlbDtcblxuICAvKiogQSBNb2RlbCBjb25zdHJ1Y3RvciwgYnV0IHdoaWNoIGlzIG5vdCBhYnN0cmFjdC4gKi9cbiAgdHlwZSBJbml0PFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKG5ldyAoLi4uYXJnczogTW9kZWwuQXJnczxUPikgPT4gVCkgJiBPbWl0PHR5cGVvZiBNb2RlbCwgbmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBNb2RlbCBjb25zdHJ1Y3RvciBjYWxsYmFjayAtIGlzIGNhbGxlZCB3aGVuIE1vZGVsIGZpbmlzaGVzIGludGlhbGl6aW5nLlxuICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgQ2FsbGJhY2s8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAodGhpczogVCwgdGhpc0FyZzogVCkgPT4gUHJvbWlzZTx2b2lkPiB8ICgoKSA9PiB2b2lkKSB8IEFzc2lnbjxUPiB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50ICovXG4gIHR5cGUgQXJndW1lbnQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID0gQXNzaWduPFQ+IHwgQ2FsbGJhY2s8VD4gfCBzdHJpbmcgfCB2b2lkO1xuXG4gIC8qKiBNb2RlbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi9cbiAgdHlwZSBBcmdzPFQgZXh0ZW5kcyBNb2RlbCA9IGFueT4gPSAoQXJndW1lbnQ8VD4gfCBBcmdzPFQ+KVtdO1xuXG4gIC8qKiBTdWJzZXQgb2YgYGtleW9mIFRgIHdoaWNoIGFyZSBub3QgbWV0aG9kcyBvciBkZWZpbmVkIGJ5IGJhc2UgTW9kZWwgVS4gKiovXG4gIHR5cGUgRmllbGQ8VD4gPSBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPjtcblxuICAvKiogQW55IHZhbGlkIGtleSBmb3IgbW9kZWwsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gRmllbGQ8VD4uICovXG4gIHR5cGUgRXZlbnQ8VD4gPSBGaWVsZDxUPiB8IChzdHJpbmcgJiB7fSkgfCBudW1iZXIgfCBzeW1ib2w7XG5cbiAgLyoqIE9iamVjdCBvdmVybGF5IHRvIG92ZXJyaWRlIHZhbHVlcyBhbmQgbWV0aG9kcyBvbiBhIG1vZGVsLiAqL1xuICB0eXBlIEFzc2lnbjxUPiA9IHtcbiAgICBbSyBpbiBGaWVsZDxUPl0/OlxuICAgICAgVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIFxuICAgICAgICA/ICh0aGlzOiBULCAuLi5hcmdzOiBBKSA9PiBSXG4gICAgICAgIDogVFtLXTtcbiAgfSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeHBvcnQvSW1wb3J0IGNvbXBhdGlibGUgdmFsdWUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgaW4gYSBNb2RlbC4gKi9cbiAgdHlwZSBFeHBvcnQ8Uj4gPSBSIGV4dGVuZHMgeyBnZXQoKTogaW5mZXIgVCB9ID8gVCA6IFI7XG5cbiAgLyoqIFZhbHVlIGZvciBhIHByb3BlcnR5IG1hbmFnZWQgYnkgYSBtb2RlbC4gKi9cbiAgdHlwZSBWYWx1ZTxUIGV4dGVuZHMgTW9kZWwsIEsgZXh0ZW5kcyBFdmVudDxUPj4gPVxuICAgIEsgZXh0ZW5kcyBrZXlvZiBUID8gRXhwb3J0PFRbS10+IDogdW5rbm93bjtcblxuICB0eXBlIE9uRXZlbnQ8VCBleHRlbmRzIE1vZGVsPiA9XG4gICAgKHRoaXM6IFQsIGtleTogdW5rbm93biwgc291cmNlOiBUKSA9PiAoKCkgPT4gdm9pZCkgfCB2b2lkIHwgbnVsbDtcblxuICB0eXBlIE9uVXBkYXRlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgKHRoaXM6IFQsIGtleTogSywgdGhpc0FyZzogSykgPT4gdm9pZDtcblxuICAvKipcbiAgICogVmFsdWVzIGZyb20gY3VycmVudCBzdGF0ZSBvZiBnaXZlbiBtb2RlbC5cbiAgICogRGlmZmVycyBmcm9tIGBWYWx1ZXNgIGFzIHZhbHVlcyBoZXJlIHdpbGwgZHJpbGxcbiAgICogaW50byBcInJlYWxcIiB2YWx1ZXMgaGVsZCBieSBleG90aWNzIGxpa2UgcmVmLk9iamVjdC5cbiAgICovXG4gIHR5cGUgU3RhdGU8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XTogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIE9iamVjdCBjb21wZXJhYmxlIHRvIGRhdGEgZm91bmQgaW4gVC4gKi9cbiAgdHlwZSBWYWx1ZXM8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XT86IEV4cG9ydDxUW1BdPiB9O1xuXG4gIC8qKiBFeG90aWMgdmFsdWUsIHdoZXJlIGFjdHVhbCB2YWx1ZSBpcyBjb250YWluZWQgd2l0aGluLiAqL1xuICB0eXBlIFJlZjxUID0gYW55PiA9IHtcbiAgICAobmV4dDogVCk6IHZvaWQ7XG4gICAgY3VycmVudDogVCB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBzdWJzY3JpYmVkIHRvIHBhcmVudCBhbmQgdXBkYXRlcyB3aGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IHN0YXRlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgYSBwcm94eSB3aGljaCBkZXRlY3RzIHByb3BlcnRpZXMgd2hpY2hcbiAgICogd2hlcmUgYWNjZXNzZWQsIGFuZCB0aHVzIGRlcGVuZGVkIHVwb24gdG8gc3RheSBjdXJyZW50LlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIFNldCBvZiBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgY2hhbmdlZCwgYW5kIGV2ZW50cyBmaXJlZCwgc2luY2UgbGFzdCB1cGRhdGUuXG4gICAqIFxuICAgKiBAcmV0dXJucyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBlZmZlY3QgaXMgc3RhbGUuXG4gICAqL1xuICB0eXBlIEVmZmVjdDxUPiA9ICh0aGlzOiBULCBjdXJyZW50OiBULCB1cGRhdGU6IFNldDxFdmVudDxUPj4pID0+XG4gICAgRWZmZWN0Q2FsbGJhY2sgfCBQcm9taXNlPHZvaWQ+IHwgbnVsbCB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZWZmZWN0LiBXaWxsIGJlIGNhbGxlZCB3aGVuIGVmZmVjdCBpcyBzdGFsZS5cbiAgICogXG4gICAqIEBwYXJhbSB1cGRhdGUgLSBgdHJ1ZWAgaWYgdXBkYXRlIGlzIHBlbmRpbmcsIGBmYWxzZWAgZWZmZWN0IGhhcyBiZWVuIGNhbmNlbGxlZCwgYG51bGxgIGlmIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgRWZmZWN0Q2FsbGJhY2sgPSAoKHVwZGF0ZTogYm9vbGVhbiB8IG51bGwpID0+IHZvaWQpO1xuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBpbml0aWFsaXplciwgd2lsbCBydW4gdXBvbiBpbnN0YW5jZSBjcmVhdGlvbi5cbiAgICogT3B0aW9uYWwgcmV0dXJuZWQgY2FsbGJhY2sgd2lsbCBydW4gd2hlbiBvbmNlIHVwb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgdHlwZSBJbnN0cnVjdGlvbjxUID0gYW55LCBNIGV4dGVuZHMgTW9kZWwgPSBhbnk+ID1cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbGxvdyBmb3IgbnVtYmVycy9zeW1ib2wgcHJvcGVydGllcz9cbiAgICAodGhpczogTSwga2V5OiBFeHRyYWN0PEZpZWxkPE0+LCBzdHJpbmc+LCB0aGlzQXJnOiBNLCBzdGF0ZTogU3RhdGU8TT4pID0+XG4gICAgICBEZXNjcmlwdG9yPFQ+IHwgKChzb3VyY2U6IE0pID0+IFQpIHwgdm9pZDtcblxuICB0eXBlIEdldHRlcjxUPiA9IChzb3VyY2U6IE1vZGVsKSA9PiBUO1xuICB0eXBlIFNldHRlcjxUPiA9ICh2YWx1ZTogVCwgcHJldmlvdXM6IFQpID0+IGJvb2xlYW4gfCB2b2lkIHwgKCgpID0+IFQpO1xuXG4gIHR5cGUgRGVzY3JpcHRvcjxUID0gYW55PiA9IHtcbiAgICBnZXQ/OiBHZXR0ZXI8VD4gfCBib29sZWFuO1xuICAgIHNldD86IFNldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgZW51bWVyYWJsZT86IGJvb2xlYW47XG4gICAgdmFsdWU/OiBUO1xuICB9XG59XG5cbmludGVyZmFjZSBNb2RlbCB7XG4gIC8qKlxuICAgKiBMb29wYmFjayB0byBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGluIGEgc3Vic2NyaWJlZCBjb250ZXh0LFxuICAgKiB0byBrZWVwIHdyaXRlIGFjY2VzcyB0byBgdGhpc2AgYWZ0ZXIgYSBkZXN0cnVjdHVyZS4gWW91IGNhbiB1c2UgaXQgdG8gcmVhZCB2YXJpYWJsZXMgc2lsZW50bHkgYXMgd2VsbC5cbiAgICoqL1xuICBpczogdGhpcztcbn1cblxuYWJzdHJhY3QgY2xhc3MgTW9kZWwge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxsIGN1cnJlbnQgdmFsdWVzIGZyb20gc3RhdGUuIEZsYXR0ZW5zIGFsbCBtb2RlbHMgYW5kIGV4b3RpYyB2YWx1ZXMgcmVjdXJzaXZlbHkuXG4gICAqIFxuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhbGwgdmFsdWVzIGZyb20gdGhpcyBtb2RlbC5cbiAgICoqL1xuICBnZXQoKTogTW9kZWwuU3RhdGU8dGhpcz47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGVmZmVjdCBGdW5jdGlvbiB0byBydW4sIGFuZCBhZ2FpbiB3aGVuZXZlciBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiAgICAgICAgICAgICAgIElmIGVmZmVjdCByZXR1cm5zIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb2NjdXJzIChzeW5jcm9ub3VzbHkpLFxuICAgKiAgICAgICAgICAgICAgIGVmZmVjdCBpcyBjYW5jZWxsZWQsIG9yIHBhcmVudCBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldChlZmZlY3Q6IE1vZGVsLkVmZmVjdDx0aGlzPik6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIGdldCB2YWx1ZSBvZi5cbiAgICogQHBhcmFtIHJlcXVpcmVkIC0gSWYgdHJ1ZSwgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyBWYWx1ZSBvZiBwcm9wZXJ0eS5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgTW9kZWwuRXZlbnQ8dGhpcz4+KGtleTogVCwgcmVxdWlyZWQ/OiBib29sZWFuKTogTW9kZWwuVmFsdWU8dGhpcywgVD47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBNb2RlbC5FdmVudDx0aGlzPj4oa2V5OiBULCBjYWxsYmFjazogTW9kZWwuT25VcGRhdGU8dGhpcywgVD4pOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBjaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbW9kZWwgaXMgZXhwaXJlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBtb2RlbCBpcyB0byBiZSBkZXN0cm95ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG5cbiAgZ2V0KGFyZzE/OiBNb2RlbC5FZmZlY3Q8dGhpcz4gfCBzdHJpbmcgfCBudWxsLCBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uVXBkYXRlPHRoaXMsIGFueT4pe1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzLmlzO1xuXG4gICAgaWYodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKXtcbiAgICAgIGxldCBwZW5kaW5nID0gbmV3IFNldDxNb2RlbC5FdmVudDx0aGlzPj4oKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUVmZmVjdChzZWxmLCAocHJveHkpID0+IHtcbiAgICAgICAgY29uc3QgY2IgPSBhcmcxLmNhbGwocHJveHksIHByb3h5LCBwZW5kaW5nKTtcblxuICAgICAgICByZXR1cm4gY2IgPT09IG51bGwgPyBudWxsIDogKCh1cGRhdGUpID0+IHtcbiAgICAgICAgICBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldChzZWxmKSE7XG4gICAgICAgICAgaWYodHlwZW9mIGNiID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGNiKHVwZGF0ZSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXJnMSA9PT0gdW5kZWZpbmVkID8gc25hcHNob3Qoc2VsZikgOlxuICAgICAgdHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiID8gYWRkTGlzdGVuZXIoc2VsZiwgYXJnMiwgYXJnMSkgOlxuICAgICAgYXJnMSA9PT0gbnVsbCA/IE9iamVjdC5pc0Zyb3plbihTVEFURS5nZXQoc2VsZikpIDpcbiAgICAgIGZldGNoKHNlbGYsIGFyZzEsIGFyZzIpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIGB1bmRlZmluZWRgIGlmIHRoZXJlIG5vIHVwZGF0ZSBpcyBwZW5kaW5nLlxuICAgKiovXG4gIHNldCgpOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVXBkYXRlIG11bGl0cGxlIHByb3BlcnRpZXMgYXQgb25jZS4gTWVyZ2VzIGFyZ3VtZW50IHdpdGggY3VycmVudCBzdGF0ZS5cbiAgICogUHJvcGVydGllcyB3aGljaCBhcmUgbm90IG1hbmFnZWQgYnkgdGhpcyBtb2RlbCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gYXNzaWduIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBzaWxlbnQgLSBJZiBhbiB1cGRhdGUgZG9lcyBvY2N1ciwgbGlzdGVuZXJzIHdpbGwgbm90IGJlIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQsIGB1bmRlZmluZWRgIChpbW1lZGlhdGVseSkgaWYgYSBub29wLlxuICAgKi9cbiAgc2V0KGFzc2lnbj86IE1vZGVsLkFzc2lnbjx0aGlzPiwgc2lsZW50PzogYm9vbGVhbik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQdXNoIGFuIHVwZGF0ZS4gVGhpcyB3aWxsIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFzc29jaWF0ZWQgcHJvcGVydHkuXG4gICAqIFxuICAgKiBVc2VmdWwgd2hlcmUgYSBwcm9wZXJ0eSB2YWx1ZSBpbnRlcm5hbGx5IGhhcyBjaGFuZ2VkLCBidXQgdGhlIG9iamVjdCBpcyB0aGUgc2FtZS5cbiAgICogRm9yIGV4YW1wbGU6IEFuIGFycmF5IGhhcyBwdXNoZWQgYSBuZXcgdmFsdWUsIG9yIGEgbmVzdGVkIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgdG8gZGlzcGF0Y2ggYXJiaXRyYXJ5IGV2ZW50cy5cbiAgICogU3ltYm9scyBhcmUgcmVjb21tZW5kZWQgYXMgbm9uLXByb3BlcnR5IGV2ZW50cywgaG93ZXZlciB5b3UgY2FuIHVzZSBhbnkgc3RyaW5nLlxuICAgKiBJZiBkb2luZyBzbywgYmUgc3VyZSB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggcHJvcGVydHkgbmFtZXMhIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXNcbiAgICogdG8gcHJlZml4IGFuIGV2ZW50IHdpdGggXCIhXCIgYW5kL29yIHVzZSBkYXNoLWNhc2UuIGUuZy4gYHNldChcIiFldmVudFwiKWAgb3IgYHNldChcIm15LWV2ZW50XCIpYC5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSBvciBldmVudCB0byBkaXNwYXRjaC5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQuXG4gICAqL1xuICBzZXQoa2V5OiBNb2RlbC5FdmVudDx0aGlzPik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+O1xuXG4gIC8qKlxuICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBcbiAgICogR2l2ZW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBhc3NpZ25tZW50ICh3aGljaCBjaGFuZ2VzIHZhbHVlKSBvciBleHBsaWNpdCBgc2V0YC5cbiAgICogXG4gICAqIFRvIHJ1biBsb2dpYyBvbiBmaW5hbCB2YWx1ZSBvbmx5LCBjYWxsYmFjayBtYXkgcmV0dXJuIGEgZnVuY3Rpb24uIFVzaW5nIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gcmVtb3ZlIGxpc3RlbmVyLiBXaWxsIHJldHVybiBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiBpbmFjdGl2ZSBhbHJlYWR5LlxuICAgKiBcbiAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+KTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBVbmxpa2UgYGdldGAsIHRoaXMgY2Fsc2wgc3luY2hyb25vdXNseSBhbmQgd2lsbCBmaXJlIGFzIG1hbnkgdGltZXMgYXMgdGhlIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsLCBjYWxsYmFjazogTW9kZWwuT25FdmVudDx0aGlzPik6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlY2xhcmUgYW4gZW5kIHRvIHVwZGF0ZXMuIFRoaXMgZXZlbnQgaXMgZmluYWwgYW5kIHdpbGwgZnJlZXplIHN0YXRlLlxuICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB3YXRjaGVkIGZvciBhcyB3ZWxsLCB0byBydW4gY2xlYW51cCBsb2dpYyBhbmQgaW50ZXJuYWxseSB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBlbmQgdXBkYXRlcy5cbiAgICovXG4gIHNldChzdGF0dXM6IG51bGwpOiB2b2lkO1xuXG4gIHNldChcbiAgICBhcmcxPzogTW9kZWwuT25FdmVudDx0aGlzPiB8IE1vZGVsLkFzc2lnbjx0aGlzPiB8IE1vZGVsLkV2ZW50PHRoaXM+IHwgbnVsbCxcbiAgICBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uRXZlbnQ8dGhpcz4pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYodHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG4gICAgICBcbiAgICBpZih0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYoa2V5ID09PSBhcmcxKVxuICAgICAgICAgIHJldHVybiBhcmcyLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pO1xuXG4gICAgaWYoYXJnMSAmJiB0eXBlb2YgYXJnMSA9PSBcIm9iamVjdFwiKVxuICAgICAgYXNzaWduKHNlbGYsIGFyZzEsIGFyZzIgPT09IHRydWUpO1xuICAgIGVsc2VcbiAgICAgIGV2ZW50KHNlbGYsIGFyZzEpO1xuXG4gICAgcmV0dXJuIHBlbmRpbmcoc2VsZik7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIG1hbmFnZWQgcHJvcGVydGllcyBpbiB0aGlzIGluc3RhbmNlIG9mIE1vZGVsLlxuICAgKiBZZWlsZHMgdGhlIGtleSBhbmQgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFtzdHJpbmcsIHVua25vd25dPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKFNUQVRFLmdldCh0aGlzLmlzKSEpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFjdGl2YXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuXG4gICAqIFxuICAgKiAqKkltcG9ydGFudCoqIC0gVW5saWtlIGBuZXcgdGhpcyguLi4pYCAtIHRoaXMgbWV0aG9kIGFsc28gYWN0aXZhdGVzIHN0YXRlLlxuICAgKiBcbiAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgc2VudCB0byBjb25zdHJ1Y3RvclxuICAgKi9cbiAgc3RhdGljIG5ldzxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLkluaXQ8VD4sIC4uLmFyZ3M6IE1vZGVsLkFyZ3M8VD4pe1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgZXZlbnQoaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgZXF1aXZhbGVudCBvZiBgeCBpbnN0YW5jZW9mIHRoaXNgLlxuICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICogSWYgc28sIGxhbmd1YWdlIHNlcnZlciB3aWxsIG1ha2UgYXZhaWxhYmxlIGFsbCBzdGF0aWNcbiAgICogbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGlzPFQgZXh0ZW5kcyBNb2RlbC5UeXBlPih0aGlzOiBULCBtYXliZTogdW5rbm93bik6IG1heWJlIGlzIFQge1xuICAgIHJldHVybiBtYXliZSA9PT0gdGhpcyB8fCB0eXBlb2YgbWF5YmUgPT0gXCJmdW5jdGlvblwiICYmIG1heWJlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBydW4gd2hlbiBhbnkgaW5zdGFuY2Ugb2YgdGhpcyBNb2RlbCBpcyB1cGRhdGVkLiBcbiAgICovXG4gIHN0YXRpYyBvbjxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLlR5cGU8VD4sIGxpc3RlbmVyOiBNb2RlbC5PbkV2ZW50PFQ+KXtcbiAgICBsZXQgbm90aWZ5ID0gTk9USUZZLmdldCh0aGlzKTtcblxuICAgIGlmKCFub3RpZnkpXG4gICAgICBOT1RJRlkuc2V0KHRoaXMsIG5vdGlmeSA9IG5ldyBTZXQpO1xuXG4gICAgbm90aWZ5LmFkZChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gbm90aWZ5LmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVmaW5lKE1vZGVsLnByb3RvdHlwZSwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIElELmdldCh0aGlzLmlzKTtcbiAgfVxufSk7XG5cbmRlZmluZShNb2RlbCwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGFzc2lnbihzdWJqZWN0OiBNb2RlbCwgZGF0YTogTW9kZWwuQXNzaWduPE1vZGVsPiwgc2lsZW50PzogYm9vbGVhbil7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChzdWJqZWN0LmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGUpITtcbiAgICBcbiAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICBjb25zdCBiaW5kID0gbWV0aG9kcy5nZXQoa2V5KTtcblxuICAgIGlmKGJpbmQpXG4gICAgICBiaW5kLmNhbGwoc3ViamVjdCwgZGF0YVtrZXldKTtcbiAgICBlbHNlIGlmKGtleSBpbiBzdWJqZWN0ICYmIGtleSAhPT0gXCJpc1wiKXtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN1YmplY3QsIGtleSkhO1xuICAgICAgY29uc3Qgc2V0ID0gZGVzYyAmJiBkZXNjLnNldCBhcyAodmFsdWU6IGFueSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcblxuICAgICAgc2V0LmNhbGwoc3ViamVjdCwgZGF0YVtrZXldLCBzaWxlbnQgPT09IHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQXBwbHkgaW5zdHJ1Y3Rpb25zIGFuZCBpbmhlcml0ZWQgZXZlbnQgbGlzdGVuZXJzLiBFbnN1cmUgY2xhc3MgbWV0YWRhdGEgaXMgcmVhZHkuICovXG5mdW5jdGlvbiBwcmVwYXJlKG1vZGVsOiBNb2RlbCl7XG4gIGxldCBUID0gbW9kZWwuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZTtcblxuICBpZihUID09PSBNb2RlbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGJhc2UgTW9kZWwuXCIpO1xuXG4gIGNvbnN0IGNoYWluID0gW10gYXMgTW9kZWwuVHlwZVtdO1xuICBsZXQga2V5cyA9IG5ldyBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4oKTtcblxuICBJRC5zZXQobW9kZWwsIGAke1R9LSR7dWlkKCl9YCk7XG5cbiAgd2hpbGUoVC5uYW1lKXtcbiAgICBmb3IoY29uc3QgY2Igb2YgTk9USUZZLmdldChUKSB8fCBbXSlcbiAgICAgIGFkZExpc3RlbmVyKG1vZGVsLCBjYik7XG5cbiAgICBpZihUID09PSBNb2RlbCkgYnJlYWs7XG4gICAgZWxzZSBjaGFpbi51bnNoaWZ0KFQpO1xuXG4gICAgVCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihUKVxuICB9XG5cbiAgZm9yKGNvbnN0IHR5cGUgb2YgY2hhaW4pe1xuICAgIGlmKE1FVEhPRFMuaGFzKHR5cGUpKXtcbiAgICAgIGtleXMgPSBNRVRIT0RTLmdldCh0eXBlKSE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBNRVRIT0RTLnNldCh0eXBlLCBrZXlzID0gbmV3IE1hcChrZXlzKSk7XG5cbiAgICBmb3IoY29uc3QgW2tleSwgeyB2YWx1ZSB9XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHR5cGUucHJvdG90eXBlKVxuICAgICkpe1xuICAgICAgaWYoIXZhbHVlIHx8IGtleSA9PSBcImNvbnN0cnVjdG9yXCIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICBmdW5jdGlvbiBiaW5kKHRoaXM6IE1vZGVsLCBvcmlnaW5hbD86IEZ1bmN0aW9uKXtcbiAgICAgICAgY29uc3QgeyBpcyB9ID0gdGhpcztcblxuICAgICAgICBpZihpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFvcmlnaW5hbClcbiAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgRnVuY3Rpb247XG5cbiAgICAgICAgY29uc3QgZm4gPSBvcmlnaW5hbCB8fCB2YWx1ZTtcbiAgICAgICAgY29uc3QgYm91bmQgPSBmbi5iaW5kKGlzKTtcbiAgICAgICAgXG4gICAgICAgIE1FVEhPRC5zZXQoYm91bmQsIGZuKTtcbiAgICAgICAgZGVmaW5lKGlzLCBrZXksIHsgdmFsdWU6IGJvdW5kLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICAgIH1cblxuICAgICAga2V5cy5zZXQoa2V5LCBiaW5kKTtcbiAgICAgIGRlZmluZSh0eXBlLnByb3RvdHlwZSwga2V5LCB7IGdldDogYmluZCwgc2V0OiBiaW5kIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwcGx5IG1vZGVsIGFyZ3VlbW50cywgcnVuIGNhbGxiYWNrcyBhbmQgb2JzZXJ2ZSBwcm9wZXJ0aWVzLlxuICogQWNjdW11bGF0ZSBhbmQgaGFuZGxlIGNsZWFudXAgZXZlbnRzLlxuICoqL1xuZnVuY3Rpb24gaW5pdChtb2RlbDogTW9kZWwsIGFyZ3M6IE1vZGVsLkFyZ3Mpe1xuICBjb25zdCBzdGF0ZSA9IHt9IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gIFNUQVRFLnNldChtb2RlbCwgc3RhdGUpO1xuXG4gIGFyZ3MgPSBhcmdzLmZsYXQoKS5maWx0ZXIoYXJnID0+IHtcbiAgICBpZih0eXBlb2YgYXJnICE9IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIElELnNldChtb2RlbCwgYXJnKTtcbiAgfSk7XG5cbiAgYWRkTGlzdGVuZXIobW9kZWwsICgpID0+IHtcbiAgICBpZighUEFSRU5ULmhhcyhtb2RlbCkpXG4gICAgICBQQVJFTlQuc2V0KG1vZGVsLCBudWxsKTtcblxuICAgIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuXG4gICAgICBpZihcInZhbHVlXCIgaW4gZGVzYyl7XG4gICAgICAgIGZ1bmN0aW9uIHNldCh2YWx1ZTogdW5rbm93biwgc2lsZW50PzogYm9vbGVhbil7XG4gICAgICAgICAgdXBkYXRlKG1vZGVsLCBrZXksIHZhbHVlLCBzaWxlbnQpO1xuICAgICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgIVBBUkVOVC5oYXModmFsdWUpKXtcbiAgICAgICAgICAgIFBBUkVOVC5zZXQodmFsdWUsIG1vZGVsKTtcbiAgICAgICAgICAgIGV2ZW50KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXQoZGVzYy52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGRlZmluZShtb2RlbCwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzZXQsXG4gICAgICAgICAgZ2V0KCl7XG4gICAgICAgICAgICByZXR1cm4gd2F0Y2godGhpcywga2V5LCBzdGF0ZVtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBhcmdzLmZvckVhY2goKGFyZykgPT4ge1xuICAgICAgY29uc3QgdXNlID0gdHlwZW9mIGFyZyA9PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBhcmcuY2FsbChtb2RlbCwgbW9kZWwpXG4gICAgICAgIDogYXJnIGFzIE1vZGVsLkFzc2lnbjxNb2RlbD47XG5cbiAgICAgIGlmKHVzZSBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgIHVzZS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFzeW5jIGVycm9yIGluIGNvbnN0cnVjdG9yIGZvciAke21vZGVsfTpgKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgYWRkTGlzdGVuZXIobW9kZWwsIHVzZSwgbnVsbClcbiAgICAgIGVsc2UgaWYodHlwZW9mIHVzZSA9PSBcIm9iamVjdFwiKVxuICAgICAgICBhc3NpZ24obW9kZWwsIHVzZSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgICAgZm9yKGNvbnN0IFtfLCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IG1vZGVsKVxuICAgICAgICAgIHZhbHVlLnNldChudWxsKTtcbiAgXG4gICAgICBPYmplY3QuZnJlZXplKHN0YXRlKTtcbiAgICB9LCBudWxsKTtcbiAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmZXRjaChzdWJqZWN0OiBNb2RlbCwgcHJvcGVydHk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuICBcbiAgaWYocHJvcGVydHkgaW4gc3RhdGUgfHwgcmVxdWlyZWQgPT09IGZhbHNlKXtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3ViamVjdH0uJHtwcm9wZXJ0eX0gaXMgbm90IHlldCBhdmFpbGFibGUuYCk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBrZXkgPT4ge1xuICAgICAgaWYoa2V5ID09PSBwcm9wZXJ0eSl7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihrZXkgPT09IG51bGwpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gIH0pO1xufVxuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgbW9kZWxzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gc25hcHNob3Q8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCk6IE1vZGVsLlN0YXRlPFQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge30gYXMgYW55O1xuICBsZXQgaXNOb3RSZWN1cnNpdmU7XG5cbiAgaWYoIUVYUE9SVCl7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1ttb2RlbCwgdmFsdWVzXV0pO1xuICB9XG5cbiAgZm9yKGxldCBba2V5LCB2YWx1ZV0gb2YgbW9kZWwpe1xuICAgIGlmKEVYUE9SVC5oYXModmFsdWUpKVxuICAgICAgdmFsdWUgPSBFWFBPUlQuZ2V0KHZhbHVlKTtcbiAgICBlbHNlIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIFwiZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgRVhQT1JULnNldCh2YWx1ZSwgdmFsdWUgPSB2YWx1ZS5nZXQoKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYoaXNOb3RSZWN1cnNpdmUpXG4gICAgRVhQT1JUID0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZTxUPihcbiAgc3ViamVjdDogTW9kZWwsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICB2YWx1ZTogVCxcbiAgYXJnPzogYm9vbGVhbiB8IE1vZGVsLlNldHRlcjxUPil7XG5cbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKE9iamVjdC5pc0Zyb3plbihzdGF0ZSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1cGRhdGUgJHtTdHJpbmcoa2V5KX0gYnV0ICR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiKXtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdmFsdWUgPSBvdXQoKTtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSBwcmV2aW91cyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBzdGF0ZVtrZXldID0gdmFsdWU7XG5cbiAgaWYoYXJnICE9PSB0cnVlKVxuICAgIGV2ZW50KHN1YmplY3QsIGtleSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBSYW5kb20gYWxwaGFudW1iZXJpYyBvZiBsZW5ndGggNjsgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbGV0dGVyLiAqL1xuZnVuY3Rpb24gdWlkKCl7XG4gIHJldHVybiAoMC4yNzggKyBNYXRoLnJhbmRvbSgpICogMC43MjIpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCkudG9VcHBlckNhc2UoKTtcbn1cblxuZXhwb3J0IHtcbiAgZXZlbnQsXG4gIGZldGNoLFxuICBNRVRIT0QsXG4gIE1vZGVsLFxuICBQQVJFTlQsXG4gIFNUQVRFLFxuICB1aWQsXG4gIHVwZGF0ZSxcbn0iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLGFBQWEsY0FBYyxPQUFpQixTQUFTLGNBQWMsYUFBYTtBQUV6RixNQUFNLFNBQVMsT0FBTztBQUd0QixNQUFNLEtBQUssb0JBQUksUUFBdUI7QUFHdEMsTUFBTSxRQUFRLG9CQUFJLFFBQTBEO0FBRzVFLE1BQU0sU0FBUyxvQkFBSSxRQUFtQztBQUd0RCxNQUFNLFNBQVMsb0JBQUksUUFBNkI7QUFHaEQsTUFBTSxVQUFVLG9CQUFJLFFBQXVEO0FBRzNFLE1BQU0sU0FBUyxvQkFBSSxRQUFrQjtBQW1IckMsTUFBZSxNQUFNO0FBQUEsRUFDbkIsZUFBZSxNQUFpQjtBQUM5QixZQUFRLElBQUk7QUFDWixXQUFPLE1BQU0sTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ2xDLFNBQUssTUFBTSxJQUFJO0FBQUEsRUFDakI7QUFBQSxFQXFEQSxJQUFJLE1BQTJDLE1BQTJDO0FBQ3hGLFVBQU0sT0FBTyxLQUFLO0FBRWxCLFFBQUcsT0FBTyxRQUFRLFlBQVc7QUFDM0IsVUFBSUEsV0FBVSxvQkFBSSxJQUF1QjtBQUV6QyxhQUFPLGFBQWEsTUFBTSxDQUFDLFVBQVU7QUFDbkMsY0FBTSxLQUFLLEtBQUssS0FBSyxPQUFPLE9BQU9BLFFBQU87QUFFMUMsZUFBTyxPQUFPLE9BQU8sT0FBUSxDQUFDQyxZQUFXO0FBQ3ZDLFVBQUFELFdBQVUsYUFBYSxJQUFJLElBQUk7QUFDL0IsY0FBRyxPQUFPLE1BQU07QUFDZCxlQUFHQyxPQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUNFLFNBQVMsU0FBWSxTQUFTLElBQUksSUFDbEMsT0FBTyxRQUFRLGFBQWEsWUFBWSxNQUFNLE1BQU0sSUFBSSxJQUN4RCxTQUFTLE9BQU8sT0FBTyxTQUFTLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFDL0MsTUFB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
309
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT2JzZXJ2YWJsZSwgT25VcGRhdGUsIFBFTkRJTkdfS0VZUyB9IGZyb20gJy4vY29udHJvbCc7XG5cbmNvbnN0IGRlZmluZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLyoqIFJlZ2lzdGVyIGZvciBhbGwgYWN0aXZlIG1vZGVscyB2aWEgc3RyaW5nIGlkZW50aWZpZXJzICh1c3VhbGx5IHVuaXF1ZSkuICovXG5jb25zdCBJRCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBzdHJpbmc+KCk7XG5cbi8qKiBJbnRlcm5hbCBzdGF0ZSBhc3NpZ25lZCB0byBtb2RlbHMuICovXG5jb25zdCBTVEFURSA9IG5ldyBXZWFrTWFwPE1vZGVsLCBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPj4oKTtcblxuLyoqIEV4dGVybmFsIGxpc3RlbmVycyBmb3IgYW55IGdpdmVuIE1vZGVsLiAqL1xuY29uc3QgTk9USUZZID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgU2V0PE9uVXBkYXRlPj4oKTtcblxuLyoqIFBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLiAqL1xuY29uc3QgUEFSRU5UID0gbmV3IFdlYWtNYXA8TW9kZWwsIE1vZGVsIHwgbnVsbD4oKTtcblxuLyoqIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGJ5IGEgZ2l2ZW4gdHlwZS4gKi9cbmNvbnN0IE1FVEhPRFMgPSBuZXcgV2Vha01hcDxNb2RlbC5UeXBlLCBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4+KCk7XG5cbi8qKiBSZWZlcmVuY2UgYm91bmQgaW5zdGFuY2UgbWV0aG9kcyB0byByZWFsIG9uZXMuICovXG5jb25zdCBNRVRIT0QgPSBuZXcgV2Vha01hcDxhbnksIGFueT4oKTtcblxuZGVjbGFyZSBuYW1lc3BhY2UgTW9kZWwge1xuICAvKiogQW55IHR5cGUgb2YgTW9kZWwsIHVzaW5nIG93biBjbGFzcyBjb25zdHJ1Y3RvciBhcyBpdHMgaWRlbnRpZmllci4gKi9cbiAgdHlwZSBUeXBlPFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpICYgdHlwZW9mIE1vZGVsO1xuXG4gIC8qKiBBIE1vZGVsIGNvbnN0cnVjdG9yLCBidXQgd2hpY2ggaXMgbm90IGFic3RyYWN0LiAqL1xuICB0eXBlIEluaXQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAobmV3ICguLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KSA9PiBUKSAmIE9taXQ8dHlwZW9mIE1vZGVsLCBuZXZlcj47XG5cbiAgLyoqXG4gICAqIE1vZGVsIGNvbnN0cnVjdG9yIGNhbGxiYWNrIC0gaXMgY2FsbGVkIHdoZW4gTW9kZWwgZmluaXNoZXMgaW50aWFsaXppbmcuXG4gICAqIFJldHVybmVkIGZ1bmN0aW9uIHdpbGwgcnVuIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBDYWxsYmFjazxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgICh0aGlzOiBULCB0aGlzQXJnOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgKCgpID0+IHZvaWQpIHwgQXNzaWduPFQ+IHwgdm9pZDtcblxuICAvKiogTW9kZWwgY29uc3RydWN0b3IgYXJndW1lbnQgKi9cbiAgdHlwZSBBcmd1bWVudDxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPSBBc3NpZ248VD4gfCBDYWxsYmFjazxUPiB8IHN0cmluZyB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAqL1xuICB0eXBlIEFyZ3M8VCBleHRlbmRzIE1vZGVsID0gYW55PiA9IChBcmd1bWVudDxUPiB8IEFyZ3M8VD4pW107XG5cbiAgLyoqIFN1YnNldCBvZiBga2V5b2YgVGAgd2hpY2ggYXJlIG5vdCBtZXRob2RzIG9yIGRlZmluZWQgYnkgYmFzZSBNb2RlbCBVLiAqKi9cbiAgdHlwZSBGaWVsZDxUPiA9IEV4Y2x1ZGU8a2V5b2YgVCwga2V5b2YgTW9kZWw+O1xuXG4gIC8qKiBBbnkgdmFsaWQga2V5IGZvciBtb2RlbCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBGaWVsZDxUPi4gKi9cbiAgdHlwZSBFdmVudDxUPiA9IEZpZWxkPFQ+IHwgKHN0cmluZyAmIHt9KSB8IG51bWJlciB8IHN5bWJvbDtcblxuICAvKiogT2JqZWN0IG92ZXJsYXkgdG8gb3ZlcnJpZGUgdmFsdWVzIGFuZCBtZXRob2RzIG9uIGEgbW9kZWwuICovXG4gIHR5cGUgQXNzaWduPFQ+ID0ge1xuICAgIFtLIGluIEZpZWxkPFQ+XT86XG4gICAgICBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgXG4gICAgICAgID8gKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgICAgOiBUW0tdO1xuICB9ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4cG9ydC9JbXBvcnQgY29tcGF0aWJsZSB2YWx1ZSBmb3IgYSBnaXZlbiBwcm9wZXJ0eSBpbiBhIE1vZGVsLiAqL1xuICB0eXBlIEV4cG9ydDxSPiA9IFIgZXh0ZW5kcyB7IGdldCgpOiBpbmZlciBUIH0gPyBUIDogUjtcblxuICAvKiogVmFsdWUgZm9yIGEgcHJvcGVydHkgbWFuYWdlZCBieSBhIG1vZGVsLiAqL1xuICB0eXBlIFZhbHVlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgSyBleHRlbmRzIGtleW9mIFQgPyBFeHBvcnQ8VFtLXT4gOiB1bmtub3duO1xuXG4gIHR5cGUgT25FdmVudDxUIGV4dGVuZHMgTW9kZWw+ID1cbiAgICAodGhpczogVCwga2V5OiB1bmtub3duLCBzb3VyY2U6IFQpID0+ICgoKSA9PiB2b2lkKSB8IHZvaWQgfCBudWxsO1xuXG4gIHR5cGUgT25VcGRhdGU8VCBleHRlbmRzIE1vZGVsLCBLIGV4dGVuZHMgRXZlbnQ8VD4+ID1cbiAgICAodGhpczogVCwga2V5OiBLLCB0aGlzQXJnOiBLKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgZnJvbSBjdXJyZW50IHN0YXRlIG9mIGdpdmVuIG1vZGVsLlxuICAgKiBEaWZmZXJzIGZyb20gYFZhbHVlc2AgYXMgdmFsdWVzIGhlcmUgd2lsbCBkcmlsbFxuICAgKiBpbnRvIFwicmVhbFwiIHZhbHVlcyBoZWxkIGJ5IGV4b3RpY3MgbGlrZSByZWYuT2JqZWN0LlxuICAgKi9cbiAgdHlwZSBTdGF0ZTxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dOiBFeHBvcnQ8VFtQXT4gfTtcblxuICAvKiogT2JqZWN0IGNvbXBlcmFibGUgdG8gZGF0YSBmb3VuZCBpbiBULiAqL1xuICB0eXBlIFZhbHVlczxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dPzogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIEV4b3RpYyB2YWx1ZSwgd2hlcmUgYWN0dWFsIHZhbHVlIGlzIGNvbnRhaW5lZCB3aXRoaW4uICovXG4gIHR5cGUgUmVmPFQgPSBhbnk+ID0ge1xuICAgIChuZXh0OiBUKTogdm9pZDtcbiAgICBjdXJyZW50OiBUIHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIHN1YnNjcmliZWQgdG8gcGFyZW50IGFuZCB1cGRhdGVzIHdoZW4gYWNjZXNzZWQgcHJvcGVydGllcyBjaGFuZ2UuXG4gICAqIFxuICAgKiBAcGFyYW0gY3VycmVudCAtIEN1cnJlbnQgc3RhdGUgb2YgdGhpcyBtb2RlbC4gVGhpcyBpcyBhIHByb3h5IHdoaWNoIGRldGVjdHMgcHJvcGVydGllcyB3aGljaFxuICAgKiB3aGVyZSBhY2Nlc3NlZCwgYW5kIHRodXMgZGVwZW5kZWQgdXBvbiB0byBzdGF5IGN1cnJlbnQuXG4gICAqIFxuICAgKiBAcGFyYW0gdXBkYXRlIC0gU2V0IG9mIHByb3BlcnRpZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkLCBhbmQgZXZlbnRzIGZpcmVkLCBzaW5jZSBsYXN0IHVwZGF0ZS5cbiAgICogXG4gICAqIEByZXR1cm5zIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGVmZmVjdCBpcyBzdGFsZS5cbiAgICovXG4gIHR5cGUgRWZmZWN0PFQ+ID0gKHRoaXM6IFQsIGN1cnJlbnQ6IFQsIHVwZGF0ZTogU2V0PEV2ZW50PFQ+PikgPT5cbiAgICBFZmZlY3RDYWxsYmFjayB8IFByb21pc2U8dm9pZD4gfCBudWxsIHwgdm9pZDtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5lZCBieSBlZmZlY3QuIFdpbGwgYmUgY2FsbGVkIHdoZW4gZWZmZWN0IGlzIHN0YWxlLlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIGB0cnVlYCBpZiB1cGRhdGUgaXMgcGVuZGluZywgYGZhbHNlYCBlZmZlY3QgaGFzIGJlZW4gY2FuY2VsbGVkLCBgbnVsbGAgaWYgbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBFZmZlY3RDYWxsYmFjayA9ICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCk7XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IGluaXRpYWxpemVyLCB3aWxsIHJ1biB1cG9uIGluc3RhbmNlIGNyZWF0aW9uLlxuICAgKiBPcHRpb25hbCByZXR1cm5lZCBjYWxsYmFjayB3aWxsIHJ1biB3aGVuIG9uY2UgdXBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICB0eXBlIEluc3RydWN0aW9uPFQgPSBhbnksIE0gZXh0ZW5kcyBNb2RlbCA9IGFueT4gPVxuICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGFsbG93IGZvciBudW1iZXJzL3N5bWJvbCBwcm9wZXJ0aWVzP1xuICAgICh0aGlzOiBNLCBrZXk6IEV4dHJhY3Q8RmllbGQ8TT4sIHN0cmluZz4sIHRoaXNBcmc6IE0sIHN0YXRlOiBTdGF0ZTxNPikgPT5cbiAgICAgIERlc2NyaXB0b3I8VD4gfCAoKHNvdXJjZTogTSkgPT4gVCkgfCB2b2lkO1xuXG4gIHR5cGUgR2V0dGVyPFQ+ID0gKHNvdXJjZTogTW9kZWwpID0+IFQ7XG4gIHR5cGUgU2V0dGVyPFQ+ID0gKHZhbHVlOiBULCBwcmV2aW91czogVCkgPT4gYm9vbGVhbiB8IHZvaWQgfCAoKCkgPT4gVCk7XG5cbiAgdHlwZSBEZXNjcmlwdG9yPFQgPSBhbnk+ID0ge1xuICAgIGdldD86IEdldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgc2V0PzogU2V0dGVyPFQ+IHwgYm9vbGVhbjtcbiAgICBlbnVtZXJhYmxlPzogYm9vbGVhbjtcbiAgICB2YWx1ZT86IFQ7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1vZGVsIHtcbiAgLyoqXG4gICAqIExvb3BiYWNrIHRvIGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaW4gYSBzdWJzY3JpYmVkIGNvbnRleHQsXG4gICAqIHRvIGtlZXAgd3JpdGUgYWNjZXNzIHRvIGB0aGlzYCBhZnRlciBhIGRlc3RydWN0dXJlLiBZb3UgY2FuIHVzZSBpdCB0byByZWFkIHZhcmlhYmxlcyBzaWxlbnRseSBhcyB3ZWxsLlxuICAgKiovXG4gIGlzOiB0aGlzO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBNb2RlbCBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIFtPYnNlcnZhYmxlXShjYWxsYmFjazogT2JzZXJ2YWJsZS5DYWxsYmFjaywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgICBjb25zdCB3YXRjaCA9IG5ldyBTZXQ8TW9kZWwuRXZlbnQ8dGhpcz4+KCk7XG4gICAgY29uc3QgcHJveHkgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIFxuICAgIGFkZExpc3RlbmVyKHRoaXMsICgpID0+IHZvaWQgY2FsbGJhY2soKSwgd2F0Y2gpO1xuXG4gICAgT0JTRVJWRVIuc2V0KHByb3h5LCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCAmJiByZXF1aXJlZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9LiR7a2V5fSBpcyByZXF1aXJlZCBpbiB0aGlzIGNvbnRleHQuYCk7XG5cbiAgICAgIHdhdGNoLmFkZChrZXkpO1xuXG4gICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYnNlcnZhYmxlIGluIHZhbHVlKVxuICAgICAgICByZXR1cm4gdmFsdWVbT2JzZXJ2YWJsZV0oY2FsbGJhY2ssIHJlcXVpcmVkKTtcblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3h5IGFzIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUHVsbCBjdXJyZW50IHZhbHVlcyBmcm9tIHN0YXRlLiBGbGF0dGVucyBhbGwgbW9kZWxzIGFuZCBleG90aWMgdmFsdWVzIHJlY3Vyc2l2ZWx5LlxuICAgKiBcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggYWxsIHZhbHVlcyBmcm9tIHRoaXMgbW9kZWwuXG4gICAqKi9cbiAgZ2V0KCk6IE1vZGVsLlN0YXRlPHRoaXM+O1xuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIHJ1biBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzZWQgdmFsdWVzIGNoYW5nZS5cbiAgICogXG4gICAqIEBwYXJhbSBlZmZlY3QgRnVuY3Rpb24gdG8gcnVuLCBhbmQgYWdhaW4gd2hlbmV2ZXIgYWNjZXNzZWQgdmFsdWVzIGNoYW5nZS5cbiAgICogICAgICAgICAgICAgICBJZiBlZmZlY3QgcmV0dXJucyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgY2hhbmdlIG9jY3VycyAoc3luY3Jvbm91c2x5KSxcbiAgICogICAgICAgICAgICAgICBlZmZlY3QgaXMgY2FuY2VsbGVkLCBvciBwYXJlbnQgbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQoZWZmZWN0OiBNb2RlbC5FZmZlY3Q8dGhpcz4pOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXQgdmFsdWUgb2YgYSBwcm9wZXJ0eS5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSB0byBnZXQgdmFsdWUgb2YuXG4gICAqIEBwYXJhbSByZXF1aXJlZCAtIElmIHRydWUsIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS5cbiAgICogQHJldHVybnMgVmFsdWUgb2YgcHJvcGVydHkuXG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIE1vZGVsLkV2ZW50PHRoaXM+PihrZXk6IFQsIHJlcXVpcmVkPzogYm9vbGVhbik6IE1vZGVsLlZhbHVlPHRoaXMsIFQ+O1xuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aGVuIGEgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSB0byB3YXRjaCBmb3IgdXBkYXRlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgTW9kZWwuRXZlbnQ8dGhpcz4+KGtleTogVCwgY2FsbGJhY2s6IE1vZGVsLk9uVXBkYXRlPHRoaXMsIFQ+KTogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgbW9kZWwgaXMgZXhwaXJlZC5cbiAgICogXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBgbnVsbGAgdG8gY2hlY2sgaWYgbW9kZWwgaXMgZXhwaXJlZC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIG1vZGVsIGlzIGV4cGlyZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0KHN0YXR1czogbnVsbCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gbW9kZWwgaXMgdG8gYmUgZGVzdHJveWVkLlxuICAgKiBcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0KHN0YXR1czogbnVsbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuXG4gIGdldChhcmcxPzogTW9kZWwuRWZmZWN0PHRoaXM+IHwgc3RyaW5nIHwgbnVsbCwgYXJnMj86IGJvb2xlYW4gfCBNb2RlbC5PblVwZGF0ZTx0aGlzLCBhbnk+KXtcbiAgICBjb25zdCBzZWxmID0gdGhpcy5pcztcblxuICAgIGlmKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIil7XG4gICAgICBsZXQgcGVuZGluZyA9IG5ldyBTZXQ8TW9kZWwuRXZlbnQ8dGhpcz4+KCk7XG5cbiAgICAgIHJldHVybiBjcmVhdGVFZmZlY3Qoc2VsZiwgKHByb3h5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNiID0gYXJnMS5jYWxsKHByb3h5LCBwcm94eSwgcGVuZGluZyk7XG5cbiAgICAgICAgcmV0dXJuIGNiID09PSBudWxsID8gbnVsbCA6ICgodXBkYXRlKSA9PiB7XG4gICAgICAgICAgcGVuZGluZyA9IFBFTkRJTkdfS0VZUy5nZXQoc2VsZikhO1xuICAgICAgICAgIGlmKHR5cGVvZiBjYiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBjYih1cGRhdGUpO1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGFyZzEgPT09IHVuZGVmaW5lZCA/IHNuYXBzaG90KHNlbGYpIDpcbiAgICAgIHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIiA/IGFkZExpc3RlbmVyKHNlbGYsIGFyZzIsIGFyZzEpIDpcbiAgICAgIGFyZzEgPT09IG51bGwgPyBPYmplY3QuaXNGcm96ZW4oU1RBVEUuZ2V0KHNlbGYpKSA6XG4gICAgICBmZXRjaChzZWxmLCBhcmcxLCBhcmcyKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXBkYXRlIGluIHByb2dyZXNzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIG9iamVjdCB3aXRoIHVwZGF0ZWQgdmFsdWVzLCBgdW5kZWZpbmVkYCBpZiB0aGVyZSBubyB1cGRhdGUgaXMgcGVuZGluZy5cbiAgICoqL1xuICBzZXQoKTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtdWxpdHBsZSBwcm9wZXJ0aWVzIGF0IG9uY2UuIE1lcmdlcyBhcmd1bWVudCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gICAqIFByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgbW9kZWwgd2lsbCBiZSBpZ25vcmVkLlxuICAgKiBcbiAgICogQHBhcmFtIGFzc2lnbiAtIE9iamVjdCB3aXRoIHByb3BlcnRpZXMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgYW4gdXBkYXRlIGRvZXMgb2NjdXIsIGxpc3RlbmVycyB3aWxsIG5vdCBiZSByZWZyZXNoZWQgYXV0b21hdGljYWxseS5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgYW4gYXJyYXkgb2Yga2V5cyB1cGRhdGVkLCBgdW5kZWZpbmVkYCAoaW1tZWRpYXRlbHkpIGlmIGEgbm9vcC5cbiAgICovXG4gIHNldChhc3NpZ24/OiBNb2RlbC5Bc3NpZ248dGhpcz4sIHNpbGVudD86IGJvb2xlYW4pOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUHVzaCBhbiB1cGRhdGUuIFRoaXMgd2lsbCBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhc3NvY2lhdGVkIHByb3BlcnR5LlxuICAgKiBcbiAgICogVXNlZnVsIHdoZXJlIGEgcHJvcGVydHkgdmFsdWUgaW50ZXJuYWxseSBoYXMgY2hhbmdlZCwgYnV0IHRoZSBvYmplY3QgaXMgdGhlIHNhbWUuXG4gICAqIEZvciBleGFtcGxlOiBBbiBhcnJheSBoYXMgcHVzaGVkIGEgbmV3IHZhbHVlLCBvciBhIG5lc3RlZCBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogWW91IGNhbiBhbHNvIHVzZSB0aGlzIHRvIGRpc3BhdGNoIGFyYml0cmFyeSBldmVudHMuXG4gICAqIFN5bWJvbHMgYXJlIHJlY29tbWVuZGVkIGFzIG5vbi1wcm9wZXJ0eSBldmVudHMsIGhvd2V2ZXIgeW91IGNhbiB1c2UgYW55IHN0cmluZy5cbiAgICogSWYgZG9pbmcgc28sIGJlIHN1cmUgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIHByb3BlcnR5IG5hbWVzISBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzXG4gICAqIHRvIHByZWZpeCBhbiBldmVudCB3aXRoIFwiIVwiIGFuZC9vciB1c2UgZGFzaC1jYXNlLiBlLmcuIGBzZXQoXCIhZXZlbnRcIilgIG9yIGBzZXQoXCJteS1ldmVudFwiKWAuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgb3IgZXZlbnQgdG8gZGlzcGF0Y2guXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgYW4gYXJyYXkgb2Yga2V5cyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4pOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPjtcblxuICAvKipcbiAgICogU2V0IGEgdmFsdWUgZm9yIGEgcHJvcGVydHkuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIHZhbHVlIGFuZCBub3RpZnkgbGlzdGVuZXJzLlxuICAgKiBcbiAgICogKipVc2Ugd2l0aCBjYXV0aW9uISoqIEtleSBub3IgdmFsdWUgYXJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5LlxuICAgKiBcbiAgICogVGhpcyBpcyBtZWFudCBmb3IgYXNzaWduaW5nIHZhbHVlcyBwcm9ncmFtbWF0aWNhbGx5LFxuICAgKiB3aGVyZSBzaW1wbGUgYXNzaWdubWVudCBpcyBub3QgcHJhY3RpY2FibGUuXG4gICAqIFxuICAgKiBGb3IgZXhhbXBsZTogYCh0aGlzIGFzIGFueSlbbXlQcm9wZXJ0eV0gPSB2YWx1ZTtgXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gc2V0IHZhbHVlIGZvci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0IGZvciBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIGluaXQgLSBJZiB0cnVlLCBtb2RlbCB3aWxsIGJlZ2luIHRvIG1hbmFnZSB0aGUgcHJvcGVydHkgaWYgaXQgaXMgbm90IGFscmVhZHkuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgYW4gYXJyYXkgb2Yga2V5cyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4sIHZhbHVlOiB1bmtub3duLCBpbml0PzogYm9vbGVhbik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+O1xuXG4gIC8qKlxuICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBcbiAgICogR2l2ZW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBhc3NpZ25tZW50ICh3aGljaCBjaGFuZ2VzIHZhbHVlKSBvciBleHBsaWNpdCBgc2V0YC5cbiAgICogXG4gICAqIFRvIHJ1biBsb2dpYyBvbiBmaW5hbCB2YWx1ZSBvbmx5LCBjYWxsYmFjayBtYXkgcmV0dXJuIGEgZnVuY3Rpb24uIFVzaW5nIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gcmVtb3ZlIGxpc3RlbmVyLiBXaWxsIHJldHVybiBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiBpbmFjdGl2ZSBhbHJlYWR5LlxuICAgKiBcbiAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+KTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBVbmxpa2UgYGdldGAsIHRoaXMgY2Fsc2wgc3luY2hyb25vdXNseSBhbmQgd2lsbCBmaXJlIGFzIG1hbnkgdGltZXMgYXMgdGhlIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGV2ZW50IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqL1xuICBzZXQoY2FsbGJhY2s6IE1vZGVsLk9uRXZlbnQ8dGhpcz4sIGV2ZW50OiBNb2RlbC5FdmVudDx0aGlzPiB8IG51bGwpOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWNsYXJlIGFuIGVuZCB0byB1cGRhdGVzLiBUaGlzIGV2ZW50IGlzIGZpbmFsIGFuZCB3aWxsIGZyZWV6ZSBzdGF0ZS5cbiAgICogVGhpcyBldmVudCBjYW4gYmUgd2F0Y2hlZCBmb3IgYXMgd2VsbCwgdG8gcnVuIGNsZWFudXAgbG9naWMgYW5kIGludGVybmFsbHkgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycy5cbiAgICogXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBgbnVsbGAgdG8gZW5kIHVwZGF0ZXMuXG4gICAqL1xuICBzZXQoc3RhdHVzOiBudWxsKTogdm9pZDtcblxuICBzZXQoXG4gICAgYXJnMT86IE1vZGVsLk9uRXZlbnQ8dGhpcz4gfCBNb2RlbC5Bc3NpZ248dGhpcz4gfCBNb2RlbC5FdmVudDx0aGlzPiB8IG51bGwsXG4gICAgYXJnMj86IHVua25vd24sXG4gICAgYXJnMz86IGJvb2xlYW4pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYoYXJnMiA9PT0ga2V5IHx8IGFyZzIgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Yga2V5ID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgcmV0dXJuIGFyZzEuY2FsbChzZWxmLCBrZXksIHNlbGYpO1xuICAgICAgfSlcbiAgICAgIFxuICAgIGlmKGFyZzEgJiYgdHlwZW9mIGFyZzEgPT0gXCJvYmplY3RcIilcbiAgICAgIGFzc2lnbihzZWxmLCBhcmcxLCBhcmcyID09PSB0cnVlKTtcbiAgICBlbHNlIGlmKCFhcmcyKVxuICAgICAgZXZlbnQoc2VsZiwgYXJnMSk7XG4gICAgZWxzZSBpZihhcmczKVxuICAgICAgbWFuYWdlKHNlbGYsIGFyZzEgYXMgc3RyaW5nIHwgbnVtYmVyLCBhcmcyKTtcbiAgICBlbHNlXG4gICAgICB1cGRhdGUoc2VsZiwgYXJnMSBhcyBzdHJpbmcgfCBudW1iZXIsIGFyZzIpXG5cbiAgICBjb25zdCBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldCh0aGlzKTtcblxuICAgIGlmKHBlbmRpbmcpXG4gICAgICByZXR1cm4gPFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+PiB7XG4gICAgICAgIHRoZW46IChyZXMpID0+IG5ldyBQcm9taXNlPGFueT4ocmVzID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdmUgPSBhZGRMaXN0ZW5lcih0aGlzLCBrZXkgPT4ge1xuICAgICAgICAgICAgaWYoa2V5ICE9PSB0cnVlKXtcbiAgICAgICAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuYmluZChudWxsLCBBcnJheS5mcm9tKHBlbmRpbmcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbihyZXMpXG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIG1hbmFnZWQgcHJvcGVydGllcyBpbiB0aGlzIGluc3RhbmNlIG9mIE1vZGVsLlxuICAgKiBZZWlsZHMgdGhlIGtleSBhbmQgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFtzdHJpbmcsIHVua25vd25dPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKFNUQVRFLmdldCh0aGlzLmlzKSEpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFjdGl2YXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuXG4gICAqIFxuICAgKiAqKkltcG9ydGFudCoqIC0gVW5saWtlIGBuZXcgdGhpcyguLi4pYCAtIHRoaXMgbWV0aG9kIGFsc28gYWN0aXZhdGVzIHN0YXRlLlxuICAgKiBcbiAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgc2VudCB0byBjb25zdHJ1Y3RvclxuICAgKi9cbiAgc3RhdGljIG5ldzxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLkluaXQ8VD4sIC4uLmFyZ3M6IE1vZGVsLkFyZ3M8VD4pe1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgZXZlbnQoaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgZXF1aXZhbGVudCBvZiBgeCBpbnN0YW5jZW9mIHRoaXNgLlxuICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICogSWYgc28sIGxhbmd1YWdlIHNlcnZlciB3aWxsIG1ha2UgYXZhaWxhYmxlIGFsbCBzdGF0aWNcbiAgICogbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGlzPFQgZXh0ZW5kcyBNb2RlbC5UeXBlPih0aGlzOiBULCBtYXliZTogdW5rbm93bik6IG1heWJlIGlzIFQge1xuICAgIHJldHVybiBtYXliZSA9PT0gdGhpcyB8fCB0eXBlb2YgbWF5YmUgPT0gXCJmdW5jdGlvblwiICYmIG1heWJlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBydW4gd2hlbiBhbnkgaW5zdGFuY2Ugb2YgdGhpcyBNb2RlbCBpcyB1cGRhdGVkLiBcbiAgICovXG4gIHN0YXRpYyBvbjxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLlR5cGU8VD4sIGxpc3RlbmVyOiBNb2RlbC5PbkV2ZW50PFQ+KXtcbiAgICBsZXQgbm90aWZ5ID0gTk9USUZZLmdldCh0aGlzKTtcblxuICAgIGlmKCFub3RpZnkpXG4gICAgICBOT1RJRlkuc2V0KHRoaXMsIG5vdGlmeSA9IG5ldyBTZXQpO1xuXG4gICAgbm90aWZ5LmFkZChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gbm90aWZ5LmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVmaW5lKE1vZGVsLnByb3RvdHlwZSwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIElELmdldCh0aGlzLmlzKTtcbiAgfVxufSk7XG5cbmRlZmluZShNb2RlbCwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGFzc2lnbihzdWJqZWN0OiBNb2RlbCwgZGF0YTogTW9kZWwuQXNzaWduPE1vZGVsPiwgc2lsZW50PzogYm9vbGVhbil7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChzdWJqZWN0LmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGUpITtcbiAgICBcbiAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICBjb25zdCBiaW5kID0gbWV0aG9kcy5nZXQoa2V5KTtcblxuICAgIGlmKGJpbmQpXG4gICAgICBiaW5kLmNhbGwoc3ViamVjdCwgZGF0YVtrZXldKTtcbiAgICBlbHNlIGlmKGtleSBpbiBzdWJqZWN0ICYmIGtleSAhPT0gXCJpc1wiKXtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN1YmplY3QsIGtleSkhO1xuICAgICAgY29uc3Qgc2V0ID0gZGVzYyAmJiBkZXNjLnNldCBhcyAodmFsdWU6IGFueSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcblxuICAgICAgc2V0LmNhbGwoc3ViamVjdCwgZGF0YVtrZXldLCBzaWxlbnQpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQXBwbHkgaW5zdHJ1Y3Rpb25zIGFuZCBpbmhlcml0ZWQgZXZlbnQgbGlzdGVuZXJzLiBFbnN1cmUgY2xhc3MgbWV0YWRhdGEgaXMgcmVhZHkuICovXG5mdW5jdGlvbiBwcmVwYXJlKG1vZGVsOiBNb2RlbCl7XG4gIGxldCBUID0gbW9kZWwuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZTtcblxuICBpZihUID09PSBNb2RlbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGJhc2UgTW9kZWwuXCIpO1xuXG4gIGNvbnN0IGNoYWluID0gW10gYXMgTW9kZWwuVHlwZVtdO1xuICBsZXQga2V5cyA9IG5ldyBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4oKTtcblxuICBJRC5zZXQobW9kZWwsIGAke1R9LSR7dWlkKCl9YCk7XG5cbiAgd2hpbGUoVC5uYW1lKXtcbiAgICBmb3IoY29uc3QgY2Igb2YgTk9USUZZLmdldChUKSB8fCBbXSlcbiAgICAgIGFkZExpc3RlbmVyKG1vZGVsLCBjYik7XG5cbiAgICBpZihUID09PSBNb2RlbCkgYnJlYWs7XG4gICAgZWxzZSBjaGFpbi51bnNoaWZ0KFQpO1xuXG4gICAgVCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihUKVxuICB9XG5cbiAgZm9yKGNvbnN0IHR5cGUgb2YgY2hhaW4pe1xuICAgIGlmKE1FVEhPRFMuaGFzKHR5cGUpKXtcbiAgICAgIGtleXMgPSBNRVRIT0RTLmdldCh0eXBlKSE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBNRVRIT0RTLnNldCh0eXBlLCBrZXlzID0gbmV3IE1hcChrZXlzKSk7XG5cbiAgICBmb3IoY29uc3QgW2tleSwgeyB2YWx1ZSB9XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHR5cGUucHJvdG90eXBlKVxuICAgICkpe1xuICAgICAgaWYoIXZhbHVlIHx8IGtleSA9PSBcImNvbnN0cnVjdG9yXCIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICBmdW5jdGlvbiBiaW5kKHRoaXM6IE1vZGVsLCBvcmlnaW5hbD86IEZ1bmN0aW9uKXtcbiAgICAgICAgY29uc3QgeyBpcyB9ID0gdGhpcztcblxuICAgICAgICBpZihpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFvcmlnaW5hbClcbiAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgRnVuY3Rpb247XG5cbiAgICAgICAgY29uc3QgZm4gPSBvcmlnaW5hbCB8fCB2YWx1ZTtcbiAgICAgICAgY29uc3QgYm91bmQgPSBmbi5iaW5kKGlzKTtcbiAgICAgICAgXG4gICAgICAgIE1FVEhPRC5zZXQoYm91bmQsIGZuKTtcbiAgICAgICAgZGVmaW5lKGlzLCBrZXksIHsgdmFsdWU6IGJvdW5kLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICAgIH1cblxuICAgICAga2V5cy5zZXQoa2V5LCBiaW5kKTtcbiAgICAgIGRlZmluZSh0eXBlLnByb3RvdHlwZSwga2V5LCB7IGdldDogYmluZCwgc2V0OiBiaW5kIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwcGx5IG1vZGVsIGFyZ3VlbW50cywgcnVuIGNhbGxiYWNrcyBhbmQgb2JzZXJ2ZSBwcm9wZXJ0aWVzLlxuICogQWNjdW11bGF0ZSBhbmQgaGFuZGxlIGNsZWFudXAgZXZlbnRzLlxuICoqL1xuZnVuY3Rpb24gaW5pdChtb2RlbDogTW9kZWwsIGFyZ3M6IE1vZGVsLkFyZ3Mpe1xuICBjb25zdCBzdGF0ZSA9IHt9IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gIFNUQVRFLnNldChtb2RlbCwgc3RhdGUpO1xuXG4gIGFyZ3MgPSBhcmdzLmZsYXQoKS5maWx0ZXIoYXJnID0+IHtcbiAgICBpZih0eXBlb2YgYXJnICE9IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIElELnNldChtb2RlbCwgYXJnKTtcbiAgfSk7XG5cbiAgYWRkTGlzdGVuZXIobW9kZWwsICgpID0+IHtcbiAgICBpZighUEFSRU5ULmhhcyhtb2RlbCkpXG4gICAgICBQQVJFTlQuc2V0KG1vZGVsLCBudWxsKTtcblxuICAgIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuXG4gICAgICBpZihcInZhbHVlXCIgaW4gZGVzYylcbiAgICAgICAgbWFuYWdlKG1vZGVsLCBrZXksIGRlc2MudmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIGZvcihjb25zdCBhcmcgb2YgYXJncyl7XG4gICAgICBjb25zdCB1c2UgPSB0eXBlb2YgYXJnID09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGFyZy5jYWxsKG1vZGVsLCBtb2RlbClcbiAgICAgICAgOiBhcmcgYXMgTW9kZWwuQXNzaWduPE1vZGVsPjtcblxuICAgICAgaWYodXNlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdXNlLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQXN5bmMgZXJyb3IgaW4gY29uc3RydWN0b3IgZm9yICR7bW9kZWx9OmApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmKHR5cGVvZiB1c2UgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgdXNlLCBudWxsKVxuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwib2JqZWN0XCIpXG4gICAgICAgIGFzc2lnbihtb2RlbCwgdXNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgICAgZm9yKGNvbnN0IFtfLCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IG1vZGVsKVxuICAgICAgICAgIHZhbHVlLnNldChudWxsKTtcbiAgXG4gICAgICBPYmplY3QuZnJlZXplKHN0YXRlKTtcbiAgICB9LCBudWxsKTtcbiAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYW5hZ2UodGFyZ2V0OiBNb2RlbCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnksIHNpbGVudD86IGJvb2xlYW4pe1xuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldCh0YXJnZXQpITtcbiAgXG4gIGZ1bmN0aW9uIGdldCh0aGlzOiBNb2RlbCl7XG4gICAgcmV0dXJuIHdhdGNoKHRoaXMsIGtleSwgc3RhdGVba2V5XSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXQodmFsdWU6IHVua25vd24sIHNpbGVudD86IGJvb2xlYW4pe1xuICAgIHVwZGF0ZSh0YXJnZXQsIGtleSwgdmFsdWUsIHNpbGVudCk7XG4gICAgaWYodmFsdWUgaW5zdGFuY2VvZiBNb2RlbCAmJiAhUEFSRU5ULmhhcyh2YWx1ZSkpe1xuICAgICAgUEFSRU5ULnNldCh2YWx1ZSwgdGFyZ2V0KTtcbiAgICAgIGV2ZW50KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBkZWZpbmUodGFyZ2V0LCBrZXksIHsgc2V0LCBnZXQgfSk7XG4gIHNldCh2YWx1ZSwgc2lsZW50KTtcbn1cblxudHlwZSBQcm94eTxUID0gYW55PiA9IChrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IFQpID0+IFQ7XG5cbmNvbnN0IE9CU0VSVkVSID0gbmV3IFdlYWtNYXA8TW9kZWwsIFByb3h5PigpO1xuXG5mdW5jdGlvbiB3YXRjaChmcm9tOiBNb2RlbCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlPzogYW55KXtcbiAgY29uc3QgYWNjZXNzID0gT0JTRVJWRVIuZ2V0KGZyb20pO1xuICByZXR1cm4gYWNjZXNzID8gYWNjZXNzKGtleSwgdmFsdWUpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGZldGNoKHN1YmplY3Q6IE1vZGVsLCBwcm9wZXJ0eTogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4pe1xuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldChzdWJqZWN0KSE7XG4gIFxuICBpZihwcm9wZXJ0eSBpbiBzdGF0ZSB8fCByZXF1aXJlZCA9PT0gZmFsc2Upe1xuICAgIGNvbnN0IHZhbHVlID0gc3RhdGVbcHJvcGVydHldO1xuXG4gICAgaWYodmFsdWUgIT09IHVuZGVmaW5lZCB8fCAhcmVxdWlyZWQpXG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgJHtzdWJqZWN0fS4ke3Byb3BlcnR5fSBpcyBub3QgeWV0IGF2YWlsYWJsZS5gKTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGFkZExpc3RlbmVyKHN1YmplY3QsIGtleSA9PiB7XG4gICAgICBpZihrZXkgPT09IHByb3BlcnR5KXtcbiAgICAgICAgcmVzb2x2ZShzdGF0ZVtrZXldKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmKGtleSA9PT0gbnVsbClcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgJHtzdWJqZWN0fSBpcyBkZXN0cm95ZWQuYCkpO1xuICAgIH0pO1xuICB9KTtcblxuICB0aHJvdyBPYmplY3QuYXNzaWduKHByb21pc2UsIHtcbiAgICB0b1N0cmluZzogKCkgPT4gU3RyaW5nKGVycm9yKSxcbiAgICBuYW1lOiBcIlN1c3BlbnNlXCIsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgfSk7XG59XG5cbi8qKiBDdXJyZW50bHkgYWNjdW11bGF0aW5nIGV4cG9ydC4gU3RvcmVzIHJlYWwgdmFsdWVzIG9mIHBsYWNlaG9sZGVyIHByb3BlcnRpZXMgc3VjaCBhcyByZWYoKSBvciBjaGlsZCBtb2RlbHMuICovXG5sZXQgRVhQT1JUOiBNYXA8YW55LCBhbnk+IHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBzbmFwc2hvdDxUIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBUKTogTW9kZWwuU3RhdGU8VD4ge1xuICBjb25zdCB2YWx1ZXMgPSB7fSBhcyBhbnk7XG4gIGxldCBpc05vdFJlY3Vyc2l2ZTtcblxuICBpZighRVhQT1JUKXtcbiAgICBpc05vdFJlY3Vyc2l2ZSA9IHRydWU7XG4gICAgRVhQT1JUID0gbmV3IE1hcChbW21vZGVsLCB2YWx1ZXNdXSk7XG4gIH1cblxuICBmb3IobGV0IFtrZXksIHZhbHVlXSBvZiBtb2RlbCl7XG4gICAgaWYoRVhQT1JULmhhcyh2YWx1ZSkpXG4gICAgICB2YWx1ZSA9IEVYUE9SVC5nZXQodmFsdWUpO1xuICAgIGVsc2UgaWYodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgXCJnZXRcIiBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuZ2V0ID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBFWFBPUlQuc2V0KHZhbHVlLCB2YWx1ZSA9IHZhbHVlLmdldCgpKTtcblxuICAgIHZhbHVlc1trZXldID0gdmFsdWU7XG4gIH1cblxuICBpZihpc05vdFJlY3Vyc2l2ZSlcbiAgICBFWFBPUlQgPSB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlPFQ+KFxuICBzdWJqZWN0OiBNb2RlbCxcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gIHZhbHVlOiBULFxuICBhcmc/OiBib29sZWFuIHwgTW9kZWwuU2V0dGVyPFQ+KXtcblxuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldChzdWJqZWN0KSE7XG5cbiAgaWYoT2JqZWN0LmlzRnJvemVuKHN0YXRlKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIHVwZGF0ZSAke1N0cmluZyhrZXkpfSBidXQgJHtzdWJqZWN0fSBpcyBkZXN0cm95ZWQuYCk7XG5cbiAgY29uc3QgcHJldmlvdXMgPSBzdGF0ZVtrZXldIGFzIFQ7XG5cbiAgaWYodHlwZW9mIGFyZyA9PSBcImZ1bmN0aW9uXCIpe1xuICAgIGNvbnN0IG91dCA9IGFyZy5jYWxsKHN1YmplY3QsIHZhbHVlLCBwcmV2aW91cyk7XG5cbiAgICBpZihvdXQgPT09IGZhbHNlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYodHlwZW9mIG91dCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB2YWx1ZSA9IG91dCgpO1xuICB9XG5cbiAgaWYodmFsdWUgPT09IHByZXZpb3VzICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuO1xuXG4gIHN0YXRlW2tleV0gPSB2YWx1ZTtcblxuICBpZihhcmcgIT09IHRydWUpXG4gICAgZXZlbnQoc3ViamVjdCwga2V5KTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFJhbmRvbSBhbHBoYW51bWJlcmljIG9mIGxlbmd0aCA2OyBhbHdheXMgc3RhcnRzIHdpdGggYSBsZXR0ZXIuICovXG5mdW5jdGlvbiB1aWQoKXtcbiAgcmV0dXJuICgwLjI3OCArIE1hdGgucmFuZG9tKCkgKiAwLjcyMikudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA4KS50b1VwcGVyQ2FzZSgpO1xufVxuXG5leHBvcnQge1xuICBldmVudCxcbiAgZmV0Y2gsXG4gIE1FVEhPRCxcbiAgTW9kZWwsXG4gIFBBUkVOVCxcbiAgU1RBVEUsXG4gIHVpZCxcbiAgdXBkYXRlLFxuICB3YXRjaFxufSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsYUFBYSxjQUFjLE9BQU8sWUFBc0Isb0JBQW9CO0FBRXJGLE1BQU0sU0FBUyxPQUFPO0FBR3RCLE1BQU0sS0FBSyxvQkFBSSxRQUF1QjtBQUd0QyxNQUFNLFFBQVEsb0JBQUksUUFBMEQ7QUFHNUUsTUFBTSxTQUFTLG9CQUFJLFFBQW1DO0FBR3RELE1BQU0sU0FBUyxvQkFBSSxRQUE2QjtBQUdoRCxNQUFNLFVBQVUsb0JBQUksUUFBdUQ7QUFHM0UsTUFBTSxTQUFTLG9CQUFJLFFBQWtCO0FBbUhyQyxNQUFlLE1BQTRCO0FBQUEsRUFDekMsZUFBZSxNQUFpQjtBQUM5QixZQUFRLElBQUk7QUFDWixXQUFPLE1BQU0sTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ2xDLFNBQUssTUFBTSxJQUFJO0FBQUEsRUFDakI7QUFBQSxFQUVBLENBQUMsVUFBVSxFQUFFLFVBQStCLFVBQW1CO0FBQzdELFVBQU1BLFNBQVEsb0JBQUksSUFBdUI7QUFDekMsVUFBTSxRQUFRLE9BQU8sT0FBTyxJQUFJO0FBRWhDLGdCQUFZLE1BQU0sTUFBTSxLQUFLLFNBQVMsR0FBR0EsTUFBSztBQUU5QyxhQUFTLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVTtBQUNsQyxVQUFHLFVBQVUsVUFBYTtBQUN4QixjQUFNLElBQUksTUFBTSxHQUFHLElBQUks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
package/dist/index.d.ts CHANGED
@@ -8,12 +8,21 @@
8
8
  * - `null` - terminal event; instance is expired.
9
9
  * @param source - Instance of Model for which update has occured.
10
10
  */
11
- type OnUpdate<T extends Model = any> = (this: T, key: unknown, source: T) => (() => void) | null | void;
12
- type OnAccess<T extends Model = any, R = unknown> = (from: T, key: string | number, value: R) => unknown;
13
- type Effect<T extends Model> = (this: T, proxy: T) => ((update: boolean | null) => void) | Promise<void> | null | void;
11
+ type OnUpdate<T extends Observable = any> = (this: T, key: Event, source: T) => (() => void) | null | void;
12
+ type Effect<T extends Observable> = (this: T, proxy: T) => ((update: boolean | null) => void) | Promise<void> | null | void;
14
13
  type Event = number | string | null | boolean | symbol;
15
- declare function addListener<T extends Model>(subject: T, callback: OnUpdate<T>, select?: Event): () => boolean;
16
- declare function createProxy<T extends Model>(from: T, observer: OnAccess<T>): T;
14
+ type PromiseLite<T = void> = {
15
+ then: (callback: () => T) => T;
16
+ };
17
+ declare namespace Observable {
18
+ type Callback = () => void | PromiseLite;
19
+ }
20
+ interface Observable {
21
+ [Observable](callback: Observable.Callback, required?: boolean): this;
22
+ }
23
+ declare const Observable: unique symbol;
24
+ declare function addListener<T extends Observable>(subject: T, callback: OnUpdate<T>, select?: Event | Set<Event>): () => boolean;
25
+ declare function event(subject: Observable, key?: string | number | symbol | null, silent?: boolean): void;
17
26
  /**
18
27
  * Create a side-effect which will update whenever values accessed change.
19
28
  * Callback is called immediately and whenever values are stale.
@@ -22,8 +31,8 @@ declare function createProxy<T extends Model>(from: T, observer: OnAccess<T>): T
22
31
  * @param callback - Function to invoke when values change.
23
32
  * @param requireValues - If `true` will throw if accessing a value which is `undefined`.
24
33
  */
25
- declare function createEffect<T extends Model>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;
26
- declare function createEffect<T extends Model>(target: T, callback: Effect<T>, recursive?: boolean): () => void;
34
+ declare function createEffect<T extends Observable>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;
35
+ declare function createEffect<T extends Observable>(target: T, callback: Effect<T>, recursive?: boolean): () => void;
27
36
 
28
37
  /** Reference bound instance methods to real ones. */
29
38
  declare const METHOD: WeakMap<any, any>;
@@ -112,8 +121,9 @@ interface Model {
112
121
  **/
113
122
  is: this;
114
123
  }
115
- declare abstract class Model {
124
+ declare abstract class Model implements Observable {
116
125
  constructor(...args: Model.Args);
126
+ [Observable](callback: Observable.Callback, required?: boolean): this;
117
127
  /**
118
128
  * Pull current values from state. Flattens all models and exotic values recursively.
119
129
  *
@@ -189,6 +199,22 @@ declare abstract class Model {
189
199
  * @returns Promise resolves an array of keys updated.
190
200
  */
191
201
  set(key: Model.Event<this>): PromiseLike<Model.Event<this>[]>;
202
+ /**
203
+ * Set a value for a property. This will update the value and notify listeners.
204
+ *
205
+ * **Use with caution!** Key nor value are checked for validity.
206
+ *
207
+ * This is meant for assigning values programmatically,
208
+ * where simple assignment is not practicable.
209
+ *
210
+ * For example: `(this as any)[myProperty] = value;`
211
+ *
212
+ * @param key - Property to set value for.
213
+ * @param value - Value to set for property.
214
+ * @param init - If true, model will begin to manage the property if it is not already.
215
+ * @returns Promise resolves an array of keys updated.
216
+ */
217
+ set(key: Model.Event<this>, value: unknown, init?: boolean): PromiseLike<Model.Event<this>[]>;
192
218
  /**
193
219
  * Call a function when update occurs.
194
220
  *
@@ -206,10 +232,10 @@ declare abstract class Model {
206
232
  * Call a function when a property is updated.
207
233
  * Unlike `get`, this calsl synchronously and will fire as many times as the property is updated.
208
234
  *
209
- * @param key - Property to watch for updates.
210
235
  * @param callback - Function to call when property is updated.
236
+ * @param event - Property to watch for updates.
211
237
  */
212
- set(key: Model.Event<this> | null, callback: Model.OnEvent<this>): () => boolean;
238
+ set(callback: Model.OnEvent<this>, event: Model.Event<this> | null): () => boolean;
213
239
  /**
214
240
  * Declare an end to updates. This event is final and will freeze state.
215
241
  * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.
@@ -442,4 +468,4 @@ declare class Context {
442
468
  protected add<T extends Model>(input: T | Model.Init<T>, implicit?: boolean): T;
443
469
  }
444
470
 
445
- export { Context, METHOD, Model, addListener, createEffect, createProxy, Model as default, get, has, ref, set, use };
471
+ export { Context, METHOD, Model, Observable, addListener, createEffect, Model as default, event, get, has, ref, set, use };