obsidian-dev-utils 101.6.0 → 101.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/integration-test-plugin/main.js +4410 -3705
- package/dist/lib/cjs/__merged.cjs +26 -1
- package/dist/lib/cjs/__merged.d.cts +4 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +14 -1
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +11 -0
- package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/plugin-gate-component.cjs +520 -0
- package/dist/lib/cjs/obsidian/components/plugin-gate-component.d.cts +299 -0
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.cjs +17 -38
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.d.cts +25 -18
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +7 -2
- package/dist/lib/cjs/obsidian/css-class.cjs +3 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +9 -0
- package/dist/lib/cjs/obsidian/html-element.cjs +27 -3
- package/dist/lib/cjs/obsidian/html-element.d.cts +36 -0
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +15 -1
- package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +14 -0
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +14 -0
- package/dist/lib/cjs/obsidian/plugin/index.cjs +7 -1
- package/dist/lib/cjs/obsidian/plugin/index.d.cts +2 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-api.cjs +2 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-api.d.cts +34 -15
- package/dist/lib/cjs/obsidian/plugin/plugin-install-state.cjs +208 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-install-state.d.cts +113 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.cjs +161 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.d.cts +119 -0
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +241 -21
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +133 -4
- package/dist/lib/esm/__merged.d.mts +4 -1
- package/dist/lib/esm/__merged.mjs +30 -2
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +11 -0
- package/dist/lib/esm/obsidian/components/component-ex.mjs +14 -1
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/plugin-gate-component.d.mts +299 -0
- package/dist/lib/esm/obsidian/components/plugin-gate-component.mjs +428 -0
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.d.mts +25 -18
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.mjs +21 -41
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +7 -2
- package/dist/lib/esm/obsidian/css-class.d.mts +9 -0
- package/dist/lib/esm/obsidian/css-class.mjs +3 -1
- package/dist/lib/esm/obsidian/html-element.d.mts +36 -0
- package/dist/lib/esm/obsidian/html-element.mjs +24 -2
- package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +14 -0
- package/dist/lib/esm/obsidian/i18n/locales/en.mjs +15 -1
- package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +14 -0
- package/dist/lib/esm/obsidian/plugin/index.d.mts +2 -0
- package/dist/lib/esm/obsidian/plugin/index.mjs +5 -1
- package/dist/lib/esm/obsidian/plugin/plugin-api.d.mts +34 -15
- package/dist/lib/esm/obsidian/plugin/plugin-api.mjs +2 -2
- package/dist/lib/esm/obsidian/plugin/plugin-install-state.d.mts +113 -0
- package/dist/lib/esm/obsidian/plugin/plugin-install-state.mjs +106 -0
- package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.d.mts +119 -0
- package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.mjs +54 -0
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +133 -4
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +245 -21
- package/obsidian/components/plugin-gate-component/package.json +6 -0
- package/obsidian/plugin/plugin-install-state/package.json +6 -0
- package/obsidian/plugin/plugin-lifecycle-events/package.json +6 -0
- package/package.json +1 -1
|
@@ -336,7 +336,7 @@ function publishPluginApi(params) {
|
|
|
336
336
|
};
|
|
337
337
|
records.push(record);
|
|
338
338
|
notifySubscribers();
|
|
339
|
-
params.plugin.register(() => {
|
|
339
|
+
(params.component ?? params.plugin).register(() => {
|
|
340
340
|
revokeRecord(record);
|
|
341
341
|
});
|
|
342
342
|
}
|
|
@@ -528,4 +528,4 @@ function validatePayload(params) {
|
|
|
528
528
|
publishPluginApi,
|
|
529
529
|
watchPluginApi
|
|
530
530
|
});
|
|
531
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpTWV0aG9kQ29udHJhY3Qge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBcdTIwMTQgb3IsIHdoZW4gdGhlIG1ldGhvZCByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSB2YWx1ZSBpdCByZXNvbHZlcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dD86IFN0YW5kYXJkU2NoZW1hVjE7XG59XG5cbi8qKlxuICogQSBsaXZlIHJlZmVyZW5jZSB0byBhbm90aGVyIHBsdWdpbidzIEFQSS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSByZWYgaXMgdGhlIFdIT0xFIGNvbnN1bWVyIHN1cmZhY2UsIGRlbGliZXJhdGVseS4gQSBwbGFpbiB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IG1vZGVsIHRoaXMgYmVjYXVzZSBpdFxuICogc2V0dGxlcyBvbmNlLCB3aGVyZWFzIGF2YWlsYWJpbGl0eSBpcyBhIHJlcGVhdGluZyBzaWduYWwgKGF2YWlsYWJsZSBcdTIxOTIgZ29uZSBcdTIxOTIgYXZhaWxhYmxlIGFnYWluIGFjcm9zcyBhXG4gKiBkaXNhYmxlL2VuYWJsZSBjeWNsZSkgXHUyMDE0IHdoaWNoIGlzIHdoeSB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9IGlzIGEgbWV0aG9kIE9OIHRoZSByZWYgcmF0aGVyIHRoYW5cbiAqIHRoZSB0aGluZyBoYW5kZWQgYmFjay4gVGhlIGBjaGFuZ2VgIGV2ZW50IGV4aXN0cyBmb3IgY29uc3VtZXJzIHRoYXQgbXVzdCByZWFjdCByYXRoZXIgdGhhbiByZWFkLCBhbmQgaXNcbiAqIHNlY29uZGFyeTogaXQgaW1wb3NlcyBubyBjZXJlbW9ueSBvbiB0aGUgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHJlYWRpbmcge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5BcGlSZWZFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIEFQSSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEFsd2F5cyBjdXJyZW50LCBzeW5jaHJvbm91cywgYW5kIGZyZWUgXHUyMDE0IHRoZSByZWYgbWFpbnRhaW5zIGl0LCBzbyB0aGVyZSBpcyBubyByZWdpc3RyeSBsb29rdXAgcGVyIHJlYWQuXG4gICAqIGBudWxsYCBoZXJlIG1lYW5zIFwibm90IGF2YWlsYWJsZSByaWdodCBub3dcIiwgTk9UIFwibm90IGluc3RhbGxlZFwiOiBkdXJpbmcgYSBjb25zdW1lcidzIGBvbmxvYWRgIHRoZVxuICAgKiBwcm92aWRlciBtYXkgc2ltcGx5IG5vdCBoYXZlIGxvYWRlZCB5ZXQsIGFuZCB0aGUgdmFsdWUgYmVjb21lcyBub24tYG51bGxgIG9uIGl0cyBvd24uXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogbnVsbCB8IFRBcGk7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgQVBJIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3YWl0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEFQSS5cbiAgICogQHRocm93cyBBIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yfSB3aG9zZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvci5yZWFzb259IHNheXMgd2hpY2ggb2ZcbiAgICogdGhlIGZpdmUgZmFpbHVyZXMgb2NjdXJyZWQsIGlmIHRoZSBBUEkgZG9lcyBub3QgYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgdGhlIHRpbWVvdXQgZWxhcHNlcy5cbiAgICovXG4gIHdoZW5BdmFpbGFibGUob3B0aW9ucz86IFdoZW5BdmFpbGFibGVQbHVnaW5BcGlPcHRpb25zKTogUHJvbWlzZTxUQXBpPjtcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnRzIGEge0BsaW5rIFBsdWdpbkFwaVJlZn0gZmlyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmRXZlbnRNYXAge1xuICAvKipcbiAgICogRmlyZWQgd2hlbmV2ZXIge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gY2hhbmdlcyBcdTIwMTQgaW5jbHVkaW5nIHdoZW4gaXQgYmVjb21lcyBgbnVsbGAgYmVjYXVzZSB0aGUgcHJvdmlkZXJcbiAgICogdW5sb2FkZWQuXG4gICAqL1xuICBjaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGV4cGxpY2l0IG1lc3NhZ2UuIFdoZW4gb21pdHRlZCwgb25lIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGx1Z2luIGlkIGFuZCB0aGUgcmVhc29uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGlzc3VlcyB0aGUgc2NoZW1hIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHVibGlzaFBsdWdpbkFwaX0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIGJlaW5nIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgb2JqZWN0IHRvIHB1Ymxpc2guIEl0cyBtZXRob2RzIGFyZSBoYW5kZWQgdG8gY29uc3VtZXJzIHRocm91Z2ggYSByZXZvY2FibGUgaGFuZGxlLCBhbmQgdGhleSBhcmVcbiAgICogYWx3YXlzIGludm9rZWQgd2l0aCB0aGlzIG9iamVjdCBhcyB0aGVpciBgdGhpc2AsIHNvIGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIHByaXZhdGUgY2xhc3MgZmllbGRzIGtlZXBzXG4gICAqIHdvcmtpbmcuXG4gICAqL1xuICByZWFkb25seSBhcGk6IFRBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBDT05UUkFDVCB2ZXJzaW9uLCBpbiBzZW12ZXIgZm9ybSBcdTIwMTQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsdWdpbidzIG93biB2ZXJzaW9uLiBQbHVnaW4gYDEuNC43YCBtYXlcbiAgICogcGVyZmVjdGx5IHdlbGwgZXhwb3NlIEFQSSBgMi4wLjBgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udHJhY3QgdGhpcyB2ZXJzaW9uIG9mIHRoZSBBUEkgc2F0aXNmaWVzLiBPcHRpb25hbDogd2hlbiBvbWl0dGVkLCBubyBzaGFwZSBjaGVjayBpcyBwZXJmb3JtZWQgb25cbiAgICogdGhlIHByb3ZpZGVyJ3MgYmVoYWxmIGFuZCB0aGUgY29uc3VtZXIncyBvd24gY29udHJhY3QgKGlmIGFueSkgaXMgdXNlZCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIHB1Ymxpc2hpbmcgcGx1Z2luLiBUaGUgcmVjb3JkIGlzIGtleWVkIGJ5IGl0cyBgbWFuaWZlc3QuaWRgIGFuZCByZXZva2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luXG4gICAqIHVubG9hZHMsIHZpYSBgcGx1Z2luLnJlZ2lzdGVyKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHdhdGNoUGx1Z2luQXBpfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaFBsdWdpbkFwaVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIGNvbnRyYWN0IHZlcnNpb25zIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC4gVGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gICAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCB3aW5zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgcmFuZ2UgaXMgZXZhbHVhdGVkIGJ5IGBjb21wYXJlLXZlcnNpb25zYCwgd2hpY2ggYWNjZXB0cyBgXmAsIGB+YCwgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGFuZCBgeGBcbiAgICogd2lsZGNhcmRzIFx1MjAxNCBidXQgTk9UIGEgYmFyZSBgKmAuIFNwZWxsIFwiYW55IHZlcnNpb25cIiBhcyBgJz49MC4wLjAnYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb25SYW5nZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLCB1c2VkIHRvIGNsYXNzaWZ5IGEgZmFpbHVyZSBhcyBub3QtaW5zdGFsbGVkIHZzIG5vdC1lbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgb3duaW5nIHRoZSBzdWJzY3JpcHRpb24uIFRoZSB3YXRjaCBpcyB0b3JuIGRvd24gd2hlbiBpdCB1bmxvYWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGUgQ09OU1VNRVIgZXhwZWN0cy4gT3B0aW9uYWwsIGFuZCBpdCB3aW5zIG92ZXIgdGhlIHByb3ZpZGVyJ3MgcHVibGlzaGVkIGNvbnRyYWN0IHdoZW5cbiAgICogc3VwcGxpZWQgXHUyMDE0IGl0IGlzIHRoZSBjb25zdW1lcidzIG93biBjb21waWxlZC1hZ2FpbnN0IGV4cGVjdGF0aW9uLCBzbyBpdCBpcyB0aGUgb25lIHdob3NlIHZpb2xhdGlvbiBpc1xuICAgKiB0aGUgY29uc3VtZXIncyBwcm9ibGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTWV0aG9kV3JhcHBlcn0uXG4gKi9cbmludGVyZmFjZSBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kQ29udHJhY3Q6IFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBkZWJ1ZyBvdXRwdXQuIE5PVCBhIGtleSBcdTIwMTQgc2VlIHtAbGluayBwcm9wZXJ0eUtleX0uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtleSB0aGUgbWV0aG9kIGlzIGFjdHVhbGx5IHJlYWQgYnksIHdoaWNoIG1heSBiZSBhIHN5bWJvbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnR5S2V5OiBQcm9wZXJ0eUtleTtcblxuICByZWFkb25seSB0YXJnZXQ6IG9iamVjdDtcbn1cblxuLyoqXG4gKiBUaGUgcmVhbG0tZ2xvYmFsIHJlZ2lzdHJ5IHNoYXJlZCBieSBldmVyeSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3B5IGluIHRoZSByZW5kZXJlci5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgcmVjb3JkczogUmVjb3JkPHN0cmluZywgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10+O1xuICBzdWJzY3JpYmVyczogKCgpID0+IHZvaWQpW107XG59XG5cbi8qKlxuICogQSByZWNvcmQgYXMgaXQgc2l0cyBpbiB0aGUgc2hhcmVkIHJlZ2lzdHJ5LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGlzIHRoZSBXSVJFIEZPUk1BVCBiZXR3ZWVuIGRpZmZlcmVudCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3BpZXMsIHNvIGl0IGhvbGRzIG5vdGhpbmcgYnV0IHBsYWluIGRhdGFcbiAqIGFuZCBwbGFpbiBmdW5jdGlvbnMsIGFuZCBldmVyeSByZWFkIG9mIGl0IGVsc2V3aGVyZSBpbiB0aGlzIGZpbGUgaXMgc3RydWN0dXJhbC5cbiAqL1xuaW50ZXJmYWNlIFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCB7XG4gIGFwaTogb2JqZWN0O1xuICBhcGlWZXJzaW9uOiBzdHJpbmc7XG4gIGNvbnRyYWN0OiBQbHVnaW5BcGlDb250cmFjdDtcbiAgaXNSZXZva2VkOiBib29sZWFuO1xuICBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB2YWxpZGF0ZVBheWxvYWR9LlxuICovXG5pbnRlcmZhY2UgVmFsaWRhdGVQYXlsb2FkUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjaGVtYTogU3RhbmRhcmRTY2hlbWFWMTtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSG9sZHMgd2hhdCBhIHdhdGNoIG5lZWRzIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0eXBlIGl0IGlzIHR5cGVkIGFnYWluc3QsIHNvIHRoZSB7QGxpbmsgbWl4aW5Bc3luY0V2ZW50c31cbiAqIG1peGluIGhhcyBhIHJlYWwgYmFzZSB0byBleHRlbmQuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFBsdWdpbkFwaVdhdGNoQmFzZSB7XG4gIHByb3RlY3RlZCBoYW5kbGU6IG51bGwgfCBvYmplY3QgPSBudWxsO1xuXG4gIHByb3RlY3RlZCByZWNvcmQ6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSBudWxsO1xuXG4gIC8vIEEgYHByb3RlY3RlZGAgY29uc3RydWN0b3IgaXMgbm90IGFzc2lnbmFibGUgdG8gYEFic3RyYWN0Q29uc3RydWN0b3I8b2JqZWN0PmAsIHdoaWNoIGlzIHdoYXRcbiAgLy8gYG1peGluQXN5bmNFdmVudHNgIGFjY2VwdHMsIHNvIHRoaXMgc3RheXMgcHVibGljIGV2ZW4gdGhvdWdoIG9ubHkgdGhlIHN1YmNsYXNzIGJlbG93IGNhbGxzIGl0LlxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZXJyb3IgZGVzY3JpYmluZyB3aHkgdGhlIEFQSSBpcyBub3QgYXZhaWxhYmxlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNsYXNzaWZpZWQgZXJyb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpOiBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ioe1xuICAgICAgcGx1Z2luSWQ6IHRoaXMucGFyYW1zLnBsdWdpbklkLFxuICAgICAgcmVhc29uOiByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24odGhpcy5wYXJhbXMpXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUGx1Z2luQXBpUmVmSW1wbDxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luQXBpUmVmRXZlbnRNYXA+KCkoUGx1Z2luQXBpV2F0Y2hCYXNlKSBpbXBsZW1lbnRzIFBsdWdpbkFwaVJlZjxUQXBpPiB7XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogbnVsbCB8IFRBcGkge1xuICAgIHJldHVybiBjYXN0VG88bnVsbCB8IFRBcGk+KHRoaXMuaGFuZGxlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFdhdGNoUGx1Z2luQXBpUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGVzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIHJlZ2lzdHJ5LCBmaXJpbmcgYGNoYW5nZWAgb25seSB3aGVuIGl0IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQgPSBzZWxlY3RSZWNvcmQodGhpcy5wYXJhbXMpO1xuICAgIGlmIChyZWNvcmQgPT09IHRoaXMucmVjb3JkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgdGhpcy5oYW5kbGUgPSByZWNvcmQgPT09IG51bGwgPyBudWxsIDogY3JlYXRlUmV2b2NhYmxlSGFuZGxlKHJlY29yZCwgdGhpcy5wYXJhbXMuY29udHJhY3QpO1xuICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgd2hlbkF2YWlsYWJsZShvcHRpb25zPzogV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMpOiBQcm9taXNlPFRBcGk+IHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChjdXJyZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5XaXRoVGltZW91dDxUQXBpPih7XG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBhc3luYyAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiA9PiBhd2FpdCB0aGlzLndhaXRGb3JWYWx1ZShhYm9ydFNpZ25hbCksXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IGB3YXRjaFBsdWdpbkFwaShcIiR7dGhpcy5wYXJhbXMucGx1Z2luSWR9XCIpLndoZW5BdmFpbGFibGVgLFxuICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnM/LnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dIRU5fQVZBSUxBQkxFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclZhbHVlKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VEFwaT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxUQXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCBGSVJTVCBhbmQgaW52b2tlZCB0aHJvdWdoIGEgdGh1bmssIHNvIGBldmVudFJlZmAgaXMgYWxyZWFkeSBib3VuZCBieSB0aGVcbiAgICAgIC8vIFRpbWUgYW55dGhpbmcgY2FuIHJlYWNoIGl0IFx1MjAxNCB3aGljaCBpcyB3aGF0IGxldHMgYGNsZWFuVXBgIGJlIHVuY29uZGl0aW9uYWwgcmF0aGVyIHRoYW4gbnVsbC1ndWFyZGVkLlxuICAgICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKTogdm9pZCB7XG4gICAgICAgIGV2ZW50UmVmLmFzeW5jRXZlbnRTb3VyY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgICAgYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBoYW5kbGVBYm9ydCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUFib3J0KCk6IHZvaWQge1xuICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgIHJlamVjdChhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwbHVnaW4gQVBJIGNhbm5vdCBiZSBoYW5kZWQgb3ZlciwgY2FycnlpbmcgdGhlIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbn0gdGhhdCBzYXlzXG4gKiB3aHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5tZXNzYWdlID8/IGBUaGUgQVBJIG9mIHRoZSBwbHVnaW4gXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBpcyB1bmF2YWlsYWJsZTogJHtwYXJhbXMucmVhc29ufS5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcic7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnJlYXNvbiA9IHBhcmFtcy5yZWFzb247XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHByb3BlcnR5IGlzIHJlYWQgZnJvbSBhIGhhbmRsZSB3aG9zZSBwcm92aWRlciBoYXMgc2luY2UgdW5sb2FkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgcG9pbnQgb2YgaGFuZGluZyBvdXQgYSByZXZvY2FibGUgaGFuZGxlIHJhdGhlciB0aGFuIHRoZSByYXcgb2JqZWN0OiBhIGNvbnN1bWVyIHRoYXQgY2FjaGVkIHRoZVxuICogQVBJIGluIGEgZmllbGQgYW5kIGtlcHQgdXNpbmcgaXQgYWNyb3NzIGEgZGlzYWJsZSBnZXRzIGFuIGVycm9yIG5hbWluZyB0aGUgcHJvdmlkZXIsIGluc3RlYWQgb2ZcbiAqIGBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZGAgc29tZXdoZXJlIGRlZXAgaW5zaWRlIGEgdG9ybi1kb3duIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVJldm9rZWRFcnJvciBleHRlbmRzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlSZXZva2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmV2b2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGJlZW4gcmV2b2tlZCwgYmVjYXVzZSB0aGUgcGx1Z2luIHdhcyB1bmxvYWRlZC5gLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWRcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpUmV2b2tlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHVibGlzaGVkIEFQSSdzIHBheWxvYWQgZmFpbHMgdGhlIHNjaGVtYSBpdHMgY29udHJhY3QgZGVjbGFyZXMuXG4gKlxuICogT25seSBldmVyIHRocm93biB3aGlsZSB0aGUgYG9ic2lkaWFuLWRldi11dGlsczpQbHVnaW5BcGlgIGRlYnVnZ2VyIGlzIGVuYWJsZWQgXHUyMDE0IGluIHByb2R1Y3Rpb24gdGhlIG1ldGhvZHNcbiAqIGFyZSBub3Qgd3JhcHBlZCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgaXNzdWVzIHRoZSBzY2hlbWEgcmVwb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKFxuICAgICAgYFRoZSAke3BhcmFtcy5wYXlsb2FkS2luZH0gb2YgXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBBUEkgbWV0aG9kIFwiJHtwYXJhbXMubWV0aG9kTmFtZX1cIiBmYWlsZWQgdmFsaWRhdGlvbjogJHtmb3JtYXRJc3N1ZXMocGFyYW1zLmlzc3Vlcyl9YFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1BsdWdpbkFwaVZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5pc3N1ZXMgPSBwYXJhbXMuaXNzdWVzO1xuICAgIHRoaXMubWV0aG9kTmFtZSA9IHBhcmFtcy5tZXRob2ROYW1lO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBwbHVnaW4ncyBBUEkgc28gb3RoZXIgcGx1Z2lucyBjYW4gY29uc3VtZSBpdCwga2V5ZWQgYnkgdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gKlxuICogU2V2ZXJhbCBjb250cmFjdCB2ZXJzaW9ucyBtYXkgYmUgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgc28gYSBwcm92aWRlciBjYW4gbW92ZSB0byBgMi4wLjBgIHdpdGhvdXQgYnJlYWtpbmdcbiAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgcHVibGlzaGVkLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nLlxuICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoaXMgcGx1Z2luIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGlzIGV4YWN0IGBhcGlWZXJzaW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQbHVnaW5BcGk8VEFwaSBleHRlbmRzIG9iamVjdD4ocGFyYW1zOiBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGk+KTogdm9pZCB7XG4gIGNvbnN0IHBsdWdpbklkID0gcGFyYW1zLnBsdWdpbi5tYW5pZmVzdC5pZDtcbiAgY29uc3QgcmVnaXN0cnkgPSBnZXRSZWdpc3RyeSgpO1xuICBjb25zdCByZWNvcmRzID0gcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW107XG4gIHJlZ2lzdHJ5LnJlY29yZHNbcGx1Z2luSWRdID0gcmVjb3JkcztcblxuICBpZiAocmVjb3Jkcy5zb21lKChyZWNvcmQpID0+IHJlY29yZC5hcGlWZXJzaW9uID09PSBwYXJhbXMuYXBpVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgQVBJIHZlcnNpb24gXCIke3BhcmFtcy5hcGlWZXJzaW9ufVwiLmApO1xuICB9XG5cbiAgY29uc3QgcmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSB7XG4gICAgYXBpOiBwYXJhbXMuYXBpLFxuICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgIGNvbnRyYWN0OiBwYXJhbXMuY29udHJhY3QgPz8ge30sXG4gICAgaXNSZXZva2VkOiBmYWxzZSxcbiAgICBwbHVnaW5JZFxuICB9O1xuICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcblxuICBwYXJhbXMucGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3Mi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
|
|
531
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogT25lIEFQSSBhIHBsdWdpbiBleHBvc2VzOiB0aGUgb2JqZWN0LCB0aGUgY29udHJhY3QgdmVyc2lvbiBpdCBzYXRpc2ZpZXMsIGFuZCBvcHRpb25hbGx5IHRoZSBjb250cmFjdFxuICogaXRzZWxmLiBUaGlzIGlzIHtAbGluayBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zfSB3aXRob3V0IHRoZSBwdWJsaXNoaW5nIHBsdWdpbiwgc28gYSBwbHVnaW4gY2FuIERFQ0xBUkUgd2hhdFxuICogaXQgZXhwb3NlcyB3aXRob3V0IGFsc28gc3RhdGluZyB3aG8gaXMgcHVibGlzaGluZyBpdCBcdTIwMTQgd2hpY2ggaXMgd2hhdCBsZXRzIGBQbHVnaW5CYXNlLmdldFBsdWdpbkFwaXNgIGNvbGxlY3RcbiAqIHRoZSBkZWNsYXJhdGlvbnMgYW5kIGRvIHRoZSBwdWJsaXNoaW5nIGl0c2VsZi5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgZGVjbGFyZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpRGVjbGFyYXRpb248VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIEFQSSBvYmplY3QgdG8gcHVibGlzaC4gSXRzIG1ldGhvZHMgYXJlIGhhbmRlZCB0byBjb25zdW1lcnMgdGhyb3VnaCBhIHJldm9jYWJsZSBoYW5kbGUsIGFuZCB0aGV5IGFyZVxuICAgKiBhbHdheXMgaW52b2tlZCB3aXRoIHRoaXMgb2JqZWN0IGFzIHRoZWlyIGB0aGlzYCwgc28gYW4gaW1wbGVtZW50YXRpb24gdXNpbmcgcHJpdmF0ZSBjbGFzcyBmaWVsZHMga2VlcHNcbiAgICogd29ya2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGFwaTogVEFwaTtcblxuICAvKipcbiAgICogVGhlIENPTlRSQUNUIHZlcnNpb24sIGluIHNlbXZlciBmb3JtIFx1MjAxNCBpbmRlcGVuZGVudCBvZiB0aGUgcGx1Z2luJ3Mgb3duIHZlcnNpb24uIFBsdWdpbiBgMS40LjdgIG1heVxuICAgKiBwZXJmZWN0bHkgd2VsbCBleHBvc2UgQVBJIGAyLjAuMGAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGlzIHZlcnNpb24gb2YgdGhlIEFQSSBzYXRpc2ZpZXMuIE9wdGlvbmFsOiB3aGVuIG9taXR0ZWQsIG5vIHNoYXBlIGNoZWNrIGlzIHBlcmZvcm1lZCBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBiZWhhbGYgYW5kIHRoZSBjb25zdW1lcidzIG93biBjb250cmFjdCAoaWYgYW55KSBpcyB1c2VkIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgXHUyMDE0IG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xufVxuXG4vKipcbiAqIEEgbGl2ZSByZWZlcmVuY2UgdG8gYW5vdGhlciBwbHVnaW4ncyBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVmIGlzIHRoZSBXSE9MRSBjb25zdW1lciBzdXJmYWNlLCBkZWxpYmVyYXRlbHkuIEEgcGxhaW4ge0BsaW5rIFByb21pc2V9IGNhbm5vdCBtb2RlbCB0aGlzIGJlY2F1c2UgaXRcbiAqIHNldHRsZXMgb25jZSwgd2hlcmVhcyBhdmFpbGFiaWxpdHkgaXMgYSByZXBlYXRpbmcgc2lnbmFsIChhdmFpbGFibGUgXHUyMTkyIGdvbmUgXHUyMTkyIGF2YWlsYWJsZSBhZ2FpbiBhY3Jvc3MgYVxuICogZGlzYWJsZS9lbmFibGUgY3ljbGUpIFx1MjAxNCB3aGljaCBpcyB3aHkge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSBpcyBhIG1ldGhvZCBPTiB0aGUgcmVmIHJhdGhlciB0aGFuXG4gKiB0aGUgdGhpbmcgaGFuZGVkIGJhY2suIFRoZSBgY2hhbmdlYCBldmVudCBleGlzdHMgZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgcmVhY3QgcmF0aGVyIHRoYW4gcmVhZCwgYW5kIGlzXG4gKiBzZWNvbmRhcnk6IGl0IGltcG9zZXMgbm8gY2VyZW1vbnkgb24gdGhlIGNvbW1vbiBjYXNlLCB3aGljaCBpcyByZWFkaW5nIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZjxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIEFzeW5jRXZlbnRTb3VyY2U8UGx1Z2luQXBpUmVmRXZlbnRNYXA+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEksIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBBbHdheXMgY3VycmVudCwgc3luY2hyb25vdXMsIGFuZCBmcmVlIFx1MjAxNCB0aGUgcmVmIG1haW50YWlucyBpdCwgc28gdGhlcmUgaXMgbm8gcmVnaXN0cnkgbG9va3VwIHBlciByZWFkLlxuICAgKiBgbnVsbGAgaGVyZSBtZWFucyBcIm5vdCBhdmFpbGFibGUgcmlnaHQgbm93XCIsIE5PVCBcIm5vdCBpbnN0YWxsZWRcIjogZHVyaW5nIGEgY29uc3VtZXIncyBgb25sb2FkYCB0aGVcbiAgICogcHJvdmlkZXIgbWF5IHNpbXBseSBub3QgaGF2ZSBsb2FkZWQgeWV0LCBhbmQgdGhlIHZhbHVlIGJlY29tZXMgbm9uLWBudWxsYCBvbiBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG51bGwgfCBUQXBpO1xuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd2FpdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBBUEkuXG4gICAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IucmVhc29ufSBzYXlzIHdoaWNoIG9mXG4gICAqIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLCBpZiB0aGUgQVBJIGRvZXMgbm90IGJlY29tZSBhdmFpbGFibGUgYmVmb3JlIHRoZSB0aW1lb3V0IGVsYXBzZXMuXG4gICAqL1xuICB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT47XG59XG5cbi8qKlxuICogVGhlIGV2ZW50cyBhIHtAbGluayBQbHVnaW5BcGlSZWZ9IGZpcmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZkV2ZW50TWFwIHtcbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGNoYW5nZXMgXHUyMDE0IGluY2x1ZGluZyB3aGVuIGl0IGJlY29tZXMgYG51bGxgIGJlY2F1c2UgdGhlIHByb3ZpZGVyXG4gICAqIHVubG9hZGVkLlxuICAgKi9cbiAgY2hhbmdlOiBbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBleHBsaWNpdCBtZXNzYWdlLiBXaGVuIG9taXR0ZWQsIG9uZSBpcyBkZXJpdmVkIGZyb20gdGhlIHBsdWdpbiBpZCBhbmQgdGhlIHJlYXNvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdob3NlIHBheWxvYWQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHB1Ymxpc2hQbHVnaW5BcGl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaFBsdWdpbkFwaVBhcmFtczxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFBsdWdpbkFwaURlY2xhcmF0aW9uPFRBcGk+IHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgd2hvc2UgdW5sb2FkIHJldm9rZXMgdGhlIHJlY29yZC4gRGVmYXVsdHMgdG8ge0BsaW5rIFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXMucGx1Z2lufSwgd2hpY2ggaXNcbiAgICogdGhlIHJpZ2h0IG93bmVyIGZvciBhbiBBUEkgcHVibGlzaGVkIGZvciBhcyBsb25nIGFzIHRoZSBwbHVnaW4gcnVucy5cbiAgICpcbiAgICogUGFzcyBhIG5hcnJvd2VyIG9uZSB3aGVuIHRoZSBBUEkgaXMgb25seSB2YWxpZCBmb3IgcGFydCBvZiB0aGUgcGx1Z2luJ3MgbGlmZSBcdTIwMTQgYSBwbHVnaW4gd2hvc2UgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGlzIHRvcm4gZG93biBhbmQgcmVidWlsdCB3aGlsZSB0aGUgcGx1Z2luIGl0c2VsZiBzdGF5cyBsb2FkZWQgbXVzdCByZXZva2Ugd2l0aCB0aGUgc3VyZmFjZSwgb3IgaXRcbiAgICogbGVhdmVzIGNvbnN1bWVycyBob2xkaW5nIGhhbmRsZXMgaW50byBjb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50PzogQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgcHVibGlzaGluZyBwbHVnaW4uIFRoZSByZWNvcmQgaXMga2V5ZWQgYnkgaXRzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW5cbiAgICogdW5sb2FkcywgdmlhIGBwbHVnaW4ucmVnaXN0ZXIoKWAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoUGx1Z2luQXBpUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgY29udHJhY3QgdmVyc2lvbnMgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QsIGUuZy4gYCdeMidgLiBUaGUgaGlnaGVzdCBwdWJsaXNoZWRcbiAgICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0IHdpbnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoZSByYW5nZSBpcyBldmFsdWF0ZWQgYnkgYGNvbXBhcmUtdmVyc2lvbnNgLCB3aGljaCBhY2NlcHRzIGBeYCwgYH5gLCBjb21wYXJpc29uIG9wZXJhdG9ycywgYW5kIGB4YFxuICAgKiB3aWxkY2FyZHMgXHUyMDE0IGJ1dCBOT1QgYSBiYXJlIGAqYC4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UsIHVzZWQgdG8gY2xhc3NpZnkgYSBmYWlsdXJlIGFzIG5vdC1pbnN0YWxsZWQgdnMgbm90LWVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCBvd25pbmcgdGhlIHN1YnNjcmlwdGlvbi4gVGhlIHdhdGNoIGlzIHRvcm4gZG93biB3aGVuIGl0IHVubG9hZHMuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGNvbnRyYWN0IHRoZSBDT05TVU1FUiBleHBlY3RzLiBPcHRpb25hbCwgYW5kIGl0IHdpbnMgb3ZlciB0aGUgcHJvdmlkZXIncyBwdWJsaXNoZWQgY29udHJhY3Qgd2hlblxuICAgKiBzdXBwbGllZCBcdTIwMTQgaXQgaXMgdGhlIGNvbnN1bWVyJ3Mgb3duIGNvbXBpbGVkLWFnYWluc3QgZXhwZWN0YXRpb24sIHNvIGl0IGlzIHRoZSBvbmUgd2hvc2UgdmlvbGF0aW9uIGlzXG4gICAqIHRoZSBjb25zdW1lcidzIHByb2JsZW0uXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgYW5kIGNsYXNzaWZ5aW5nIHRoZSBmYWlsdXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVNZXRob2RXcmFwcGVyfS5cbiAqL1xuaW50ZXJmYWNlIENyZWF0ZU1ldGhvZFdyYXBwZXJQYXJhbXMge1xuICByZWFkb25seSBtZXRob2RDb250cmFjdDogUGx1Z2luQXBpTWV0aG9kQ29udHJhY3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIGRlYnVnIG91dHB1dC4gTk9UIGEga2V5IFx1MjAxNCBzZWUge0BsaW5rIHByb3BlcnR5S2V5fS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHRoZSBtZXRob2QgaXMgYWN0dWFsbHkgcmVhZCBieSwgd2hpY2ggbWF5IGJlIGEgc3ltYm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5O1xuXG4gIHJlYWRvbmx5IHRhcmdldDogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSByZWFsbS1nbG9iYWwgcmVnaXN0cnkgc2hhcmVkIGJ5IGV2ZXJ5IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcHkgaW4gdGhlIHJlbmRlcmVyLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luQXBpUmVnaXN0cnkge1xuICByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmRbXT47XG4gIHN1YnNjcmliZXJzOiAoKCkgPT4gdm9pZClbXTtcbn1cblxuLyoqXG4gKiBBIHJlY29yZCBhcyBpdCBzaXRzIGluIHRoZSBzaGFyZWQgcmVnaXN0cnkuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaXMgdGhlIFdJUkUgRk9STUFUIGJldHdlZW4gZGlmZmVyZW50IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcGllcywgc28gaXQgaG9sZHMgbm90aGluZyBidXQgcGxhaW4gZGF0YVxuICogYW5kIHBsYWluIGZ1bmN0aW9ucywgYW5kIGV2ZXJ5IHJlYWQgb2YgaXQgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSBpcyBzdHJ1Y3R1cmFsLlxuICovXG5pbnRlcmZhY2UgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkIHtcbiAgYXBpOiBvYmplY3Q7XG4gIGFwaVZlcnNpb246IHN0cmluZztcbiAgY29udHJhY3Q6IFBsdWdpbkFwaUNvbnRyYWN0O1xuICBpc1Jldm9rZWQ6IGJvb2xlYW47XG4gIHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHZhbGlkYXRlUGF5bG9hZH0uXG4gKi9cbmludGVyZmFjZSBWYWxpZGF0ZVBheWxvYWRQYXJhbXMge1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBheWxvYWRLaW5kOiBQbHVnaW5BcGlQYXlsb2FkS2luZDtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NoZW1hOiBTdGFuZGFyZFNjaGVtYVYxO1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBIb2xkcyB3aGF0IGEgd2F0Y2ggbmVlZHMgcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHR5cGUgaXQgaXMgdHlwZWQgYWdhaW5zdCwgc28gdGhlIHtAbGluayBtaXhpbkFzeW5jRXZlbnRzfVxuICogbWl4aW4gaGFzIGEgcmVhbCBiYXNlIHRvIGV4dGVuZC5cbiAqL1xuYWJzdHJhY3QgY2xhc3MgUGx1Z2luQXBpV2F0Y2hCYXNlIHtcbiAgcHJvdGVjdGVkIGhhbmRsZTogbnVsbCB8IG9iamVjdCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlY29yZDogbnVsbCB8IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IG51bGw7XG5cbiAgLy8gQSBgcHJvdGVjdGVkYCBjb25zdHJ1Y3RvciBpcyBub3QgYXNzaWduYWJsZSB0byBgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+YCwgd2hpY2ggaXMgd2hhdFxuICAvLyBgbWl4aW5Bc3luY0V2ZW50c2AgYWNjZXB0cywgc28gdGhpcyBzdGF5cyBwdWJsaWMgZXZlbiB0aG91Z2ggb25seSB0aGUgc3ViY2xhc3MgYmVsb3cgY2FsbHMgaXQuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcykge31cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBlcnJvciBkZXNjcmliaW5nIHdoeSB0aGUgQVBJIGlzIG5vdCBhdmFpbGFibGUgcmlnaHQgbm93LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY2xhc3NpZmllZCBlcnJvci5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAgIHJldHVybiBuZXcgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcih7XG4gICAgICBwbHVnaW5JZDogdGhpcy5wYXJhbXMucGx1Z2luSWQsXG4gICAgICByZWFzb246IHJlc29sdmVVbmF2YWlsYWJpbGl0eVJlYXNvbih0aGlzLnBhcmFtcylcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBQbHVnaW5BcGlSZWZJbXBsPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgbWl4aW5Bc3luY0V2ZW50czxQbHVnaW5BcGlSZWZFdmVudE1hcD4oKShQbHVnaW5BcGlXYXRjaEJhc2UpIGltcGxlbWVudHMgUGx1Z2luQXBpUmVmPFRBcGk+IHtcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBudWxsIHwgVEFwaSB7XG4gICAgcmV0dXJuIGNhc3RUbzxudWxsIHwgVEFwaT4odGhpcy5oYW5kbGUpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnksIGZpcmluZyBgY2hhbmdlYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY29yZCA9IHNlbGVjdFJlY29yZCh0aGlzLnBhcmFtcyk7XG4gICAgaWYgKHJlY29yZCA9PT0gdGhpcy5yZWNvcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLmhhbmRsZSA9IHJlY29yZCA9PT0gbnVsbCA/IG51bGwgOiBjcmVhdGVSZXZvY2FibGVIYW5kbGUocmVjb3JkLCB0aGlzLnBhcmFtcy5jb250cmFjdCk7XG4gICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bldpdGhUaW1lb3V0PFRBcGk+KHtcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IGFzeW5jIChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFRBcGk+ID0+IGF3YWl0IHRoaXMud2FpdEZvclZhbHVlKGFib3J0U2lnbmFsKSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogYHdhdGNoUGx1Z2luQXBpKFwiJHt0aGlzLnBhcmFtcy5wbHVnaW5JZH1cIikud2hlbkF2YWlsYWJsZWAsXG4gICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8udGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0hFTl9BVkFJTEFCTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yVmFsdWUoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFRBcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIEZJUlNUIGFuZCBpbnZva2VkIHRocm91Z2ggYSB0aHVuaywgc28gYGV2ZW50UmVmYCBpcyBhbHJlYWR5IGJvdW5kIGJ5IHRoZVxuICAgICAgLy8gVGltZSBhbnl0aGluZyBjYW4gcmVhY2ggaXQgXHUyMDE0IHdoaWNoIGlzIHdoYXQgbGV0cyBgY2xlYW5VcGAgYmUgdW5jb25kaXRpb25hbCByYXRoZXIgdGhhbiBudWxsLWd1YXJkZWQuXG4gICAgICBjb25zdCBldmVudFJlZiA9IHRoaXMub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpOiB2b2lkIHtcbiAgICAgICAgZXZlbnRSZWYuYXN5bmNFdmVudFNvdXJjZS5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgICBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaGFuZGxlQWJvcnQoKTogdm9pZCB7XG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgcmVqZWN0KGFib3J0U2lnbmFsLnJlYXNvbiBhcyBFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgaGFuZGxlQWJvcnQpO1xuICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbiBBUEkgY2Fubm90IGJlIGhhbmRlZCBvdmVyLCBjYXJyeWluZyB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29ufSB0aGF0IHNheXNcbiAqIHdoeS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmVxdWVzdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLm1lc3NhZ2UgPz8gYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIGlzIHVuYXZhaWxhYmxlOiAke3BhcmFtcy5yZWFzb259LmApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yJztcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICAgIHRoaXMucmVhc29uID0gcGFyYW1zLnJlYXNvbjtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHJvcGVydHkgaXMgcmVhZCBmcm9tIGEgaGFuZGxlIHdob3NlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb2ludCBvZiBoYW5kaW5nIG91dCBhIHJldm9jYWJsZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIHJhdyBvYmplY3Q6IGEgY29uc3VtZXIgdGhhdCBjYWNoZWQgdGhlXG4gKiBBUEkgaW4gYSBmaWVsZCBhbmQga2VwdCB1c2luZyBpdCBhY3Jvc3MgYSBkaXNhYmxlIGdldHMgYW4gZXJyb3IgbmFtaW5nIHRoZSBwcm92aWRlciwgaW5zdGVhZCBvZlxuICogYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkYCBzb21ld2hlcmUgZGVlcCBpbnNpZGUgYSB0b3JuLWRvd24gcGx1Z2luLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQXBpUmV2b2tlZEVycm9yIGV4dGVuZHMgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXZva2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBgVGhlIEFQSSBvZiB0aGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgYmVlbiByZXZva2VkLCBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIHVubG9hZGVkLmAsXG4gICAgICBwbHVnaW5JZCxcbiAgICAgIHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uUmV2b2tlZFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlSZXZva2VkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwdWJsaXNoZWQgQVBJJ3MgcGF5bG9hZCBmYWlscyB0aGUgc2NoZW1hIGl0cyBjb250cmFjdCBkZWNsYXJlcy5cbiAqXG4gKiBPbmx5IGV2ZXIgdGhyb3duIHdoaWxlIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzOlBsdWdpbkFwaWAgZGVidWdnZXIgaXMgZW5hYmxlZCBcdTIwMTQgaW4gcHJvZHVjdGlvbiB0aGUgbWV0aG9kc1xuICogYXJlIG5vdCB3cmFwcGVkIGF0IGFsbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc3N1ZXM6IHJlYWRvbmx5IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aG9zZSBwYXlsb2FkIGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGhlICR7cGFyYW1zLnBheWxvYWRLaW5kfSBvZiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIEFQSSBtZXRob2QgXCIke3BhcmFtcy5tZXRob2ROYW1lfVwiIGZhaWxlZCB2YWxpZGF0aW9uOiAke2Zvcm1hdElzc3VlcyhwYXJhbXMuaXNzdWVzKX1gXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmlzc3VlcyA9IHBhcmFtcy5pc3N1ZXM7XG4gICAgdGhpcy5tZXRob2ROYW1lID0gcGFyYW1zLm1ldGhvZE5hbWU7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIHBsdWdpbidzIEFQSSBzbyBvdGhlciBwbHVnaW5zIGNhbiBjb25zdW1lIGl0LCBrZXllZCBieSB0aGUgcGx1Z2luJ3MgYG1hbmlmZXN0LmlkYCBhbmQgcmV2b2tlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2Fkcy5cbiAqXG4gKiBTZXZlcmFsIGNvbnRyYWN0IHZlcnNpb25zIG1heSBiZSBwdWJsaXNoZWQgc2lkZSBieSBzaWRlLCBzbyBhIHByb3ZpZGVyIGNhbiBtb3ZlIHRvIGAyLjAuMGAgd2l0aG91dCBicmVha2luZ1xuICogY29uc3VtZXJzIHN0aWxsIHBpbm5lZCB0byBgXjFgLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHB1Ymxpc2hpbmcuXG4gKiBAdGhyb3dzIEFuIHtAbGluayBFcnJvcn0gaWYgdGhpcyBwbHVnaW4gaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoaXMgZXhhY3QgYGFwaVZlcnNpb25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFBsdWdpbkFwaTxUQXBpIGV4dGVuZHMgb2JqZWN0PihwYXJhbXM6IFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXM8VEFwaT4pOiB2b2lkIHtcbiAgY29uc3QgcGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luLm1hbmlmZXN0LmlkO1xuICBjb25zdCByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7XG4gIGNvbnN0IHJlY29yZHMgPSByZWdpc3RyeS5yZWNvcmRzW3BsdWdpbklkXSA/PyBbXTtcbiAgcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPSByZWNvcmRzO1xuXG4gIGlmIChyZWNvcmRzLnNvbWUoKHJlY29yZCkgPT4gcmVjb3JkLmFwaVZlcnNpb24gPT09IHBhcmFtcy5hcGlWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoZSBBUEkgdmVyc2lvbiBcIiR7cGFyYW1zLmFwaVZlcnNpb259XCIuYCk7XG4gIH1cblxuICBjb25zdCByZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IHtcbiAgICBhcGk6IHBhcmFtcy5hcGksXG4gICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgY29udHJhY3Q6IHBhcmFtcy5jb250cmFjdCA/PyB7fSxcbiAgICBpc1Jldm9rZWQ6IGZhbHNlLFxuICAgIHBsdWdpbklkXG4gIH07XG4gIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICBub3RpZnlTdWJzY3JpYmVycygpO1xuXG4gIChwYXJhbXMuY29tcG9uZW50ID8/IHBhcmFtcy5wbHVnaW4pLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdFQSw4QkFHTztBQUlQLG1CQUF5QjtBQUN6QiwwQkFBaUM7QUFDakMsbUJBR087QUFDUCxtQkFBK0I7QUFDL0IsMEJBQXVCO0FBQ3ZCLHNDQUF5QztBQUV6QyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlEQUFpRDtBQUtoRCxJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUlMLEVBQUFBLHNCQUFBLFdBQVE7QUFLUixFQUFBQSxzQkFBQSxZQUFTO0FBVEMsU0FBQUE7QUFBQSxHQUFBO0FBMEJMLElBQUssZ0NBQUwsa0JBQUtDLG1DQUFMO0FBSUwsRUFBQUEsK0JBQUEsZ0JBQWE7QUFLYixFQUFBQSwrQkFBQSxrQkFBZTtBQUtmLEVBQUFBLCtCQUFBLGtCQUFlO0FBS2YsRUFBQUEsK0JBQUEsYUFBVTtBQU1WLEVBQUFBLCtCQUFBLG1CQUFnQjtBQUtoQixFQUFBQSwrQkFBQSxxQkFBa0I7QUE5QlIsU0FBQUE7QUFBQSxHQUFBO0FBOFRaLE1BQWUsbUJBQW1CO0FBQUE7QUFBQTtBQUFBLEVBT3pCLFlBQStCLFFB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QUFpQixPQUFPLFlBQVksT0FBTyxlQUFlLENBQUMsR0FBRztBQUMzRixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDtBQVdBLFNBQVMsYUFBYSxRQUF3QztBQUM1RCxTQUFPLFlBQVk7QUFDbkIsUUFBTSxXQUFXLFlBQVk7QUFDN0IsUUFBTSxVQUFVLFNBQVMsUUFBUSxPQUFPLFFBQVE7QUFDaEQsTUFBSSxTQUFTO0FBQ1gsYUFBUyxRQUFRLE9BQU8sUUFBUSxJQUFJLFFBQVEsT0FBTyxDQUFDLGNBQWMsY0FBYyxNQUFNO0FBQUEsRUFDeEY7QUFDQSxvQkFBa0I7QUFDcEI7QUFTQSxTQUFTLGFBQWEsUUFBK0Q7QUFDbkYsUUFBTSxhQUFhLGVBQWUsT0FBTyxRQUFRLEVBQzlDLE9BQU8sQ0FBQyxlQUFXLHdCQUFBQSxXQUFpQixPQUFPLFlBQVksT0FBTyxlQUFlLENBQUMsRUFDOUUsT0FBTyxDQUFDLFdBQVcsMEJBQTBCLFFBQVEsT0FBTyxRQUFRLENBQUMsRUFDckUsS0FBSyxDQUFDLEdBQUcsVUFBTSx5Q0FBZ0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO0FBRTdELFNBQU8sV0FBVyxDQUFDLEtBQUs7QUFDMUI7QUFRQSxTQUFTLFVBQVUsWUFBb0M7QUFDckQsUUFBTSxXQUFXLFlBQVk7QUFDN0IsV0FBUyxZQUFZLEtBQUssVUFBVTtBQUNwQyxTQUFPLE1BQVk7QUFDakIsVUFBTSxRQUFRLFNBQVMsWUFBWSxRQUFRLFVBQVU7QUFDckQsUUFBSSxVQUFVLElBQUk7QUFDaEIsZUFBUyxZQUFZLE9BQU8sT0FBTyxDQUFDO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0Y7QUFhQSxTQUFTLGdCQUFnQixRQUFxQztBQUM1RCxRQUFNLFNBQVMsT0FBTyxPQUFPLFdBQVcsRUFBRSxTQUFTLE9BQU8sS0FBSztBQUUvRCxNQUFJLG1CQUFxRCxNQUFNLEdBQUc7QUFDaEUsd0NBQWtCLFlBQVk7QUFDNUIsWUFBTSxjQUFjLE1BQU07QUFDMUIsVUFBSSxZQUFZLFFBQVE7QUFDdEIsNkJBQXFCO0FBQUEsVUFDbkI7QUFBQSxVQUNBLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLGFBQWEsWUFBWSxNQUFNO0FBQUEsUUFDakM7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBQ0Q7QUFBQSxFQUNGO0FBRUEsTUFBSSxPQUFPLFFBQVE7QUFDakIsVUFBTSxJQUFJLHlCQUF5QjtBQUFBLE1BQ2pDLFFBQVEsT0FBTztBQUFBLE1BQ2YsWUFBWSxPQUFPO0FBQUEsTUFDbkIsYUFBYSxPQUFPO0FBQUEsTUFDcEIsVUFBVSxPQUFPO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsiUGx1Z2luQXBpUGF5bG9hZEtpbmQiLCAiUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24iLCAicmVjb3JkIiwgInNhdGlzZmllc1ZlcnNpb24iXQp9Cg==
|
|
@@ -131,6 +131,32 @@ export declare enum PluginApiUnavailabilityReason {
|
|
|
131
131
|
* declared method names are checked with `typeof`, and the payloads are validated per method instead.
|
|
132
132
|
*/
|
|
133
133
|
export type PluginApiContract = Record<string, PluginApiMethodContract>;
|
|
134
|
+
/**
|
|
135
|
+
* One API a plugin exposes: the object, the contract version it satisfies, and optionally the contract
|
|
136
|
+
* itself. This is {@link PublishPluginApiParams} without the publishing plugin, so a plugin can DECLARE what
|
|
137
|
+
* it exposes without also stating who is publishing it — which is what lets `PluginBase.getPluginApis` collect
|
|
138
|
+
* the declarations and do the publishing itself.
|
|
139
|
+
*
|
|
140
|
+
* @typeParam TApi - The API type being declared.
|
|
141
|
+
*/
|
|
142
|
+
export interface PluginApiDeclaration<TApi extends object = object> {
|
|
143
|
+
/**
|
|
144
|
+
* The API object to publish. Its methods are handed to consumers through a revocable handle, and they are
|
|
145
|
+
* always invoked with this object as their `this`, so an implementation using private class fields keeps
|
|
146
|
+
* working.
|
|
147
|
+
*/
|
|
148
|
+
readonly api: TApi;
|
|
149
|
+
/**
|
|
150
|
+
* The CONTRACT version, in semver form — independent of the plugin's own version. Plugin `1.4.7` may
|
|
151
|
+
* perfectly well expose API `2.0.0`.
|
|
152
|
+
*/
|
|
153
|
+
readonly apiVersion: string;
|
|
154
|
+
/**
|
|
155
|
+
* The contract this version of the API satisfies. Optional: when omitted, no shape check is performed on
|
|
156
|
+
* the provider's behalf and the consumer's own contract (if any) is used instead.
|
|
157
|
+
*/
|
|
158
|
+
readonly contract?: PluginApiContract;
|
|
159
|
+
}
|
|
134
160
|
/**
|
|
135
161
|
* The payload schemas for a single API method. Both halves are optional: a method may declare only its input,
|
|
136
162
|
* only its output, neither (the entry then just declares that the method must exist), or both.
|
|
@@ -229,23 +255,16 @@ export interface PluginApiValidationErrorConstructorParams {
|
|
|
229
255
|
*
|
|
230
256
|
* @typeParam TApi - The API type being published.
|
|
231
257
|
*/
|
|
232
|
-
export interface PublishPluginApiParams<TApi extends object> {
|
|
258
|
+
export interface PublishPluginApiParams<TApi extends object> extends PluginApiDeclaration<TApi> {
|
|
233
259
|
/**
|
|
234
|
-
* The
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
* The CONTRACT version, in semver form — independent of the plugin's own version. Plugin `1.4.7` may
|
|
241
|
-
* perfectly well expose API `2.0.0`.
|
|
242
|
-
*/
|
|
243
|
-
readonly apiVersion: string;
|
|
244
|
-
/**
|
|
245
|
-
* The contract this version of the API satisfies. Optional: when omitted, no shape check is performed on
|
|
246
|
-
* the provider's behalf and the consumer's own contract (if any) is used instead.
|
|
260
|
+
* The component whose unload revokes the record. Defaults to {@link PublishPluginApiParams.plugin}, which is
|
|
261
|
+
* the right owner for an API published for as long as the plugin runs.
|
|
262
|
+
*
|
|
263
|
+
* Pass a narrower one when the API is only valid for part of the plugin's life — a plugin whose feature
|
|
264
|
+
* surface is torn down and rebuilt while the plugin itself stays loaded must revoke with the surface, or it
|
|
265
|
+
* leaves consumers holding handles into code that is no longer there.
|
|
247
266
|
*/
|
|
248
|
-
readonly
|
|
267
|
+
readonly component?: Component;
|
|
249
268
|
/**
|
|
250
269
|
* The publishing plugin. The record is keyed by its `manifest.id` and revoked automatically when the plugin
|
|
251
270
|
* unloads, via `plugin.register()`.
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureBrowserProcess() {
|
|
8
|
+
const browserProcess = {
|
|
9
|
+
browser: true,
|
|
10
|
+
cwd() {
|
|
11
|
+
return '/';
|
|
12
|
+
},
|
|
13
|
+
env: {},
|
|
14
|
+
platform: 'android'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
18
|
+
const existingProcess = globalThis.process;
|
|
19
|
+
|
|
20
|
+
if (!existingProcess) {
|
|
21
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const existingProcessRecord = existingProcess;
|
|
31
|
+
|
|
32
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
33
|
+
existingProcessRecord[key] ??= value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
existingProcessRecord['browser'] = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function keepName($unknown) {
|
|
40
|
+
return $unknown;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(function initCjs() {
|
|
44
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
45
|
+
const globalThisRecord = globalThis;
|
|
46
|
+
globalThisRecord['__name'] ??= keepName;
|
|
47
|
+
const originalRequire = require;
|
|
48
|
+
if (originalRequire && !originalRequire.__isPatched) {
|
|
49
|
+
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
50
|
+
require = Object.assign(
|
|
51
|
+
(id) => requirePatched(id),
|
|
52
|
+
originalRequire,
|
|
53
|
+
{
|
|
54
|
+
__isPatched: true
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
60
|
+
|
|
61
|
+
ensureBrowserProcess();
|
|
62
|
+
|
|
63
|
+
function extractDefault(module) {
|
|
64
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
68
|
+
'@codemirror/autocomplete',
|
|
69
|
+
'@codemirror/collab',
|
|
70
|
+
'@codemirror/commands',
|
|
71
|
+
'@codemirror/language',
|
|
72
|
+
'@codemirror/lint',
|
|
73
|
+
'@codemirror/search',
|
|
74
|
+
'@codemirror/state',
|
|
75
|
+
'@codemirror/text',
|
|
76
|
+
'@codemirror/view',
|
|
77
|
+
'@lezer/common',
|
|
78
|
+
'@lezer/highlight',
|
|
79
|
+
'@lezer/lr',
|
|
80
|
+
'obsidian']
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
84
|
+
'@codemirror/closebrackets',
|
|
85
|
+
'@codemirror/comment',
|
|
86
|
+
'@codemirror/fold',
|
|
87
|
+
'@codemirror/gutter',
|
|
88
|
+
'@codemirror/highlight',
|
|
89
|
+
'@codemirror/history',
|
|
90
|
+
'@codemirror/matchbrackets',
|
|
91
|
+
'@codemirror/panel',
|
|
92
|
+
'@codemirror/rangeset',
|
|
93
|
+
'@codemirror/rectangular-selection',
|
|
94
|
+
'@codemirror/stream-parser',
|
|
95
|
+
'@codemirror/tooltip']
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
function requirePatched(id) {
|
|
99
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
100
|
+
return originalRequire?.(id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
104
|
+
if (globalThis.app.isMobile) {
|
|
105
|
+
if (id === 'process' || id === 'node:process') {
|
|
106
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
107
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
108
|
+
|
|
109
|
+
return process;
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
const module = originalRequire?.(id);
|
|
113
|
+
if (module) {
|
|
114
|
+
return extractDefault(module);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
119
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
120
|
+
return {};
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
})();
|
|
124
|
+
|
|
125
|
+
"use strict";
|
|
126
|
+
var __defProp = Object.defineProperty;
|
|
127
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
128
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
129
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
130
|
+
var __export = (target, all) => {
|
|
131
|
+
for (var name in all)
|
|
132
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
133
|
+
};
|
|
134
|
+
var __copyProps = (to, from, except, desc) => {
|
|
135
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
136
|
+
for (let key of __getOwnPropNames(from))
|
|
137
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
138
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
139
|
+
}
|
|
140
|
+
return to;
|
|
141
|
+
};
|
|
142
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
143
|
+
var plugin_install_state_exports = {};
|
|
144
|
+
__export(plugin_install_state_exports, {
|
|
145
|
+
InstalledPluginState: () => InstalledPluginState,
|
|
146
|
+
getInstalledPluginState: () => getInstalledPluginState,
|
|
147
|
+
getInstalledPluginVersion: () => getInstalledPluginVersion,
|
|
148
|
+
installAndEnablePlugin: () => installAndEnablePlugin
|
|
149
|
+
});
|
|
150
|
+
module.exports = __toCommonJS(plugin_install_state_exports);
|
|
151
|
+
var import_community_plugins = require('../community-plugins.cjs');
|
|
152
|
+
var import_html_element = require('../html-element.cjs');
|
|
153
|
+
var import_i18n = require('../i18n/i18n.cjs');
|
|
154
|
+
var InstalledPluginState = /* @__PURE__ */ ((InstalledPluginState2) => {
|
|
155
|
+
InstalledPluginState2["Enabled"] = "enabled";
|
|
156
|
+
InstalledPluginState2["InstalledButDisabled"] = "installedButDisabled";
|
|
157
|
+
InstalledPluginState2["NotInstalled"] = "notInstalled";
|
|
158
|
+
return InstalledPluginState2;
|
|
159
|
+
})(InstalledPluginState || {});
|
|
160
|
+
function getInstalledPluginState(params) {
|
|
161
|
+
const { app, pluginId } = params;
|
|
162
|
+
if (app.plugins.enabledPlugins.has(pluginId)) {
|
|
163
|
+
return "enabled" /* Enabled */;
|
|
164
|
+
}
|
|
165
|
+
return Object.hasOwn(app.plugins.manifests, pluginId) ? "installedButDisabled" /* InstalledButDisabled */ : "notInstalled" /* NotInstalled */;
|
|
166
|
+
}
|
|
167
|
+
function getInstalledPluginVersion(params) {
|
|
168
|
+
const { app, pluginId } = params;
|
|
169
|
+
if (!app.plugins.enabledPlugins.has(pluginId)) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
return app.plugins.manifests[pluginId]?.version ?? "";
|
|
173
|
+
}
|
|
174
|
+
async function installAndEnablePlugin(params) {
|
|
175
|
+
const {
|
|
176
|
+
app,
|
|
177
|
+
pluginId,
|
|
178
|
+
pluginName,
|
|
179
|
+
pluginNoticeComponent
|
|
180
|
+
} = params;
|
|
181
|
+
const state = getInstalledPluginState({ app, pluginId });
|
|
182
|
+
if (state === "enabled" /* Enabled */) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
if (state === "installedButDisabled" /* InstalledButDisabled */) {
|
|
187
|
+
await (0, import_community_plugins.enableCommunityPlugin)({ app, pluginId });
|
|
188
|
+
} else {
|
|
189
|
+
await (0, import_community_plugins.installConfigureEnableCommunityPlugin)({ app, pluginId });
|
|
190
|
+
}
|
|
191
|
+
} catch (error) {
|
|
192
|
+
pluginNoticeComponent.showNotice((0, import_html_element.createFragmentWithCodeBlocks)(
|
|
193
|
+
(0, import_i18n.t)(($) => $.obsidianDevUtils.pluginSuggestion.installFailed, { pluginName: (0, import_html_element.asCodeBlock)(pluginName) })
|
|
194
|
+
));
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
pluginNoticeComponent.showNotice((0, import_html_element.createFragmentWithCodeBlocks)(
|
|
198
|
+
(0, import_i18n.t)(($) => $.obsidianDevUtils.pluginSuggestion.installed, { pluginName: (0, import_html_element.asCodeBlock)(pluginName) })
|
|
199
|
+
));
|
|
200
|
+
}
|
|
201
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
202
|
+
0 && (module.exports = {
|
|
203
|
+
InstalledPluginState,
|
|
204
|
+
getInstalledPluginState,
|
|
205
|
+
getInstalledPluginVersion,
|
|
206
|
+
installAndEnablePlugin
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEhvdyBhbm90aGVyIHBsdWdpbiBpcyBwcmVzZW50IGluIHRoaXMgdmF1bHQsIGFuZCB0aGUgb25lLWNsaWNrIHBhdGggdG8gbWFraW5nIGl0IHByZXNlbnQuXG4gKlxuICogU2hhcmVkIGJ5IHRoZSB0d28gY29tcG9uZW50cyB0aGF0IGFzayBhIHVzZXIgdG8gYnJpbmcgYW5vdGhlciBwbHVnaW4gaW46IGBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50YCxcbiAqIHdoaWNoIE9GRkVSUyBvbmUgYW5kIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCwgYW5kIGBQbHVnaW5HYXRlQ29tcG9uZW50YCwgd2hpY2ggUkVRVUlSRVMgb25lIGFuZFxuICogZG9lcyBub3RoaW5nIHVudGlsIGl0IGlzIHRoZXJlLiBUaGUgb2ZmZXIgYW5kIHRoZSByZXF1aXJlbWVudCBkaWZmZXIgaW4gd2hhdCB0aGV5IGRvIGFib3V0IHRoZSBhbnN3ZXIsXG4gKiBub3QgaW4gaG93IHRoZXkgcmVhZCB0aGUgc3RhdGUgb3IgaG93IHRoZXkgaW5zdGFsbCBcdTIwMTQgc28gdGhhdCBwYXJ0IGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gYm90aC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHtcbiAgZW5hYmxlQ29tbXVuaXR5UGx1Z2luLFxuICBpbnN0YWxsQ29uZmlndXJlRW5hYmxlQ29tbXVuaXR5UGx1Z2luXG59IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7XG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcblxuLyoqXG4gKiBIb3cgYW5vdGhlciBwbHVnaW4gaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgZW51bSBJbnN0YWxsZWRQbHVnaW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYW5kIGVuYWJsZWQgXHUyMDE0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uXG4gICAqL1xuICBFbmFibGVkID0gJ2VuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYnV0IGRpc2FibGVkLiBPbmx5IGFuIGVuYWJsZSBpcyBuZWVkZWQsIHNvIG5vIGRvd25sb2FkIGhhcHBlbnMuXG4gICAqL1xuICBJbnN0YWxsZWRCdXREaXNhYmxlZCA9ICdpbnN0YWxsZWRCdXREaXNhYmxlZCcsXG5cbiAgLyoqXG4gICAqIE5vdCBpbnN0YWxsZWQgYXQgYWxsLlxuICAgKi9cbiAgTm90SW5zdGFsbGVkID0gJ25vdEluc3RhbGxlZCdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEluc3RhbGxlZFBsdWdpblN0YXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB0byBsb29rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEluc3RhbGxlZFBsdWdpblZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEluc3RhbGxlZFBsdWdpblZlcnNpb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHRvIGxvb2sgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFsbEFuZEVuYWJsZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gdG8gaW5zdGFsbCBhbmQgZW5hYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgb2YgdGhlIHBsdWdpbiBkb2luZyB0aGUgYXNraW5nLCB1c2VkIHRvIHJlcG9ydCB0aGUgb3V0Y29tZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGhvdyBhbm90aGVyIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0SW5zdGFsbGVkUGx1Z2luU3RhdGVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHtAbGluayBJbnN0YWxsZWRQbHVnaW5TdGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZShwYXJhbXM6IEdldEluc3RhbGxlZFBsdWdpblN0YXRlUGFyYW1zKTogSW5zdGFsbGVkUGx1Z2luU3RhdGUge1xuICBjb25zdCB7IGFwcCwgcGx1Z2luSWQgfSA9IHBhcmFtcztcblxuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybiBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwbHVnaW5JZClcbiAgICA/IEluc3RhbGxlZFBsdWdpblN0YXRlLkluc3RhbGxlZEJ1dERpc2FibGVkXG4gICAgOiBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5Ob3RJbnN0YWxsZWQ7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIHZlcnNpb24gb2YgYW5vdGhlciBwbHVnaW4gYXMgdGhpcyB2YXVsdCBoYXMgaXQgaW5zdGFsbGVkLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3QgcnVubmluZy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBjb21lcyBvdXQgb2YgYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AsIHdoaWNoIGlzIHBvcHVsYXRlZCBmb3IgZXZlcnkgaW5zdGFsbGVkIHBsdWdpbiBhdFxuICogc3RhcnR1cCBcdTIwMTQgc28sIHVubGlrZSBhbnl0aGluZyBhIHBsdWdpbiBSRUdJU1RFUlMsIGl0IGFuc3dlcnMgdGhlIHNhbWUgd2F5IG5vIG1hdHRlciB3aGljaCBwbHVnaW4gbG9hZGVkXG4gKiBmaXJzdC4gVGhhdCBsb2FkLW9yZGVyIGluZGVwZW5kZW5jZSBpcyB0aGUgd2hvbGUgcmVhc29uIGEgY29uZmxpY3QgaXMgZGV0ZWN0ZWQgYnkgdmVyc2lvbiByYXRoZXIgdGhhbiBieVxuICogYXNraW5nIGEgcmVnaXN0cnkuXG4gKlxuICogYG51bGxgIGZvciBhIHBsdWdpbiB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgT1IgaXMgaW5zdGFsbGVkIGJ1dCBkaXNhYmxlZDogYSBkaXNhYmxlZCBwbHVnaW4gcmVnaXN0ZXJzXG4gKiBub3RoaW5nLCBzbyBmb3IgZXZlcnkgcXVlc3Rpb24gdGhpcyBhbnN3ZXJzIHRoZSB0d28gY2FzZXMgYXJlIHRoZSBzYW1lLiBBbiBpbnN0YWxsZWQsIGVuYWJsZWQgcGx1Z2luXG4gKiB3aG9zZSBtYW5pZmVzdCBzb21laG93IGNhcnJpZXMgbm8gdmVyc2lvbiByZWFkcyBhcyBhbiBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gYG51bGxgLCB3aGljaCBrZWVwc1xuICogXCJydW5uaW5nLCB2ZXJzaW9uIHVua25vd25cIiBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIm5vdCBydW5uaW5nXCIgXHUyMDE0IGEgY2FsbGVyIGNvbXBhcmluZyB2ZXJzaW9ucyBzaG91bGQgZmFpbFxuICogY2xvc2VkIG9uIGl0IHJhdGhlciB0aGFuIHRyZWF0IGl0IGFzIGFic2VudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgb3IgYG51bGxgIHdoZW4gdGhlIHBsdWdpbiBpcyBub3QgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24ocGFyYW1zOiBHZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uUGFyYW1zKTogbnVsbCB8IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwLCBwbHVnaW5JZCB9ID0gcGFyYW1zO1xuXG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb24gPz8gJyc7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgKHdoZW4gbmVlZGVkKSBhbmQgZW5hYmxlcyBhbm90aGVyIHBsdWdpbiwgcmVwb3J0aW5nIHRoZSBvdXRjb21lIGFzIGEgbm90aWNlLlxuICpcbiAqIEEgbm8tb3Agd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZCwgc28gYSBjYWxsZXIgcmVhY3RpbmcgdG8gYSBjbGljayBuZWVkIG5vdCBjaGVjayBmaXJzdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBJbnN0YWxsQW5kRW5hYmxlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGVuYWJsZWQuXG4gKiBAdGhyb3dzIFdoYXRldmVyIHRoZSBpbnN0YWxsIG9yIGVuYWJsZSB0aHJldywgYWZ0ZXIgcmVwb3J0aW5nIGl0IGFzIGEgbm90aWNlIFx1MjAxNCB0aGUgY2FsbGVyIGRlY2lkZXNcbiAqIHdoZXRoZXIgYSBmYWlsdXJlIGlzIHdvcnRoIG1vcmUgdGhhbiB0aGUgbm90aWNlIHRoZSB1c2VyIGhhcyBhbHJlYWR5IHNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHBhcmFtczogSW5zdGFsbEFuZEVuYWJsZVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50XG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoeyBhcHAsIHBsdWdpbklkIH0pO1xuXG4gIGlmIChzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZCkge1xuICAgICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHsgYXBwLCBwbHVnaW5JZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgaW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpbih7IGFwcCwgcGx1Z2luSWQgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3MoXG4gICAgICB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5pbnN0YWxsRmFpbGVkLCB7IHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHBsdWdpbk5hbWUpIH0pXG4gICAgKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKFxuICAgIHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxlZCwgeyBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhwbHVnaW5OYW1lKSB9KVxuICApKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsK0JBR087QUFDUCwwQkFHTztBQUNQLGtCQUFrQjtBQUtYLElBQUssdUJBQUwsa0JBQUtBLDBCQUFMO0FBSUwsRUFBQUEsc0JBQUEsYUFBVTtBQUtWLEVBQUFBLHNCQUFBLDBCQUF1QjtBQUt2QixFQUFBQSxzQkFBQSxrQkFBZTtBQWRMLFNBQUFBO0FBQUEsR0FBQTtBQThFTCxTQUFTLHdCQUF3QixRQUE2RDtBQUNuRyxRQUFNLEVBQUUsS0FBSyxTQUFTLElBQUk7QUFFMUIsTUFBSSxJQUFJLFFBQVEsZUFBZSxJQUFJLFFBQVEsR0FBRztBQUM1QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sT0FBTyxPQUFPLElBQUksUUFBUSxXQUFXLFFBQVEsSUFDaEQsb0RBQ0E7QUFDTjtBQW1CTyxTQUFTLDBCQUEwQixRQUF3RDtBQUNoRyxRQUFNLEVBQUUsS0FBSyxTQUFTLElBQUk7QUFFMUIsTUFBSSxDQUFDLElBQUksUUFBUSxlQUFlLElBQUksUUFBUSxHQUFHO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxJQUFJLFFBQVEsVUFBVSxRQUFRLEdBQUcsV0FBVztBQUNyRDtBQVlBLGVBQXNCLHVCQUF1QixRQUFxRDtBQUNoRyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sUUFBUSx3QkFBd0IsRUFBRSxLQUFLLFNBQVMsQ0FBQztBQUV2RCxNQUFJLFVBQVUseUJBQThCO0FBQzFDO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDRixRQUFJLFVBQVUsbURBQTJDO0FBQ3ZELGdCQUFNLGdEQUFzQixFQUFFLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDL0MsT0FBTztBQUNMLGdCQUFNLGdFQUFzQyxFQUFFLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDL0Q7QUFBQSxFQUNGLFNBQVMsT0FBTztBQUNkLDBCQUFzQixlQUFXO0FBQUEsVUFDL0IsZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLGVBQWUsRUFBRSxnQkFBWSxpQ0FBWSxVQUFVLEVBQUUsQ0FBQztBQUFBLElBQ3JHLENBQUM7QUFDRCxVQUFNO0FBQUEsRUFDUjtBQUVBLHdCQUFzQixlQUFXO0FBQUEsUUFDL0IsZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLFdBQVcsRUFBRSxnQkFBWSxpQ0FBWSxVQUFVLEVBQUUsQ0FBQztBQUFBLEVBQ2pHLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsiSW5zdGFsbGVkUGx1Z2luU3RhdGUiXQp9Cg==
|