velocious 1.0.194 → 1.0.195
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/README.md +17 -1
- package/build/src/mailer/base.d.ts +7 -19
- package/build/src/mailer/base.d.ts.map +1 -1
- package/build/src/mailer/base.js +10 -48
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -126,7 +126,7 @@ class TasksMailer extends VelociousMailer {
|
|
|
126
126
|
this.task = task
|
|
127
127
|
this.user = user
|
|
128
128
|
this.assignView({task, user})
|
|
129
|
-
this.mail({to: user.email(), subject: "New task"})
|
|
129
|
+
return this.mail({to: user.email(), subject: "New task", actionName: "newNotification"})
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
```
|
|
@@ -145,6 +145,22 @@ await new TasksMailer().newNotification(task, user).deliverNow()
|
|
|
145
145
|
await new TasksMailer().newNotification(task, user).deliverLater()
|
|
146
146
|
```
|
|
147
147
|
|
|
148
|
+
If your mailer needs async setup, keep the action sync and pass `actionPromise`:
|
|
149
|
+
|
|
150
|
+
```js
|
|
151
|
+
resetPassword(user) {
|
|
152
|
+
return this.mail({
|
|
153
|
+
to: user.email(),
|
|
154
|
+
subject: "Reset your password",
|
|
155
|
+
actionName: "resetPassword",
|
|
156
|
+
actionPromise: (async () => {
|
|
157
|
+
this.token = await user.resetToken()
|
|
158
|
+
this.assignView({user, token: this.token})
|
|
159
|
+
})()
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
148
164
|
Configure a delivery handler for non-test environments:
|
|
149
165
|
|
|
150
166
|
```js
|
|
@@ -48,16 +48,6 @@ export class VelociousMailerBase {
|
|
|
48
48
|
};
|
|
49
49
|
_viewParams: {};
|
|
50
50
|
_configurationPromise: Promise<import("../configuration.js").default>;
|
|
51
|
-
_actionMethods: Map<any, any>;
|
|
52
|
-
/**
|
|
53
|
-
* @returns {void} - No return value.
|
|
54
|
-
*/
|
|
55
|
-
_setupActionWrappers(): void;
|
|
56
|
-
/**
|
|
57
|
-
* @param {string} actionName - Action name.
|
|
58
|
-
* @returns {((...args: any[]) => unknown) | undefined} - Action method.
|
|
59
|
-
*/
|
|
60
|
-
_getActionMethod(actionName: string): ((...args: any[]) => unknown) | undefined;
|
|
61
51
|
/**
|
|
62
52
|
* @param {Record<string, any>} params - View params.
|
|
63
53
|
* @returns {void} - No return value.
|
|
@@ -72,9 +62,11 @@ export class VelociousMailerBase {
|
|
|
72
62
|
* @param {any} [args.bcc] - BCC recipients.
|
|
73
63
|
* @param {any} [args.replyTo] - Reply-to address.
|
|
74
64
|
* @param {Record<string, string>} [args.headers] - Custom headers.
|
|
75
|
-
* @
|
|
65
|
+
* @param {string} args.actionName - Mailer action name.
|
|
66
|
+
* @param {Promise<unknown> | unknown} [args.actionPromise] - Action completion promise.
|
|
67
|
+
* @returns {MailerDelivery} - Delivery wrapper.
|
|
76
68
|
*/
|
|
77
|
-
mail({ to, subject, from, cc, bcc, replyTo, headers, ...restArgs }: {
|
|
69
|
+
mail({ to, subject, from, cc, bcc, replyTo, headers, actionName, actionPromise, ...restArgs }: {
|
|
78
70
|
to: any;
|
|
79
71
|
subject: string;
|
|
80
72
|
from?: any;
|
|
@@ -82,13 +74,9 @@ export class VelociousMailerBase {
|
|
|
82
74
|
bcc?: any;
|
|
83
75
|
replyTo?: any;
|
|
84
76
|
headers?: Record<string, string>;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* @param {any[]} args - Action args.
|
|
89
|
-
* @returns {MailerDelivery} - Delivery wrapper.
|
|
90
|
-
*/
|
|
91
|
-
_buildDelivery(actionName: string, args: any[]): MailerDelivery;
|
|
77
|
+
actionName: string;
|
|
78
|
+
actionPromise?: Promise<unknown> | unknown;
|
|
79
|
+
}): MailerDelivery;
|
|
92
80
|
/**
|
|
93
81
|
* @returns {Promise<import("../configuration.js").default>} - Configuration instance.
|
|
94
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/mailer/base.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/mailer/base.js"],"names":[],"mappings":"AAyMA;;GAEG;AACH,8BAFa,OAAO,YAAY,EAAE,qBAAqB,EAAE,CAIxD;AAED;;GAEG;AACH,mCAFa,IAAI,CAIhB;AAED;;;GAGG;AACH,4CAHW,CAAC,OAAO,EAAE,OAAO,YAAY,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GACjF,IAAI,CAIhB;AAED;;GAEG;AACH,sCAFa,CAAC,OAAO,EAAE,OAAO,YAAY,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,CAItG;AAED;;;GAGG;AACH,wCAHW,OAAO,YAAY,EAAE,qBAAqB,GACxC,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAsBzE;AAED;;;GAGG;AACH,wCAHW,OAAO,YAAY,EAAE,qBAAqB,GACxC,OAAO,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAW/E;AApOD;;GAEG;AACH;IACE;;;OAGG;IACH,gCAFG;QAAqD,aAAa,GAA1D,OAAO,qBAAqB,EAAE,OAAO;KAC/C,EAMA;IAJC,oBAAuB;IACvB;;;;;;;;MAAwB;IACxB,gBAAqB;IACrB,sEAAqG;IAGvG;;;OAGG;IACH,mBAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,IAAI,CAIhB;IAED;;;;;;;;;;;;OAYG;IACH,+FAXG;QAAkB,EAAE,EAAZ,GAAG;QACU,OAAO,EAApB,MAAM;QACK,IAAI,GAAf,GAAG;QACQ,EAAE,GAAb,GAAG;QACQ,GAAG,GAAd,GAAG;QACQ,OAAO,GAAlB,GAAG;QAC2B,OAAO,GAArC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;QACT,UAAU,EAAvB,MAAM;QAC4B,aAAa,GAA/C,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;KAClC,GAAU,cAAc,CAkB1B;IAED;;OAEG;IACH,qBAFa,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAI1D;IAED;;OAEG;IACH,kBAFa,MAAM,CAQlB;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,OAAO,YAAY,EAAE,qBAAqB,CA6BtD;IAED;;OAEG;IACH,iBAFa,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,CAAC,CAM/D;IAED;;OAEG;IACH,eAFa,OAAO,CAAC,MAAM,CAAC,CA0B3B;IAED;;;OAGG;IACH,yBAHW,OAAO,YAAY,EAAE,qBAAqB,GACxC,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAIzE;IAED;;;OAGG;IACH,yBAHW,OAAO,YAAY,EAAE,qBAAqB,GACxC,OAAO,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAI/E;CACF;2BAhM0B,eAAe"}
|
package/build/src/mailer/base.js
CHANGED
|
@@ -44,38 +44,6 @@ export class VelociousMailerBase {
|
|
|
44
44
|
this._mailOptions = null;
|
|
45
45
|
this._viewParams = {};
|
|
46
46
|
this._configurationPromise = configuration ? Promise.resolve(configuration) : configurationResolver();
|
|
47
|
-
this._actionMethods = new Map();
|
|
48
|
-
this._setupActionWrappers();
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* @returns {void} - No return value.
|
|
52
|
-
*/
|
|
53
|
-
_setupActionWrappers() {
|
|
54
|
-
const basePrototype = VelociousMailerBase.prototype;
|
|
55
|
-
const wrappedNames = new Set();
|
|
56
|
-
let prototype = Object.getPrototypeOf(this);
|
|
57
|
-
while (prototype && prototype !== basePrototype) {
|
|
58
|
-
for (const name of Object.getOwnPropertyNames(prototype)) {
|
|
59
|
-
if (name === "constructor" || wrappedNames.has(name))
|
|
60
|
-
continue;
|
|
61
|
-
const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
|
|
62
|
-
if (!descriptor || typeof descriptor.value !== "function")
|
|
63
|
-
continue;
|
|
64
|
-
if (name.startsWith("_") || name in basePrototype)
|
|
65
|
-
continue;
|
|
66
|
-
wrappedNames.add(name);
|
|
67
|
-
this._actionMethods.set(name, descriptor.value);
|
|
68
|
-
this[name] = (...args) => this._buildDelivery(name, args);
|
|
69
|
-
}
|
|
70
|
-
prototype = Object.getPrototypeOf(prototype);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* @param {string} actionName - Action name.
|
|
75
|
-
* @returns {((...args: any[]) => unknown) | undefined} - Action method.
|
|
76
|
-
*/
|
|
77
|
-
_getActionMethod(actionName) {
|
|
78
|
-
return this._actionMethods.get(actionName);
|
|
79
47
|
}
|
|
80
48
|
/**
|
|
81
49
|
* @param {Record<string, any>} params - View params.
|
|
@@ -93,27 +61,21 @@ export class VelociousMailerBase {
|
|
|
93
61
|
* @param {any} [args.bcc] - BCC recipients.
|
|
94
62
|
* @param {any} [args.replyTo] - Reply-to address.
|
|
95
63
|
* @param {Record<string, string>} [args.headers] - Custom headers.
|
|
96
|
-
* @
|
|
97
|
-
|
|
98
|
-
mail({ to, subject, from, cc, bcc, replyTo, headers, ...restArgs }) {
|
|
99
|
-
restArgsError(restArgs);
|
|
100
|
-
this._mailOptions = { to, subject, from, cc, bcc, replyTo, headers };
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* @param {string} actionName - Action name.
|
|
104
|
-
* @param {any[]} args - Action args.
|
|
64
|
+
* @param {string} args.actionName - Mailer action name.
|
|
65
|
+
* @param {Promise<unknown> | unknown} [args.actionPromise] - Action completion promise.
|
|
105
66
|
* @returns {MailerDelivery} - Delivery wrapper.
|
|
106
67
|
*/
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
throw new Error(`
|
|
68
|
+
mail({ to, subject, from, cc, bcc, replyTo, headers, actionName, actionPromise, ...restArgs }) {
|
|
69
|
+
restArgsError(restArgs);
|
|
70
|
+
if (!actionName) {
|
|
71
|
+
throw new Error(`Missing actionName for ${this.constructor.name}.mail()`);
|
|
111
72
|
}
|
|
112
73
|
this._actionName = actionName;
|
|
113
|
-
|
|
74
|
+
this._mailOptions = { to, subject, from, cc, bcc, replyTo, headers };
|
|
75
|
+
const resolvedActionPromise = actionPromise === undefined ? Promise.resolve() : Promise.resolve(actionPromise);
|
|
114
76
|
return new MailerDelivery({
|
|
115
77
|
mailer: this,
|
|
116
|
-
actionPromise:
|
|
78
|
+
actionPromise: resolvedActionPromise,
|
|
117
79
|
actionName
|
|
118
80
|
});
|
|
119
81
|
}
|
|
@@ -267,4 +229,4 @@ export async function enqueuePayload(payload) {
|
|
|
267
229
|
const { default: mailDeliveryJob } = await import("../jobs/mail-delivery.js");
|
|
268
230
|
return await mailDeliveryJob.performLater(payload);
|
|
269
231
|
}
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYWlsZXIvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFBO0FBQ3JCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLGNBQWMsTUFBTSxlQUFlLENBQUE7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQTtBQUMxQiwyR0FBMkc7QUFDM0csSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFBO0FBRTFCOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLFVBQVU7SUFDOUIsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxTQUFTO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRWpELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDOUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQjtJQUNqQyxNQUFNLGFBQWEsR0FBRyxNQUFNLHFCQUFxQixFQUFFLENBQUE7SUFFbkQsT0FBTyxhQUFhLENBQUMsY0FBYyxFQUFFLEtBQUssTUFBTSxDQUFBO0FBQ2xELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUI7OztPQUdH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QUFDLE9BQU8sRUFBRSxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUE7SUFFL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsT0FBTyxDQUFDLE9BQU8sU0FBUyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNwRyxDQUFDO0lBRUQsT0FBTyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUMvQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsT0FBTztJQUMxQyxJQUFJLE1BQU0sb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0IsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVELE1BQU0sRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUUzRSxPQUFPLE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBlanMgZnJvbSBcImVqc1wiXG5pbXBvcnQge2luY29ycG9yYXRlfSBmcm9tIFwiaW5jb3Jwb3JhdG9yXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IGNvbmZpZ3VyYXRpb25SZXNvbHZlciBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi1yZXNvbHZlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBNYWlsZXJEZWxpdmVyeSBmcm9tIFwiLi9kZWxpdmVyeS5qc1wiXG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWRbXX0gKi9cbmNvbnN0IGRlbGl2ZXJpZXNTdG9yZSA9IFtdXG4vKiogQHR5cGUgeygocGF5bG9hZDogaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQpID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duKSB8IG51bGx9ICovXG5sZXQgZGVsaXZlcnlIYW5kbGVyID0gbnVsbFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gTWFpbGVyIGFjdGlvbiBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gLSBWaWV3IGZpbGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gdmlld0ZpbGVOYW1lKGFjdGlvbk5hbWUpIHtcbiAgcmV0dXJuIGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShhY3Rpb25OYW1lKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gTWFpbGVyIGNsYXNzIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE1haWxlciBkaXJlY3RvcnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbWFpbGVyRGlyZWN0b3J5TmFtZShjbGFzc05hbWUpIHtcbiAgY29uc3QgYmFzZU5hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgvTWFpbGVyJC8sIFwiXCIpXG5cbiAgcmV0dXJuIGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShiYXNlTmFtZSkpXG59XG5cbi8qKlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyB0ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBpc1Rlc3RpbmdFbnZpcm9ubWVudCgpIHtcbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGNvbmZpZ3VyYXRpb25SZXNvbHZlcigpXG5cbiAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCJcbn1cblxuLyoqXG4gKiBCYXNlIG1haWxlciB3aXRoIHZpZXcgcmVuZGVyaW5nIGFuZCBkZWxpdmVyeSBoZWxwZXJzLlxuICovXG5leHBvcnQgY2xhc3MgVmVsb2Npb3VzTWFpbGVyQmFzZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gQ29uc3RydWN0b3IgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9ufSA9IHt9KSB7XG4gICAgdGhpcy5fYWN0aW9uTmFtZSA9IG51bGxcbiAgICB0aGlzLl9tYWlsT3B0aW9ucyA9IG51bGxcbiAgICB0aGlzLl92aWV3UGFyYW1zID0ge31cbiAgICB0aGlzLl9jb25maWd1cmF0aW9uUHJvbWlzZSA9IGNvbmZpZ3VyYXRpb24gPyBQcm9taXNlLnJlc29sdmUoY29uZmlndXJhdGlvbikgOiBjb25maWd1cmF0aW9uUmVzb2x2ZXIoKVxuICAgIHRoaXMuX2FjdGlvbk1ldGhvZHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9zZXR1cEFjdGlvbldyYXBwZXJzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfc2V0dXBBY3Rpb25XcmFwcGVycygpIHtcbiAgICBjb25zdCBiYXNlUHJvdG90eXBlID0gVmVsb2Npb3VzTWFpbGVyQmFzZS5wcm90b3R5cGVcbiAgICBjb25zdCB3cmFwcGVkTmFtZXMgPSBuZXcgU2V0KClcbiAgICBsZXQgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpXG5cbiAgICB3aGlsZSAocHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gYmFzZVByb3RvdHlwZSkge1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSkpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCB3cmFwcGVkTmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbmFtZSlcblxuICAgICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT09IFwiZnVuY3Rpb25cIikgY29udGludWVcbiAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcIl9cIikgfHwgbmFtZSBpbiBiYXNlUHJvdG90eXBlKSBjb250aW51ZVxuXG4gICAgICAgIHdyYXBwZWROYW1lcy5hZGQobmFtZSlcbiAgICAgICAgdGhpcy5fYWN0aW9uTWV0aG9kcy5zZXQobmFtZSwgZGVzY3JpcHRvci52YWx1ZSlcblxuICAgICAgICB0aGlzW25hbWVdID0gKC4uLmFyZ3MpID0+IHRoaXMuX2J1aWxkRGVsaXZlcnkobmFtZSwgYXJncylcbiAgICAgIH1cblxuICAgICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gbmFtZS5cbiAgICogQHJldHVybnMgeygoLi4uYXJnczogYW55W10pID0+IHVua25vd24pIHwgdW5kZWZpbmVkfSAtIEFjdGlvbiBtZXRob2QuXG4gICAqL1xuICBfZ2V0QWN0aW9uTWV0aG9kKGFjdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uTWV0aG9kcy5nZXQoYWN0aW9uTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFZpZXcgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3NpZ25WaWV3KHBhcmFtcykge1xuICAgIHRoaXMuX3ZpZXdQYXJhbXMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3ZpZXdQYXJhbXMsIHBhcmFtcyB8fCB7fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE1haWwgb3B0aW9ucy5cbiAgICogQHBhcmFtIHthbnl9IGFyZ3MudG8gLSBSZWNpcGllbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN1YmplY3QgLSBTdWJqZWN0IGxpbmUuXG4gICAqIEBwYXJhbSB7YW55fSBbYXJncy5mcm9tXSAtIFNlbmRlci5cbiAgICogQHBhcmFtIHthbnl9IFthcmdzLmNjXSAtIENDIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSB7YW55fSBbYXJncy5iY2NdIC0gQkNDIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSB7YW55fSBbYXJncy5yZXBseVRvXSAtIFJlcGx5LXRvIGFkZHJlc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc10gLSBDdXN0b20gaGVhZGVycy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgbWFpbCh7dG8sIHN1YmplY3QsIGZyb20sIGNjLCBiY2MsIHJlcGx5VG8sIGhlYWRlcnMsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLl9tYWlsT3B0aW9ucyA9IHt0bywgc3ViamVjdCwgZnJvbSwgY2MsIGJjYywgcmVwbHlUbywgaGVhZGVyc31cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIEFjdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWN0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtNYWlsZXJEZWxpdmVyeX0gLSBEZWxpdmVyeSB3cmFwcGVyLlxuICAgKi9cbiAgX2J1aWxkRGVsaXZlcnkoYWN0aW9uTmFtZSwgYXJncykge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuX2dldEFjdGlvbk1ldGhvZChhY3Rpb25OYW1lKVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1haWxlciBtZXRob2QgXCIke2FjdGlvbk5hbWV9XCIgb24gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICB9XG5cbiAgICB0aGlzLl9hY3Rpb25OYW1lID0gYWN0aW9uTmFtZVxuICAgIGNvbnN0IGFjdGlvblJlc3VsdCA9IGFjdGlvbi5hcHBseSh0aGlzLCBhcmdzKVxuXG4gICAgcmV0dXJuIG5ldyBNYWlsZXJEZWxpdmVyeSh7XG4gICAgICBtYWlsZXI6IHRoaXMsXG4gICAgICBhY3Rpb25Qcm9taXNlOiBQcm9taXNlLnJlc29sdmUoYWN0aW9uUmVzdWx0KSxcbiAgICAgIGFjdGlvbk5hbWVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdD59IC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIF9nZXRDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uUHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQWN0aW9uIG5hbWUuXG4gICAqL1xuICBfZ2V0QWN0aW9uTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuX2FjdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWFpbGVyIGFjdGlvbiBzZXQgb24gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gUmVuZGVyZWQgSFRNTC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSAtIERlbGl2ZXJ5IHBheWxvYWQuXG4gICAqL1xuICBfYnVpbGRQYXlsb2FkU3luYyhodG1sKSB7XG4gICAgY29uc3QgbWFpbE9wdGlvbnMgPSB0aGlzLl9tYWlsT3B0aW9uc1xuXG4gICAgaWYgKCFtYWlsT3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwoKSBvcHRpb25zIGZvciAke3RoaXMuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLl9nZXRBY3Rpb25OYW1lKCl9LiBHb3Q6ICR7U3RyaW5nKG1haWxPcHRpb25zKX1gKVxuICAgIH1cblxuICAgIGlmICghbWFpbE9wdGlvbnMudG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcInRvXCIgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMuX2dldEFjdGlvbk5hbWUoKX0uIEdvdDogJHtTdHJpbmcobWFpbE9wdGlvbnMudG8pfWApXG4gICAgfVxuXG4gICAgaWYgKCFtYWlsT3B0aW9ucy5zdWJqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCJzdWJqZWN0XCIgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMuX2dldEFjdGlvbk5hbWUoKX0uIEdvdDogJHtTdHJpbmcobWFpbE9wdGlvbnMuc3ViamVjdCl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG86IG1haWxPcHRpb25zLnRvLFxuICAgICAgc3ViamVjdDogbWFpbE9wdGlvbnMuc3ViamVjdCxcbiAgICAgIGZyb206IG1haWxPcHRpb25zLmZyb20sXG4gICAgICBjYzogbWFpbE9wdGlvbnMuY2MsXG4gICAgICBiY2M6IG1haWxPcHRpb25zLmJjYyxcbiAgICAgIHJlcGx5VG86IG1haWxPcHRpb25zLnJlcGx5VG8sXG4gICAgICBoZWFkZXJzOiBtYWlsT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgaHRtbCxcbiAgICAgIG1haWxlcjogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgYWN0aW9uOiB0aGlzLl9nZXRBY3Rpb25OYW1lKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQ+fSAtIERlbGl2ZXJ5IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBfYnVpbGRQYXlsb2FkKCkge1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLl9yZW5kZXJWaWV3KClcblxuICAgIHJldHVybiB0aGlzLl9idWlsZFBheWxvYWRTeW5jKGh0bWwpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZW5kZXJlZCBIVE1MLlxuICAgKi9cbiAgYXN5bmMgX3JlbmRlclZpZXcoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IHRoaXMuX2dldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IG1haWxlckRpciA9IG1haWxlckRpcmVjdG9yeU5hbWUodGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgIGNvbnN0IGFjdGlvbk5hbWUgPSB0aGlzLl9nZXRBY3Rpb25OYW1lKClcbiAgICBjb25zdCBmaWxlTmFtZSA9IHZpZXdGaWxlTmFtZShhY3Rpb25OYW1lKVxuICAgIGNvbnN0IHZpZXdQYXRoID0gYCR7Y29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL21haWxlcnMvJHttYWlsZXJEaXJ9LyR7ZmlsZU5hbWV9LmVqc2BcbiAgICBjb25zdCB0cmFuc2xhdGUgPSAobXNnSUQsIGFyZ3MpID0+IGNvbmZpZ3VyYXRpb24uZ2V0VHJhbnNsYXRvcigpKG1zZ0lELCBhcmdzKVxuICAgIGNvbnN0IHZpZXdQYXJhbXMgPSBpbmNvcnBvcmF0ZSh7bWFpbGVyOiB0aGlzLCBfOiB0cmFuc2xhdGV9LCB0aGlzLl92aWV3UGFyYW1zKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGVqcy5yZW5kZXJGaWxlKHZpZXdQYXRoLCB2aWV3UGFyYW1zLCB7fSwgKGVyciwgc3RyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSAvKiogQHR5cGUge3tjb2RlPzogc3RyaW5nfX0gKi8gKGVycikuY29kZVxuXG4gICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gXCJFTk9FTlRcIikge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBtYWlsZXIgdmlldyBmaWxlOiAke3ZpZXdQYXRofWApKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHN0cilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgdW5rbm93bj59IC0gSGFuZGxlciByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfZGVsaXZlclBheWxvYWQocGF5bG9hZCkge1xuICAgIHJldHVybiBhd2FpdCBkZWxpdmVyUGF5bG9hZChwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICAgKi9cbiAgYXN5bmMgX2VucXVldWVQYXlsb2FkKHBheWxvYWQpIHtcbiAgICByZXR1cm4gYXdhaXQgZW5xdWV1ZVBheWxvYWQocGF5bG9hZClcbiAgfVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZFtdfSAtIERlbGl2ZXJlZCBwYXlsb2Fkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGl2ZXJpZXMoKSB7XG4gIHJldHVybiBkZWxpdmVyaWVzU3RvcmUuc2xpY2UoKVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRGVsaXZlcmllcygpIHtcbiAgZGVsaXZlcmllc1N0b3JlLmxlbmd0aCA9IDBcbn1cblxuLyoqXG4gKiBAcGFyYW0geyhwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTx1bmtub3duPiB8IHVua25vd259IGhhbmRsZXIgLSBEZWxpdmVyeSBoYW5kbGVyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVsaXZlcnlIYW5kbGVyKGhhbmRsZXIpIHtcbiAgZGVsaXZlcnlIYW5kbGVyID0gaGFuZGxlclxufVxuXG4vKipcbiAqIEByZXR1cm5zIHsocGF5bG9hZDogaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQpID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duIHwgbnVsbH0gLSBIYW5kbGVyIG9yIG51bGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxpdmVyeUhhbmRsZXIoKSB7XG4gIHJldHVybiBkZWxpdmVyeUhhbmRsZXJcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBwYXlsb2FkIC0gTWFpbCBkZWxpdmVyeSBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQgfCB1bmtub3duPn0gLSBIYW5kbGVyIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXJQYXlsb2FkKHBheWxvYWQpIHtcbiAgaWYgKGF3YWl0IGlzVGVzdGluZ0Vudmlyb25tZW50KCkpIHtcbiAgICBkZWxpdmVyaWVzU3RvcmUucHVzaChwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgY29uc3QgYmFja2VuZCA9IGNvbmZpZ3VyYXRpb24uZ2V0TWFpbGVyQmFja2VuZCgpXG5cbiAgaWYgKGJhY2tlbmQ/LmRlbGl2ZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgYmFja2VuZC5kZWxpdmVyKHtwYXlsb2FkLCBjb25maWd1cmF0aW9ufSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBkZWxpdmVyeUhhbmRsZXJcblxuICBpZiAoIWhhbmRsZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1haWwgZGVsaXZlcnkgaGFuZGxlciBjb25maWd1cmVkIGZvciBcIiR7cGF5bG9hZC5zdWJqZWN0fVwiIHRvIFwiJHtwYXlsb2FkLnRvfVwiYClcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBoYW5kbGVyKHBheWxvYWQpXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gcGF5bG9hZCAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5xdWV1ZVBheWxvYWQocGF5bG9hZCkge1xuICBpZiAoYXdhaXQgaXNUZXN0aW5nRW52aXJvbm1lbnQoKSkge1xuICAgIGRlbGl2ZXJpZXNTdG9yZS5wdXNoKHBheWxvYWQpXG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIGNvbnN0IHtkZWZhdWx0OiBtYWlsRGVsaXZlcnlKb2J9ID0gYXdhaXQgaW1wb3J0KFwiLi4vam9icy9tYWlsLWRlbGl2ZXJ5LmpzXCIpXG5cbiAgcmV0dXJuIGF3YWl0IG1haWxEZWxpdmVyeUpvYi5wZXJmb3JtTGF0ZXIocGF5bG9hZClcbn1cbiJdfQ==
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYWlsZXIvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFBO0FBQ3JCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLGNBQWMsTUFBTSxlQUFlLENBQUE7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQTtBQUMxQiwyR0FBMkc7QUFDM0csSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFBO0FBRTFCOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLFVBQVU7SUFDOUIsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxTQUFTO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRWpELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDOUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQjtJQUNqQyxNQUFNLGFBQWEsR0FBRyxNQUFNLHFCQUFxQixFQUFFLENBQUE7SUFFbkQsT0FBTyxhQUFhLENBQUMsY0FBYyxFQUFFLEtBQUssTUFBTSxDQUFBO0FBQ2xELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUI7OztPQUdH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Q0FBQyxPQUFPLENBQUMsQ0FBQTtBQUMvQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsT0FBTztJQUMxQyxJQUFJLE1BQU0sb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0IsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVELE1BQU0sRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUUzRSxPQUFPLE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBlanMgZnJvbSBcImVqc1wiXG5pbXBvcnQge2luY29ycG9yYXRlfSBmcm9tIFwiaW5jb3Jwb3JhdG9yXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IGNvbmZpZ3VyYXRpb25SZXNvbHZlciBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi1yZXNvbHZlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBNYWlsZXJEZWxpdmVyeSBmcm9tIFwiLi9kZWxpdmVyeS5qc1wiXG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWRbXX0gKi9cbmNvbnN0IGRlbGl2ZXJpZXNTdG9yZSA9IFtdXG4vKiogQHR5cGUgeygocGF5bG9hZDogaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQpID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duKSB8IG51bGx9ICovXG5sZXQgZGVsaXZlcnlIYW5kbGVyID0gbnVsbFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gTWFpbGVyIGFjdGlvbiBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gLSBWaWV3IGZpbGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gdmlld0ZpbGVOYW1lKGFjdGlvbk5hbWUpIHtcbiAgcmV0dXJuIGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShhY3Rpb25OYW1lKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gTWFpbGVyIGNsYXNzIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE1haWxlciBkaXJlY3RvcnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbWFpbGVyRGlyZWN0b3J5TmFtZShjbGFzc05hbWUpIHtcbiAgY29uc3QgYmFzZU5hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgvTWFpbGVyJC8sIFwiXCIpXG5cbiAgcmV0dXJuIGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShiYXNlTmFtZSkpXG59XG5cbi8qKlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyB0ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBpc1Rlc3RpbmdFbnZpcm9ubWVudCgpIHtcbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGNvbmZpZ3VyYXRpb25SZXNvbHZlcigpXG5cbiAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCJcbn1cblxuLyoqXG4gKiBCYXNlIG1haWxlciB3aXRoIHZpZXcgcmVuZGVyaW5nIGFuZCBkZWxpdmVyeSBoZWxwZXJzLlxuICovXG5leHBvcnQgY2xhc3MgVmVsb2Npb3VzTWFpbGVyQmFzZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gQ29uc3RydWN0b3IgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9ufSA9IHt9KSB7XG4gICAgdGhpcy5fYWN0aW9uTmFtZSA9IG51bGxcbiAgICB0aGlzLl9tYWlsT3B0aW9ucyA9IG51bGxcbiAgICB0aGlzLl92aWV3UGFyYW1zID0ge31cbiAgICB0aGlzLl9jb25maWd1cmF0aW9uUHJvbWlzZSA9IGNvbmZpZ3VyYXRpb24gPyBQcm9taXNlLnJlc29sdmUoY29uZmlndXJhdGlvbikgOiBjb25maWd1cmF0aW9uUmVzb2x2ZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGFyYW1zIC0gVmlldyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFzc2lnblZpZXcocGFyYW1zKSB7XG4gICAgdGhpcy5fdmlld1BhcmFtcyA9IE9iamVjdC5hc3NpZ24odGhpcy5fdmlld1BhcmFtcywgcGFyYW1zIHx8IHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTWFpbCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2FueX0gYXJncy50byAtIFJlY2lwaWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3ViamVjdCAtIFN1YmplY3QgbGluZS5cbiAgICogQHBhcmFtIHthbnl9IFthcmdzLmZyb21dIC0gU2VuZGVyLlxuICAgKiBAcGFyYW0ge2FueX0gW2FyZ3MuY2NdIC0gQ0MgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIHthbnl9IFthcmdzLmJjY10gLSBCQ0MgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIHthbnl9IFthcmdzLnJlcGx5VG9dIC0gUmVwbHktdG8gYWRkcmVzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbYXJncy5oZWFkZXJzXSAtIEN1c3RvbSBoZWFkZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb25OYW1lIC0gTWFpbGVyIGFjdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0ge1Byb21pc2U8dW5rbm93bj4gfCB1bmtub3dufSBbYXJncy5hY3Rpb25Qcm9taXNlXSAtIEFjdGlvbiBjb21wbGV0aW9uIHByb21pc2UuXG4gICAqIEByZXR1cm5zIHtNYWlsZXJEZWxpdmVyeX0gLSBEZWxpdmVyeSB3cmFwcGVyLlxuICAgKi9cbiAgbWFpbCh7dG8sIHN1YmplY3QsIGZyb20sIGNjLCBiY2MsIHJlcGx5VG8sIGhlYWRlcnMsIGFjdGlvbk5hbWUsIGFjdGlvblByb21pc2UsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIWFjdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb25OYW1lIGZvciAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubWFpbCgpYClcbiAgICB9XG5cbiAgICB0aGlzLl9hY3Rpb25OYW1lID0gYWN0aW9uTmFtZVxuICAgIHRoaXMuX21haWxPcHRpb25zID0ge3RvLCBzdWJqZWN0LCBmcm9tLCBjYywgYmNjLCByZXBseVRvLCBoZWFkZXJzfVxuICAgIGNvbnN0IHJlc29sdmVkQWN0aW9uUHJvbWlzZSA9IGFjdGlvblByb21pc2UgPT09IHVuZGVmaW5lZCA/IFByb21pc2UucmVzb2x2ZSgpIDogUHJvbWlzZS5yZXNvbHZlKGFjdGlvblByb21pc2UpXG5cbiAgICByZXR1cm4gbmV3IE1haWxlckRlbGl2ZXJ5KHtcbiAgICAgIG1haWxlcjogdGhpcyxcbiAgICAgIGFjdGlvblByb21pc2U6IHJlc29sdmVkQWN0aW9uUHJvbWlzZSxcbiAgICAgIGFjdGlvbk5hbWVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdD59IC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIF9nZXRDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uUHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQWN0aW9uIG5hbWUuXG4gICAqL1xuICBfZ2V0QWN0aW9uTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuX2FjdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWFpbGVyIGFjdGlvbiBzZXQgb24gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gUmVuZGVyZWQgSFRNTC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSAtIERlbGl2ZXJ5IHBheWxvYWQuXG4gICAqL1xuICBfYnVpbGRQYXlsb2FkU3luYyhodG1sKSB7XG4gICAgY29uc3QgbWFpbE9wdGlvbnMgPSB0aGlzLl9tYWlsT3B0aW9uc1xuXG4gICAgaWYgKCFtYWlsT3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwoKSBvcHRpb25zIGZvciAke3RoaXMuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLl9nZXRBY3Rpb25OYW1lKCl9LiBHb3Q6ICR7U3RyaW5nKG1haWxPcHRpb25zKX1gKVxuICAgIH1cblxuICAgIGlmICghbWFpbE9wdGlvbnMudG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcInRvXCIgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMuX2dldEFjdGlvbk5hbWUoKX0uIEdvdDogJHtTdHJpbmcobWFpbE9wdGlvbnMudG8pfWApXG4gICAgfVxuXG4gICAgaWYgKCFtYWlsT3B0aW9ucy5zdWJqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCJzdWJqZWN0XCIgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMuX2dldEFjdGlvbk5hbWUoKX0uIEdvdDogJHtTdHJpbmcobWFpbE9wdGlvbnMuc3ViamVjdCl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG86IG1haWxPcHRpb25zLnRvLFxuICAgICAgc3ViamVjdDogbWFpbE9wdGlvbnMuc3ViamVjdCxcbiAgICAgIGZyb206IG1haWxPcHRpb25zLmZyb20sXG4gICAgICBjYzogbWFpbE9wdGlvbnMuY2MsXG4gICAgICBiY2M6IG1haWxPcHRpb25zLmJjYyxcbiAgICAgIHJlcGx5VG86IG1haWxPcHRpb25zLnJlcGx5VG8sXG4gICAgICBoZWFkZXJzOiBtYWlsT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgaHRtbCxcbiAgICAgIG1haWxlcjogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgYWN0aW9uOiB0aGlzLl9nZXRBY3Rpb25OYW1lKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQ+fSAtIERlbGl2ZXJ5IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBfYnVpbGRQYXlsb2FkKCkge1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLl9yZW5kZXJWaWV3KClcblxuICAgIHJldHVybiB0aGlzLl9idWlsZFBheWxvYWRTeW5jKGh0bWwpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZW5kZXJlZCBIVE1MLlxuICAgKi9cbiAgYXN5bmMgX3JlbmRlclZpZXcoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IHRoaXMuX2dldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IG1haWxlckRpciA9IG1haWxlckRpcmVjdG9yeU5hbWUodGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgIGNvbnN0IGFjdGlvbk5hbWUgPSB0aGlzLl9nZXRBY3Rpb25OYW1lKClcbiAgICBjb25zdCBmaWxlTmFtZSA9IHZpZXdGaWxlTmFtZShhY3Rpb25OYW1lKVxuICAgIGNvbnN0IHZpZXdQYXRoID0gYCR7Y29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL21haWxlcnMvJHttYWlsZXJEaXJ9LyR7ZmlsZU5hbWV9LmVqc2BcbiAgICBjb25zdCB0cmFuc2xhdGUgPSAobXNnSUQsIGFyZ3MpID0+IGNvbmZpZ3VyYXRpb24uZ2V0VHJhbnNsYXRvcigpKG1zZ0lELCBhcmdzKVxuICAgIGNvbnN0IHZpZXdQYXJhbXMgPSBpbmNvcnBvcmF0ZSh7bWFpbGVyOiB0aGlzLCBfOiB0cmFuc2xhdGV9LCB0aGlzLl92aWV3UGFyYW1zKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGVqcy5yZW5kZXJGaWxlKHZpZXdQYXRoLCB2aWV3UGFyYW1zLCB7fSwgKGVyciwgc3RyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSAvKiogQHR5cGUge3tjb2RlPzogc3RyaW5nfX0gKi8gKGVycikuY29kZVxuXG4gICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gXCJFTk9FTlRcIikge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBtYWlsZXIgdmlldyBmaWxlOiAke3ZpZXdQYXRofWApKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHN0cilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgdW5rbm93bj59IC0gSGFuZGxlciByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfZGVsaXZlclBheWxvYWQocGF5bG9hZCkge1xuICAgIHJldHVybiBhd2FpdCBkZWxpdmVyUGF5bG9hZChwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICAgKi9cbiAgYXN5bmMgX2VucXVldWVQYXlsb2FkKHBheWxvYWQpIHtcbiAgICByZXR1cm4gYXdhaXQgZW5xdWV1ZVBheWxvYWQocGF5bG9hZClcbiAgfVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZFtdfSAtIERlbGl2ZXJlZCBwYXlsb2Fkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGl2ZXJpZXMoKSB7XG4gIHJldHVybiBkZWxpdmVyaWVzU3RvcmUuc2xpY2UoKVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRGVsaXZlcmllcygpIHtcbiAgZGVsaXZlcmllc1N0b3JlLmxlbmd0aCA9IDBcbn1cblxuLyoqXG4gKiBAcGFyYW0geyhwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTx1bmtub3duPiB8IHVua25vd259IGhhbmRsZXIgLSBEZWxpdmVyeSBoYW5kbGVyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVsaXZlcnlIYW5kbGVyKGhhbmRsZXIpIHtcbiAgZGVsaXZlcnlIYW5kbGVyID0gaGFuZGxlclxufVxuXG4vKipcbiAqIEByZXR1cm5zIHsocGF5bG9hZDogaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQpID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duIHwgbnVsbH0gLSBIYW5kbGVyIG9yIG51bGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxpdmVyeUhhbmRsZXIoKSB7XG4gIHJldHVybiBkZWxpdmVyeUhhbmRsZXJcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBwYXlsb2FkIC0gTWFpbCBkZWxpdmVyeSBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQgfCB1bmtub3duPn0gLSBIYW5kbGVyIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXJQYXlsb2FkKHBheWxvYWQpIHtcbiAgaWYgKGF3YWl0IGlzVGVzdGluZ0Vudmlyb25tZW50KCkpIHtcbiAgICBkZWxpdmVyaWVzU3RvcmUucHVzaChwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgY29uc3QgYmFja2VuZCA9IGNvbmZpZ3VyYXRpb24uZ2V0TWFpbGVyQmFja2VuZCgpXG5cbiAgaWYgKGJhY2tlbmQ/LmRlbGl2ZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgYmFja2VuZC5kZWxpdmVyKHtwYXlsb2FkLCBjb25maWd1cmF0aW9ufSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBkZWxpdmVyeUhhbmRsZXJcblxuICBpZiAoIWhhbmRsZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1haWwgZGVsaXZlcnkgaGFuZGxlciBjb25maWd1cmVkIGZvciBcIiR7cGF5bG9hZC5zdWJqZWN0fVwiIHRvIFwiJHtwYXlsb2FkLnRvfVwiYClcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBoYW5kbGVyKHBheWxvYWQpXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gcGF5bG9hZCAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5xdWV1ZVBheWxvYWQocGF5bG9hZCkge1xuICBpZiAoYXdhaXQgaXNUZXN0aW5nRW52aXJvbm1lbnQoKSkge1xuICAgIGRlbGl2ZXJpZXNTdG9yZS5wdXNoKHBheWxvYWQpXG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIGNvbnN0IHtkZWZhdWx0OiBtYWlsRGVsaXZlcnlKb2J9ID0gYXdhaXQgaW1wb3J0KFwiLi4vam9icy9tYWlsLWRlbGl2ZXJ5LmpzXCIpXG5cbiAgcmV0dXJuIGF3YWl0IG1haWxEZWxpdmVyeUpvYi5wZXJmb3JtTGF0ZXIocGF5bG9hZClcbn1cbiJdfQ==
|