obsidian-dev-utils 100.2.0 → 101.1.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.
@@ -78,14 +78,24 @@ interface RenameDeleteHandlerComponentConstructorParams {
78
78
  readonly abortSignalComponent: AbortSignalComponent;
79
79
  readonly app: App;
80
80
  readonly linkUpdateProgressReporter?: LinkUpdateProgressReporter;
81
- readonly pluginId: string;
82
81
  readonly pluginNoticeComponent: PluginNoticeComponent;
83
82
  readonly resourceLockComponent: null | ResourceLockComponent;
84
83
  settingsBuilder(this: void): Partial<RenameDeleteHandlerSettings>;
85
84
  }
85
+ /**
86
+ * Resolves the settings the handler runs with.
87
+ *
88
+ * There is exactly one contributor: the component's own `settingsBuilder`. Earlier versions aggregated a
89
+ * registry of contributors and OR-merged their answers, because several plugins could each register a
90
+ * handler against the one shared vault. They no longer do, so there is no longer any question of whose
91
+ * setting wins.
92
+ *
93
+ * What remains is defaulting: the builder returns a `Partial`, so the two predicates and the empty-folder
94
+ * behavior need a value when it does not supply one.
95
+ */
86
96
  declare class SettingsManager {
87
- readonly renameDeleteHandlersMap: Map<string, () => Partial<RenameDeleteHandlerSettings>>;
88
- constructor();
97
+ private readonly settingsBuilder;
98
+ constructor(settingsBuilder: () => Partial<RenameDeleteHandlerSettings>);
89
99
  getSettings(): Partial<RenameDeleteHandlerSettings>;
90
100
  isNoteEx(path: string): boolean;
91
101
  }
@@ -108,10 +118,6 @@ export declare class RenameDeleteHandlerComponent extends ComponentEx {
108
118
  * with the running count of processed files and the total. When `null`, no progress is reported.
109
119
  */
110
120
  protected readonly linkUpdateProgressReporter: LinkUpdateProgressReporter | null;
111
- /**
112
- * The plugin ID used to identify this handler among the registered rename/delete handlers.
113
- */
114
- protected readonly pluginId: string;
115
121
  /**
116
122
  * The notice component used to report updated links to the user.
117
123
  */
@@ -155,7 +161,5 @@ export declare class RenameDeleteHandlerComponent extends ComponentEx {
155
161
  * @returns `true` when the handler would do no work for this rename.
156
162
  */
157
163
  private isNoOpRename;
158
- private logRegisteredHandlers;
159
- private shouldInvokeHandler;
160
164
  }
161
165
  export { EmptyFolderBehavior } from '../vault.cjs';
@@ -256,6 +256,7 @@ function convertLink(params) {
256
256
  return updateLink((0, import_object_utils.normalizeOptionalProperties)({
257
257
  app: params.app,
258
258
  link: params.link,
259
+ linkPathStyle: params.linkPathStyle,
259
260
  linkStyle: params.linkStyle,
260
261
  newSourcePathOrFile: params.newSourcePathOrFile,
261
262
  newTargetPathOrFile: targetFile,
@@ -552,6 +553,7 @@ function updateLink(params) {
552
553
  const {
553
554
  app,
554
555
  link,
556
+ linkPathStyle,
555
557
  linkStyle,
556
558
  newSourcePathOrFile,
557
559
  newTargetPathOrFile,
@@ -599,6 +601,7 @@ function updateLink(params) {
599
601
  alias,
600
602
  app,
601
603
  isSingleSubpathAllowed: oldSourcePath === oldTargetPath && !!parseLinkResult?.alias,
604
+ linkPathStyle,
602
605
  linkStyle,
603
606
  originalLink: link.original,
604
607
  sourcePathOrFile: newSourcePathOrFile,
@@ -611,6 +614,7 @@ async function updateLinksInContent(params) {
611
614
  const {
612
615
  app,
613
616
  content,
617
+ linkPathStyle,
614
618
  linkStyle,
615
619
  newSourcePathOrFile,
616
620
  oldSourcePathOrFile,
@@ -628,6 +632,7 @@ async function updateLinksInContent(params) {
628
632
  return convertLink((0, import_object_utils.normalizeOptionalProperties)({
629
633
  app,
630
634
  link,
635
+ linkPathStyle,
631
636
  linkStyle,
632
637
  newSourcePathOrFile,
633
638
  oldSourcePathOrFile,
@@ -639,6 +644,7 @@ async function updateLinksInContent(params) {
639
644
  async function updateLinksInFile(params) {
640
645
  const {
641
646
  app,
647
+ linkPathStyle,
642
648
  linkStyle,
643
649
  newSourcePathOrFile,
644
650
  oldSourcePathOrFile,
@@ -658,6 +664,7 @@ async function updateLinksInFile(params) {
658
664
  return convertLink((0, import_object_utils.normalizeOptionalProperties)({
659
665
  app,
660
666
  link,
667
+ linkPathStyle,
661
668
  linkStyle,
662
669
  newSourcePathOrFile,
663
670
  oldSourcePathOrFile,
@@ -998,4 +1005,4 @@ function validateOffsetRange(offsetRange) {
998
1005
  updateLinksInContent,
999
1006
  updateLinksInFile
1000
1007
  });
1001
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnLi4vdHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVTdHJpbmcsXG4gIHJlcGxhY2VBbGwsXG4gIHRyaW1FbmRcbn0gZnJvbSAnLi4vc3RyaW5nLnRzJztcbmltcG9ydCB7XG4gIGFzc2VydE5ldmVyLFxuICBhc3NlcnROb25OdWxsYWJsZSxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQge1xuICBhcHBseUNvbnRlbnRDaGFuZ2VzLFxuICBhcHBseUZpbGVDaGFuZ2VzLFxuICBpc0NhbnZhc0NoYW5nZSxcbiAgaXNDb250ZW50Q2hhbmdlXG59IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuL21ldGFkYXRhLWNhY2hlLnRzJztcbmltcG9ydCB7XG4gIGdldE5ld0xpbmtGb3JtYXQsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL29ic2lkaWFuLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZUFsaWFzLFxuICBpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlLFxuICBpc1BhcnNlTGlua1JlZmVyZW5jZSxcbiAgcGFyc2VMaW5rXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICBpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UsXG4gIHJlZmVyZW5jZVRvRmlsZUNoYW5nZVxufSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5cbmNvbnN0IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUiA9IFN0cmluZy5yYXdgXFx8YDtcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHVuZXNjYXBlZCBwaXBlcy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/PCFcXFxcKVxcfC9nO1xuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1BhdGhTdHlsZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL2Zyb20vdGhlL3ZhdWx0L3Jvb3QvdGFyZ2V0XV1gXG4gICAqL1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBwYXRoIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1suLi8uLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNob3J0ZXN0IHBhdGggd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbc2hvcnRlc3QtcGF0aC10by10YXJnZXRdXWBcbiAgICovXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1N0eWxlIHtcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFthbGlhc10ocGF0aC90by90YXJnZXQubWQpYFxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXRdXWBcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXR8YWxpYXNdXWBcbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG5lbnVtIEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlTm90ZScsXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0QmFja2xpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgbGlua0NvbnZlcnRlcih0aGlzOiB2b2lkLCBsaW5rOiBSZWZlcmVuY2UpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgYWZ0ZXIgaXRzIGxpbmtzIGFyZSB1cGRhdGVkLCB3aXRoIHRoZSBydW5uaW5nXG4gICAqIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIG9taXR0ZWQsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdExpbmtzSW5Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSk6IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHtAbGluayBFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0b1xuICAgKiB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIGVkaXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50IFx1MjAxNCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2UgXHUyMDE0IGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0TGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRMaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdExpbmtzUGFyYW1zIGV4dGVuZHMgRWRpdExpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgbGlua0NvbnZlcnRlcih0aGlzOiB2b2lkLCBsaW5rOiBSZWZlcmVuY2UpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LlxuICAgKiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIGVkaXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCBcdTIwMTQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIFx1MjAxNCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXh0cmFjdExpbmtGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TGlua0ZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIElmIGBmYWxzZWAgYW5kIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGFuZCB7QGxpbmsgc291cmNlUGF0aE9yRmlsZX0gYXJlIHRoZSBzYW1lIGZpbGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbI3N1YnBhdGhdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3NvdXJjZSNzdWJwYXRoXV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBoYXNFbWJlZFN5bnRheH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9Tb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBzdWJwYXRoIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBTaG91bGQgYmUgZW1wdHkgb3Igc3RhcnQgd2l0aCBgI2AuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1lbXB0eS1zdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aCNuZXN0ZWQtc3VicGF0aF1dYFxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay4gRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFJlc2V0QWxpYXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3VsZFJlc2V0QWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIEEgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBub3JtYWxpemUgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGaWxlVXJsTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBub3JtYWxpemUgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCB0aGUgbm9ybWFsaXplZCBsaW5rcyB3aXRoIGFuZ2xlIGJyYWNrZXRzIGFuZCByYXcgc3BhY2VzIGluc3RlYWQgb2YgYCUyMGAtZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1RhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGx9LlxuICovXG5pbnRlcmZhY2UgRml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIGtleSBwYXRoIG9mIHRoZSBjdXJyZW50IHZhbHVlIHdpdGhpbiB0aGUgZnJvbnRtYXR0ZXIuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZnJvbnRtYXR0ZXIgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlua1RleHR9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVMaW5rVGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IGZpbGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRGaWxlOiBURmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd25MaW5rUGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlV2lraUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVXaWtpTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldEZpbGVDaGFuZ2VzfS5cbiAqL1xuaW50ZXJmYWNlIEdldEZpbGVDaGFuZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBtZXRhZGF0YSBjYWNoZSB0byBleHRyYWN0IHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FjaGUgYmVsb25ncyB0byBhIGNhbnZhcyBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgY2hhbmdlcyB0byB0aGUgbGlua3MgZnVsbHkgY29udGFpbmVkXG4gICAqIGluIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keSkgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFVzZVdpa2lsaW5rU3R5bGV9LlxuICovXG5pbnRlcmZhY2UgU2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGFibGVQb3NpdGlvbiB7XG4gIGVuZDogbnVtYmVyO1xuICBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5Db250ZW50fS5cbiAqL1xuaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRlbnQgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBuZXcgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhwYXJhbXM6IENvbnZlcnRMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIGxpbms6IHBhcmFtcy5saW5rLFxuICAgIHNvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5vbGRTb3VyY2VQYXRoT3JGaWxlID8/IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlXG4gIH0pO1xuICBpZiAoIXRhcmdldEZpbGUpIHtcbiAgICByZXR1cm4gcGFyYW1zLmxpbmsub3JpZ2luYWw7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBwYXJhbXMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rcyhwYXJhbXM6IEVkaXRCYWNrbGlua3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcCwgcGF0aE9yRmlsZSwgLi4ub3B0aW9ucyB9KTtcbiAgY29uc3QgYmFja2xpbmtOb3RlUGF0aHMgPSBbLi4uYmFja2xpbmtzLmtleXMoKV07XG4gIGxldCBwcm9jZXNzZWQgPSAwO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtOb3RlUGF0aHMpIHtcbiAgICBjb25zdCBjdXJyZW50TGlua3MgPSBlbnN1cmVOb25OdWxsYWJsZShiYWNrbGlua3MuZ2V0KGJhY2tsaW5rTm90ZVBhdGgpKTtcbiAgICBjb25zdCBsaW5rSnNvbnMgPSBuZXcgU2V0PHN0cmluZz4oY3VycmVudExpbmtzLm1hcCgobGluaykgPT4gSlNPTi5zdHJpbmdpZnkobGluaykpKTtcbiAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgYXBwLFxuICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgY29uc3QgbGlua0pzb24gPSBKU09OLnN0cmluZ2lmeShsaW5rKTtcbiAgICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgICAgfSxcbiAgICAgIHBhdGhPckZpbGU6IGJhY2tsaW5rTm90ZVBhdGgsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSk7XG4gICAgcHJvY2Vzc2VkKys7XG4gICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/Lih7XG4gICAgICBjdXJyZW50UGF0aDogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIHByb2Nlc3NlZCxcbiAgICAgIHRvdGFsOiBiYWNrbGlua05vdGVQYXRocy5sZW5ndGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rcyhwYXJhbXM6IEVkaXRMaW5rc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcblxuICBpZiAob2Zmc2V0UmFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2UpO1xuICB9XG5cbiAgYXdhaXQgYXBwbHlGaWxlQ2hhbmdlcyh7XG4gICAgYXBwLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKHsgYWJvcnRTaWduYWwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCB7XG4gICAgICAgIHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgICAgIGNvbnN0IGNhY2hlZENvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAoY29udGVudCAhPT0gY2FjaGVkQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGdldEZpbGVDaGFuZ2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlQ2hhbmdlc1BhcmFtcz4oe1xuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBpc0NhbnZhc0ZpbGUocGF0aE9yRmlsZSksXG4gICAgICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgICAgIG9mZnNldFJhbmdlLFxuICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSkpO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQocGFyYW1zOiBFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGFwcCwgY29udGVudCwgbGlua0NvbnZlcnRlciwgb2Zmc2V0UmFuZ2UsIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzID0gZmFsc2UsIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSwgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVPZmZzZXRSYW5nZShvZmZzZXRSYW5nZSk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgYXBwbHlDb250ZW50Q2hhbmdlcyh7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgY2hhbmdlc1Byb3ZpZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHBhcnNlTWV0YWRhdGEoYXBwLCBjb250ZW50LCB7XG4gICAgICAgIHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVDaGFuZ2VzUGFyYW1zPih7XG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgaXNDYW52YXNGaWxlQ2FjaGU6IGZhbHNlLFxuICAgICAgICBsaW5rQ29udmVydGVyLFxuICAgICAgICBvZmZzZXRSYW5nZSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICByZXR1cm4gY2hhbmdlcztcbiAgICB9LFxuICAgIGNvbnRlbnQsXG4gICAgcGF0aDogJydcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBleHRyYWN0aW5nIHRoZSBsaW5rIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlua0ZpbGUocGFyYW1zOiBFeHRyYWN0TGlua0ZpbGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUgPSBmYWxzZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgbGlua1BhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGlua1BhdGgsIHNvdXJjZVBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgaWYgKCFzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpbmtQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBsaW5rUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgZnVsbExpbmtQYXRoID0gam9pbihkaXJuYW1lKHNvdXJjZVBhdGgpLCBgLi8ke2xpbmtQYXRofWApO1xuXG4gIGlmIChmdWxsTGlua1BhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBmdWxsTGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBGaXhlcyB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3MgaW4gdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGNhY2hlLlxuICpcbiAqIEBwYXJhbSBjYWNoZSAtIFRoZSBtZXRhZGF0YSBjYWNoZSB0byBmaXggdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3Mgd2VyZSBmaXhlZC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUgLS0gVGhlIG5hbWUgc3RhdGVzIHRoZSBhY3Rpb247IHRoZSBib29sZWFuIG9ubHkgcmVwb3J0cyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmaXhlZC5cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKHsgY2FjaGUsIGtleTogJycsIHZhbHVlOiBjYWNoZS5mcm9udG1hdHRlciB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IERFRkFVTFRfUEFSQU1TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0UGFyYW1zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCkubWFwKChkZWZhdWx0UGFyYW1zRnVuY3Rpb24pID0+IGRlZmF1bHRQYXJhbXNGdW5jdGlvbigpKTtcbiAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9QQVJBTVMsIC4uLmN1c3RvbURlZmF1bHRQYXJhbXMsIHBhcmFtcyk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG5cbiAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXMoYXBwLCBbdGFyZ2V0RmlsZV0pO1xuICByZXR1cm4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcyk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmF3IG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgYSByYXcgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBwYXJhbXMuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGlmIChwYXJhbXMuaXNXaWtpbGluaykge1xuICAgIGNvbnN0IGFsaWFzUGFydCA9IHBhcmFtcy5hbGlhcyA/IGB8JHtwYXJhbXMuYWxpYXN9YCA6ICcnO1xuICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7cGFyYW1zLnVybH0ke2FsaWFzUGFydH1dXWA7XG4gIH1cblxuICBjb25zdCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgY29uc3Qgc2hvdWxkRXNjYXBlQWxpYXMgPSBwYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGNvbnN0IGVzY2FwZWRBbGlhcyA9IHNob3VsZEVzY2FwZUFsaWFzID8gZXNjYXBlQWxpYXMoYWxpYXMpIDogYWxpYXM7XG5cbiAgY29uc3QgdXJsID0gcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtwYXJhbXMudXJsfT5gXG4gICAgOiBlbmNvZGVVcmwocGFyYW1zLnVybCk7XG5cbiAgY29uc3QgdGl0bGVQYXJ0ID0gcGFyYW1zLnRpdGxlID8gYCAke0pTT04uc3RyaW5naWZ5KHBhcmFtcy50aXRsZSl9YCA6ICcnO1xuXG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHtlc2NhcGVkQWxpYXN9XSgke3VybH0ke3RpdGxlUGFydH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaGFyZWQsIG11dGFibGUgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBwcm92aWRlIGRlZmF1bHQgcGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICpcbiAqIEVhY2ggZnVuY3Rpb24gaXMgaW52b2tlZCBvbiBldmVyeSB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9IGNhbGwgYW5kIGl0cyByZXN1bHQgaXMgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyAobGF0ZXJcbiAqIHJlZ2lzdHJhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLCBidXQgbmV2ZXIgb3ZlciBleHBsaWNpdGx5IHBhc3NlZCBwYXJhbXMpLiBSZWdpc3RlciBlbnRyaWVzXG4gKiBieSBhZGRpbmcgYSBgR2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zQ29tcG9uZW50YCB0byBhIGNvbXBvbmVudCB0cmVlIHJhdGhlciB0aGFuIG11dGF0aW5nIHRoaXMgbGlzdCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbXV0YWJsZSBsaXN0IG9mIGRlZmF1bHQtcGFyYW1zIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpOiAoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oJ2dlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0cyhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5oYXNBbmdsZUJyYWNrZXRzID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWJlZFN5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzTGVhZGluZ1NsYXNoKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcvJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNXaWtpbGlua1N5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmVzZXRBbGlhcyhwYXJhbXM6IFNob3VsZFJlc2V0QWxpYXNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKGlzV2lraWxpbmsgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5VGV4dCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IHRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3QgbmV3U291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBuZXdTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG5ld1NvdXJjZVBhdGgpO1xuICBjb25zdCBvbGRTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG9sZFNvdXJjZVBhdGgpO1xuICBjb25zdCBhbGlhc2VzVG9SZXNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcGF0aE9yRmlsZSBvZiBbdGFyZ2V0RmlsZS5wYXRoLCBvbGRUYXJnZXRQYXRoXSkge1xuICAgIGlmICghcGF0aE9yRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUobmV3U291cmNlRm9sZGVyLCBwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG9sZFNvdXJjZUZvbGRlciwgcGF0aCkpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIFtvbGRTb3VyY2VQYXRoLCBuZXdTb3VyY2VQYXRoXSkge1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBmYWxzZSkpO1xuICB9XG5cbiAgY29uc3QgY2xlYW5EaXNwbGF5VGV4dCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IG5vcm1hbGl6ZVBhdGgoZW5zdXJlTm9uTnVsbGFibGUoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcsIDEpWzBdKSksXG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXlxcLlxcLy9nXG4gIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZVN0cmluZyhsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkXG4gKiBzbGFzaGVzLiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggbm9ybWFsaXplZCBgZmlsZTovL2AgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGFwcCwgY29udGVudCwgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc0luQ29udGVudFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsOiBwYXJhbXMuYWJvcnRTaWduYWwsXG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWVcbiAgfSkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGZpbGUgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuXG4gKiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBlZGl0TGlua3Moe1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKHBhcmFtczogVXBkYXRlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGluayxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbmV3VGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbFxuICB9KSk7XG5cbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuXG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgbGV0IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzV2lraWxpbmsgJiYgcGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgIGFsaWFzID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICB9XG5cbiAgYWxpYXMgPz89IHNob3VsZFJlc2V0QWxpYXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFJlc2V0QWxpYXNQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGRpc3BsYXlUZXh0OiBsaW5rLmRpc3BsYXlUZXh0LFxuICAgICAgaXNXaWtpbGluayxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkVGFyZ2V0UGF0aCxcbiAgICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgICB9KSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogcGFyc2VMaW5rUmVzdWx0Py5hbGlhcztcblxuICAvLyBSZWZyZXNoIGEgZmlsZS1uYW1lIGFsaWFzIHRvIHRoZSBuZXcgYmFzZSBuYW1lIHdoZW4gdGhlIGZsYWcgaXMgc2V0LlxuICAvLyBBIGZpbGUtbmFtZSBhbGlhcyBlcXVhbHMgdGhlIE9MRCBiYXNlIG5hbWUgKHdpdGggb3Igd2l0aG91dCBleHRlbnNpb24pOyBhIGN1c3RvbSBhbGlhcyBpcyBrZXB0LlxuICAvLyBHYXRpbmcgb24gdGhlIGZsYWcgYWxzbyByZWZyZXNoZXMgd2lraWxpbmtzIHRoYXQgY2FycnkgYW4gZXhwbGljaXQgYWxpYXMuXG4gIC8vIFRob3NlIHByZXZpb3VzbHkgc2hvcnQtY2lyY3VpdGVkIHRoZSByZWZyZXNoIGFuZCBrZXB0IHRoZSBzdGFsZSBvbGQgYmFzZSBuYW1lLlxuICBpZiAoc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCwgZXh0bmFtZShvbGRUYXJnZXRQYXRoKSkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV3TGluayA9IGdlbmVyYXRlTWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBvbGRTb3VyY2VQYXRoID09PSBvbGRUYXJnZXRQYXRoICYmICEhcGFyc2VMaW5rUmVzdWx0Py5hbGlhcyxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsLFxuICAgIHNvdXJjZVBhdGhPckZpbGU6IG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gIH0pKTtcbiAgcmV0dXJuIG5ld0xpbms7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCB1cGRhdGVkIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSA9IHBhcmFtcztcblxuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSBoYXNFbWJlZFN5bnRheChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3Moe1xuICAgIC4uLnBhcmFtcyxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSBoYXNFbWJlZFN5bnRheChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlXG4gIH0pO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBNaXJyb3JzIHRoZSBleHBvcnRlZCBmdW5jdGlvbiBpdCBpbXBsZW1lbnRzLlxuZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChwYXJhbXM6IEZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGxQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwoeyBjYWNoZSwga2V5OiBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCB2YWx1ZTogY2hpbGRWYWx1ZSB9KTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChwYXJhbXM6IEdlbmVyYXRlTGlua1RleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgY29uZmlnLCBzdWJwYXRoLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IHNvdXJjZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OiB7XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZToge1xuICAgICAgICBsaW5rVGV4dCA9IHJlbGF0aXZlKGRpcm5hbWUoc291cmNlUGF0aCksIHRhcmdldEZpbGUucGF0aCk7XG4gICAgICAgIGlmIChjb25maWcuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC4vJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICAgIGNvbnN0IHNob3J0ZXN0TmFtZSA9IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpID8gdGFyZ2V0RmlsZS5iYXNlbmFtZSA6IHRhcmdldEZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0TGlua3BhdGhEZXN0KHNob3J0ZXN0TmFtZSwgc291cmNlUGF0aCk7XG4gICAgICAgIGxpbmtUZXh0ID0gbWF0Y2hlZEZpbGVzLmxlbmd0aCA9PT0gMSAmJiBtYXRjaGVkRmlsZXNbMF0gPT09IHRhcmdldEZpbGUgPyB0YXJnZXRGaWxlLm5hbWUgOiB0YXJnZXRGaWxlLnBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCB2YWxpZCBGaW5hbExpbmtQYXRoU3R5bGUgdmFsdWVzIGFyZSBoYW5kbGVkIGFib3ZlLiAqL1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICB9XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGlua1xuICAgID8gdHJpbUVuZCh7XG4gICAgICAkc3RyaW5nOiBsaW5rVGV4dCxcbiAgICAgIHN1ZmZpeDogYC4ke01BUktET1dOX0ZJTEVfRVhURU5TSU9OfWBcbiAgICB9KVxuICAgIDogbGlua1RleHQ7XG4gIGxpbmtUZXh0ICs9IHN1YnBhdGg7XG5cbiAgcmV0dXJuIGxpbmtUZXh0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gcGFyYW1zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcocGFyYW1zKTtcbiAgY29uc3QgbGlua1RleHQgPSBnZW5lcmF0ZUxpbmtUZXh0KHtcbiAgICBhcHAsXG4gICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgIHNvdXJjZVBhdGgsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRGaWxlXG4gIH0pO1xuXG4gIHJldHVybiBsaW5rQ29uZmlnLmlzV2lraWxpbmtcbiAgICA/IGdlbmVyYXRlV2lraUxpbmsoe1xuICAgICAgYWxpYXM6IHBhcmFtcy5hbGlhcyxcbiAgICAgIGlzRW1iZWQ6IGxpbmtDb25maWcuaXNFbWJlZCxcbiAgICAgIGxpbmtUZXh0XG4gICAgfSlcbiAgICA6IGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsoe1xuICAgICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgICAgbGlua1RleHQsXG4gICAgICBtYXJrZG93bkxpbmtQYXJhbXM6IHBhcmFtcyxcbiAgICAgIHRhcmdldEZpbGVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGNvbmZpZywgbGlua1RleHQsIG1hcmtkb3duTGlua1BhcmFtcywgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgYWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGxldCBzaG91bGRFc2NhcGVBbGlhcyA9IG1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgaWYgKCFhbGlhcyAmJiAoaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgfHwgIW1hcmtkb3duTGlua1BhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhbWFya2Rvd25MaW5rUGFyYW1zLnNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzIHx8IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgIHNob3VsZEVzY2FwZUFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZDogY29uZmlnLmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXaWtpTGluayhwYXJhbXM6IEdlbmVyYXRlV2lraUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFsaWFzLCBpc0VtYmVkLCBsaW5rVGV4dCB9ID0gcGFyYW1zO1xuICBpZiAoYWxpYXM/LnRvTG93ZXJDYXNlKCkgPT09IGxpbmtUZXh0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgICAgaXNFbWJlZCxcbiAgICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgICB1cmw6IGFsaWFzXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhwYXJhbXM6IEdldEZpbGVDaGFuZ2VzUGFyYW1zKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGlzQ2FudmFzRmlsZUNhY2hlLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgY29uc3QgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdMaW5rOmdldEZpbGVDaGFuZ2VzJyk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGdldExpbmtzKHsgY2FjaGUsIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzLCBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLCBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyB9KSkge1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBpZiAob2Zmc2V0UmFuZ2UgIT09IHVuZGVmaW5lZCAmJiAhaXNSZWZlcmVuY2VJbk9mZnNldFJhbmdlKGxpbmssIG9mZnNldFJhbmdlKSkge1xuICAgICAgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlcihcbiAgICAgICAgaXNSZWZlcmVuY2VDYWNoZShsaW5rKVxuICAgICAgICAgID8gJ1NraXBwaW5nIGEgbGluayB0aGF0IGlzIG5vdCBmdWxseSBjb250YWluZWQgaW4gdGhlIG9mZnNldCByYW5nZSdcbiAgICAgICAgICA6ICdTa2lwcGluZyBhIGxpbmsgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCwgc28gaXQgY2FuIG5ldmVyIGJlIGluIHRoZSBvZmZzZXQgcmFuZ2UnLFxuICAgICAgICB7IGxpbms6IGxpbmsub3JpZ2luYWwsIG9mZnNldFJhbmdlIH1cbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9ucykpIHtcbiAgICAgICAgZmlsZUNoYW5nZS5uZXdDb250ZW50ID0gZmlsZUNoYW5nZS5uZXdDb250ZW50LnJlcGxhY2VBbGwoVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLCAoKSA9PiBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIpO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VzO1xufVxuXG5mdW5jdGlvbiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwOiBBcHAsIGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtQYXRoU3R5bGUgPz8gTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDtcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0OiB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcCk7XG4gICAgfVxuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZToge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBMaW5rQ29uZmlnIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBpc0VtYmVkOiBwYXJhbXMuaXNFbWJlZCA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0VtYmVkU3ludGF4KHBhcmFtcy5vcmlnaW5hbExpbmspIDogZmFsc2UpLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IHBhcmFtcy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkID8/IHRydWUsXG4gICAgaXNXaWtpbGluazogc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgb3JpZ2luYWxMaW5rOiBwYXJhbXMub3JpZ2luYWxMaW5rXG4gICAgfSkpLFxuICAgIGxpbmtQYXRoU3R5bGU6IGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHAsIHBhcmFtcy5saW5rUGF0aFN0eWxlKSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0FuZ2xlQnJhY2tldHMocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzTGVhZGluZ0RvdChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzTGVhZGluZ1NsYXNoKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGaWxlVXJsTGluayhsaW5rOiBSZWZlcmVuY2UsIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW4pOiBNYXliZVJldHVybjxzdHJpbmc+IHtcbiAgaWYgKGlzUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UobGluaykpIHtcbiAgICBpZiAoIWxpbmsucGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgZnJvbnRtYXR0ZXIgdmFsdWUgaG9sZHMgYSBiYXJlIFVSTCAocmUtc2VyaWFsaXplZC9xdW90ZWQgYXMgWUFNTCksIG5vdCBhIGBbYWxpYXNdKHVybClgIG1hcmtkb3duIGxpbmsuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZpbGVVcmwobGluay5wYXJzZUxpbmtSZXN1bHQudXJsKTtcbiAgfVxuXG4gIGlmICghaXNQYXJzZUxpbmtSZWZlcmVuY2UobGluaykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IHBhcnNlTGlua1Jlc3VsdCB9ID0gbGluaztcbiAgaWYgKCFwYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzOiBwYXJzZUxpbmtSZXN1bHQuYWxpYXMsXG4gICAgaXNFbWJlZDogcGFyc2VMaW5rUmVzdWx0LmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICB1cmw6IG5vcm1hbGl6ZUZpbGVVcmwocGFyc2VMaW5rUmVzdWx0LnVybClcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwOiBBcHApOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCBuZXdMaW5rRm9ybWF0ID0gZ2V0TmV3TGlua0Zvcm1hdChhcHApO1xuICBzd2l0Y2ggKG5ld0xpbmtGb3JtYXQpIHtcbiAgICBjYXNlICdhYnNvbHV0ZSc6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICB9XG4gICAgY2FzZSAncmVsYXRpdmUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIH1cbiAgICBjYXNlICdzaG9ydGVzdCc6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihuZXdMaW5rRm9ybWF0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgaWYgKCFVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAudGVzdChmaWxlQ2hhbmdlLm5ld0NvbnRlbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlUG9zaXRpb25zLnNvbWUoKHRhYmxlUG9zaXRpb24pID0+IHRhYmxlUG9zaXRpb24uc3RhcnQgPD0gZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICYmIGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gdGFibGVQb3NpdGlvbi5lbmQpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKHBhcmFtczogU2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGFwcCwgbGlua1N0eWxlLCBvcmlnaW5hbExpbmsgfSA9IHBhcmFtcztcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtTdHlsZSA/PyBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZztcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rU3R5bGUuTWFya2Rvd246IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZzoge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiBoYXNXaWtpbGlua1N5bnRheChvcmlnaW5hbExpbmspO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlOiBPZmZzZXRSYW5nZSk6IHZvaWQge1xuICBpZiAob2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCByYW5nZTogdGhlIHN0YXJ0IG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5zdGFydE9mZnNldCl9IG11c3Qgbm90IGJlIG5lZ2F0aXZlLmApO1xuICB9XG5cbiAgaWYgKG9mZnNldFJhbmdlLmVuZE9mZnNldCA8IG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCByYW5nZTogdGhlIGVuZCBvZmZzZXQgJHtTdHJpbmcob2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0KX0gbXVzdCBub3QgYmUgbGVzcyB0aGFuIHRoZSBzdGFydCBvZmZzZXQgJHtTdHJpbmcob2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpfS5gKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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
1008
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnLi4vdHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVTdHJpbmcsXG4gIHJlcGxhY2VBbGwsXG4gIHRyaW1FbmRcbn0gZnJvbSAnLi4vc3RyaW5nLnRzJztcbmltcG9ydCB7XG4gIGFzc2VydE5ldmVyLFxuICBhc3NlcnROb25OdWxsYWJsZSxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQge1xuICBhcHBseUNvbnRlbnRDaGFuZ2VzLFxuICBhcHBseUZpbGVDaGFuZ2VzLFxuICBpc0NhbnZhc0NoYW5nZSxcbiAgaXNDb250ZW50Q2hhbmdlXG59IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuL21ldGFkYXRhLWNhY2hlLnRzJztcbmltcG9ydCB7XG4gIGdldE5ld0xpbmtGb3JtYXQsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL29ic2lkaWFuLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZUFsaWFzLFxuICBpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlLFxuICBpc1BhcnNlTGlua1JlZmVyZW5jZSxcbiAgcGFyc2VMaW5rXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICBpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UsXG4gIHJlZmVyZW5jZVRvRmlsZUNoYW5nZVxufSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5cbmNvbnN0IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUiA9IFN0cmluZy5yYXdgXFx8YDtcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHVuZXNjYXBlZCBwaXBlcy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/PCFcXFxcKVxcfC9nO1xuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1BhdGhTdHlsZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL2Zyb20vdGhlL3ZhdWx0L3Jvb3QvdGFyZ2V0XV1gXG4gICAqL1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBwYXRoIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1suLi8uLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNob3J0ZXN0IHBhdGggd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbc2hvcnRlc3QtcGF0aC10by10YXJnZXRdXWBcbiAgICovXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1N0eWxlIHtcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFthbGlhc10ocGF0aC90by90YXJnZXQubWQpYFxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXRdXWBcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXR8YWxpYXNdXWBcbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG5lbnVtIEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlTm90ZScsXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0QmFja2xpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0QmFja2xpbmtzUGFyYW1zIGV4dGVuZHMgRWRpdEJhY2tsaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcmVwb3J0ZXIgaW52b2tlZCBvbmNlIHBlciBiYWNrbGluayBmaWxlIGFmdGVyIGl0cyBsaW5rcyBhcmUgdXBkYXRlZCwgd2l0aCB0aGUgcnVubmluZ1xuICAgKiBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBvbWl0dGVkLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRMaW5rc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdExpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBlZGl0IHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgbGlua0NvbnZlcnRlcih0aGlzOiB2b2lkLCBsaW5rOiBSZWZlcmVuY2UpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgRWRpdExpbmtzSW5Db250ZW50UGFyYW1zLmNvbnRlbnR9LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG9cbiAgICogdGhlIGxpbmtzIGluc2lkZSBpdC4gV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBlZGl0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCBcdTIwMTQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIFx1MjAxNCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdExpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRMaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC5cbiAgICogV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBlZGl0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQgXHUyMDE0IGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rXG4gICAqIGZyb250bWF0dGVyIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSBcdTIwMTQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpc1xuICAgKiBzdXBwbGllZC5cbiAgICpcbiAgICogVGhlIG9mZnNldHMgYXJlIGludG8gdGhlIGNvbnRlbnQgdGhpcyBmdW5jdGlvbiByZWFkcyBmcm9tIHRoZSB2YXVsdC4gQmVmb3JlIHJlYWRpbmcsIGl0IHNhdmVzIGFueVxuICAgKiB1bnNhdmVkIGVkaXRvciBidWZmZXIgZm9yIHRoZSBmaWxlLCBzbyBhIHJhbmdlIHRha2VuIGZyb20gYW4gb3BlbiBlZGl0b3IgdmlhIGBFZGl0b3IucG9zVG9PZmZzZXRgIGlzXG4gICAqIHZhbGlkLiBUaGUgY2FsbGVyIG93bnMgb25seSB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGNoYW5nZXMgYmV0d2VlbiBjb21wdXRpbmcgdGhlIHJhbmdlIGFuZCB0aGlzXG4gICAqIGNhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGxpbmtzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlblxuICAgKiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzbyByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBlYWNoIGV4dGVybmFsIGxpbmsgd2l0aGluIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSAoZWFjaCBsb2NhdGVkIGJ5IGl0cyBvZmZzZXRzLCBzbyBvbmx5IHRoYXQgbGluayBpcyBzcGxpY2VkIGJhY2sgaW4gcGxhY2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV4dHJhY3RMaW5rRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdExpbmtGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIGNhY2hlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1t0YXJnZXRdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3RhcmdldF1dYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYSBzaW5nbGUgc3VicGF0aC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2ZcbiAgICpcbiAgICogLSB7QGxpbmsgaGFzRW1iZWRTeW50YXh9XG4gICAqIC0ge0BsaW5rIGxpbmtTdHlsZX1cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlQW5nbGVCcmFja2V0c31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHN9XG4gICAqXG4gICAqIFRoZXNlIGluZmVycmVkIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpZiBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGhhc1dpa2lsaW5rU3ludGF4fSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGFuZ2xlIGJyYWNrZXRzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGhhc1dpa2lsaW5rU3ludGF4fSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gbm9ybWFsaXplIHRoZSBgZmlsZTovL2AgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCB0aGUgbm9ybWFsaXplZCBsaW5rcyB3aXRoIGFuZ2xlIGJyYWNrZXRzIGFuZCByYXcgc3BhY2VzIGluc3RlYWQgb2YgYCUyMGAtZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gbm9ybWFsaXplIHRoZSBgZmlsZTovL2AgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgdGhlIG5vcm1hbGl6ZWQgbGlua3Mgd2l0aCBhbmdsZSBicmFja2V0cyBhbmQgcmF3IHNwYWNlcyBpbnN0ZWFkIG9mIGAlMjBgLWVuY29kaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGx9LlxuICovXG5pbnRlcmZhY2UgRml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIGtleSBwYXRoIG9mIHRoZSBjdXJyZW50IHZhbHVlIHdpdGhpbiB0aGUgZnJvbnRtYXR0ZXIuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZnJvbnRtYXR0ZXIgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlua1RleHR9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVMaW5rVGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IGZpbGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRGaWxlOiBURmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd25MaW5rUGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlV2lraUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVXaWtpTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldEZpbGVDaGFuZ2VzfS5cbiAqL1xuaW50ZXJmYWNlIEdldEZpbGVDaGFuZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBtZXRhZGF0YSBjYWNoZSB0byBleHRyYWN0IHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FjaGUgYmVsb25ncyB0byBhIGNhbnZhcyBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgY2hhbmdlcyB0byB0aGUgbGlua3MgZnVsbHkgY29udGFpbmVkXG4gICAqIGluIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keSkgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFVzZVdpa2lsaW5rU3R5bGV9LlxuICovXG5pbnRlcmZhY2UgU2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGFibGVQb3NpdGlvbiB7XG4gIGVuZDogbnVtYmVyO1xuICBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5Db250ZW50fS5cbiAqL1xuaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRlbnQgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsocGFyYW1zOiBDb252ZXJ0TGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSA/PyBwYXJhbXMubmV3U291cmNlUGF0aE9yRmlsZVxuICB9KTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIHBhcmFtcy5saW5rLm9yaWdpbmFsO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgbGlua1BhdGhTdHlsZTogcGFyYW1zLmxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogcGFyYW1zLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGNvbnN0IGJhY2tsaW5rTm90ZVBhdGhzID0gWy4uLmJhY2tsaW5rcy5rZXlzKCldO1xuICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgZm9yIChjb25zdCBiYWNrbGlua05vdGVQYXRoIG9mIGJhY2tsaW5rTm90ZVBhdGhzKSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gZW5zdXJlTm9uTnVsbGFibGUoYmFja2xpbmtzLmdldChiYWNrbGlua05vdGVQYXRoKSk7XG4gICAgY29uc3QgbGlua0pzb25zID0gbmV3IFNldDxzdHJpbmc+KGN1cnJlbnRMaW5rcy5tYXAoKGxpbmspID0+IEpTT04uc3RyaW5naWZ5KGxpbmspKSk7XG4gICAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtKc29uID0gSlNPTi5zdHJpbmdpZnkobGluayk7XG4gICAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICAgIH0sXG4gICAgICBwYXRoT3JGaWxlOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICAgIHByb2Nlc3NlZCsrO1xuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPy4oe1xuICAgICAgY3VycmVudFBhdGg6IGJhY2tsaW5rTm90ZVBhdGgsXG4gICAgICBwcm9jZXNzZWQsXG4gICAgICB0b3RhbDogYmFja2xpbmtOb3RlUGF0aHMubGVuZ3RoXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MocGFyYW1zOiBFZGl0TGlua3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKG9mZnNldFJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlKTtcbiAgfVxuXG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoe1xuICAgIGFwcCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICh7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZUNoYW5nZXNQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpLFxuICAgICAgICBsaW5rQ29udmVydGVyLFxuICAgICAgICBvZmZzZXRSYW5nZSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzIGluIHRoZSBjb250ZW50LlxuICogQHJldHVybnMgVGhlIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBjb250ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzSW5Db250ZW50KHBhcmFtczogRWRpdExpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQsIGxpbmtDb252ZXJ0ZXIsIG9mZnNldFJhbmdlLCBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLCBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UgfSA9IHBhcmFtcztcbiAgbGV0IHsgYWJvcnRTaWduYWwgfSA9IHBhcmFtcztcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAob2Zmc2V0UmFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2UpO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IGdldEZpbGVDaGFuZ2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlQ2hhbmdlc1BhcmFtcz4oe1xuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBmYWxzZSxcbiAgICAgICAgbGlua0NvbnZlcnRlcixcbiAgICAgICAgb2Zmc2V0UmFuZ2UsXG4gICAgICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfSxcbiAgICBjb250ZW50LFxuICAgIHBhdGg6ICcnXG4gIH0pO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld0NvbnRlbnQsICdGYWlsZWQgdG8gdXBkYXRlIGxpbmtzIGluIGNvbnRlbnQnKTtcblxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZXh0cmFjdGluZyB0aGUgbGluayBmaWxlLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKHBhcmFtczogRXh0cmFjdExpbmtGaWxlUGFyYW1zKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UsXG4gICAgc291cmNlUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogZnVsbExpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtYm9vbGVhbi1uYW1lIC0tIFRoZSBuYW1lIHN0YXRlcyB0aGUgYWN0aW9uOyB0aGUgYm9vbGVhbiBvbmx5IHJlcG9ydHMgd2hldGhlciBhbnl0aGluZyB3YXMgZml4ZWQuXG5leHBvcnQgZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzKGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbCh7IGNhY2hlLCBrZXk6ICcnLCB2YWx1ZTogY2FjaGUuZnJvbnRtYXR0ZXIgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbWFya2Rvd24gbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcblxuICBjb25zdCBERUZBVUxUX1BBUkFNUzogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4gPSB7XG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkOiB0cnVlXG4gIH07XG5cbiAgY29uc3QgY3VzdG9tRGVmYXVsdFBhcmFtcyA9IGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpLm1hcCgoZGVmYXVsdFBhcmFtc0Z1bmN0aW9uKSA9PiBkZWZhdWx0UGFyYW1zRnVuY3Rpb24oKSk7XG4gIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfUEFSQU1TLCAuLi5jdXN0b21EZWZhdWx0UGFyYW1zLCBwYXJhbXMpO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuXG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW3RhcmdldEZpbGVdKTtcbiAgcmV0dXJuIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXMpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhdyBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIGEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBBIHJhdyBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gcGFyYW1zLmlzRW1iZWQgPyAnIScgOiAnJztcblxuICBpZiAocGFyYW1zLmlzV2lraWxpbmspIHtcbiAgICBjb25zdCBhbGlhc1BhcnQgPSBwYXJhbXMuYWxpYXMgPyBgfCR7cGFyYW1zLmFsaWFzfWAgOiAnJztcbiAgICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9W1ske3BhcmFtcy51cmx9JHthbGlhc1BhcnR9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXMgPSBwYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGNvbnN0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBjb25zdCBlc2NhcGVkQWxpYXMgPSBzaG91bGRFc2NhcGVBbGlhcyA/IGVzY2FwZUFsaWFzKGFsaWFzKSA6IGFsaWFzO1xuXG4gIGNvbnN0IHVybCA9IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzXG4gICAgPyBgPCR7cGFyYW1zLnVybH0+YFxuICAgIDogZW5jb2RlVXJsKHBhcmFtcy51cmwpO1xuXG4gIGNvbnN0IHRpdGxlUGFydCA9IHBhcmFtcy50aXRsZSA/IGAgJHtKU09OLnN0cmluZ2lmeShwYXJhbXMudGl0bGUpfWAgOiAnJztcblxuICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9WyR7ZXNjYXBlZEFsaWFzfV0oJHt1cmx9JHt0aXRsZVBhcnR9KWA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2hhcmVkLCBtdXRhYmxlIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSBkZWZhdWx0IHBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGlzIGludm9rZWQgb24gZXZlcnkge0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfSBjYWxsIGFuZCBpdHMgcmVzdWx0IGlzIG1lcmdlZCBpbnRvIHRoZSBwYXJhbXMgKGxhdGVyXG4gKiByZWdpc3RyYXRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cywgYnV0IG5ldmVyIG92ZXIgZXhwbGljaXRseSBwYXNzZWQgcGFyYW1zKS4gUmVnaXN0ZXIgZW50cmllc1xuICogYnkgYWRkaW5nIGEgYEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0NvbXBvbmVudGAgdG8gYSBjb21wb25lbnQgdHJlZSByYXRoZXIgdGhhbiBtdXRhdGluZyB0aGlzIGxpc3QgZGlyZWN0bHkuXG4gKlxuICogQHJldHVybnMgVGhlIG11dGFibGUgbGlzdCBvZiBkZWZhdWx0LXBhcmFtcyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKTogKCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTwoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10+KCdnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMnLCBbXSkudmFsdWU7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0FuZ2xlQnJhY2tldHMobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaGFzQW5nbGVCcmFja2V0cyA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhbiBlbWJlZCBsaW5rOlxuICogYCFbW2xpbmtdXWAsIGAhW3RpdGxlXShsaW5rKWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRW1iZWRTeW50YXgobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNFbWJlZCA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIGRvdCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1suL2xpbmtdXWAsIGBbdGl0bGVdKC4vbGluaylgLCBgW3RpdGxlXSg8Li9saW5rPilgLFxuICogYCFbWy4vbGlua11dYCwgYCFbdGl0bGVdKC4vbGluaylgLCBgIVt0aXRsZV0oPC4vbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIGRvdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzTGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLi8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy9saW5rXV1gLCBgW3RpdGxlXSgvbGluaylgLCBgW3RpdGxlXSg8L2xpbms+KWAsXG4gKiBgIVtbL2xpbmtdXWAsIGAhW3RpdGxlXSgvbGluaylgLCBgIVt0aXRsZV0oPC9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0xlYWRpbmdTbGFzaChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGEgd2lraWxpbmssIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbbGlua11dYCwgYCFbW2xpbmtdXWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYSB3aWtpbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzV2lraWxpbmtTeW50YXgobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNXaWtpbGluayA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhbGlhcyBvZiBhIGxpbmsgc2hvdWxkIGJlIHJlc2V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMocGFyYW1zOiBTaG91bGRSZXNldEFsaWFzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZGlzcGxheVRleHQsXG4gICAgaXNXaWtpbGluayxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChpc1dpa2lsaW5rID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiB0YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG5ld1NvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgbmV3U291cmNlRm9sZGVyID0gZGlybmFtZShuZXdTb3VyY2VQYXRoKTtcbiAgY29uc3Qgb2xkU291cmNlRm9sZGVyID0gZGlybmFtZShvbGRTb3VyY2VQYXRoKTtcbiAgY29uc3QgYWxpYXNlc1RvUmVzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhdGhPckZpbGUgb2YgW3RhcmdldEZpbGUucGF0aCwgb2xkVGFyZ2V0UGF0aF0pIHtcbiAgICBpZiAoIXBhdGhPckZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHBhdGgpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChiYXNlbmFtZShwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG5ld1NvdXJjZUZvbGRlciwgcGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShvbGRTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBbb2xkU291cmNlUGF0aCwgbmV3U291cmNlUGF0aF0pIHtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcbiAgfVxuXG4gIGNvbnN0IGNsZWFuRGlzcGxheVRleHQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBub3JtYWxpemVQYXRoKGVuc3VyZU5vbk51bGxhYmxlKGRpc3BsYXlUZXh0LnNwbGl0KCcgPiAnLCAxKVswXSkpLFxuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogL15cXC5cXC8vZ1xuICB9KS50b0xvd2VyQ2FzZSgpO1xuXG4gIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlc1RvUmVzZXQpIHtcbiAgICBpZiAoYWxpYXMudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShhbGlhcyk7XG4gICAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGFsaWFzLCBleHRuYW1lKGFsaWFzKSk7XG4gICAgaWYgKGpvaW4oZm9sZGVyLCBiYXNlKS50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFN1YnBhdGgobGluazogc3RyaW5nKTogU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VMaW5rdGV4dChub3JtYWxpemVTdHJpbmcobGluaykpO1xuICByZXR1cm4ge1xuICAgIGxpbmtQYXRoOiBwYXJzZWQucGF0aCxcbiAgICBzdWJwYXRoOiBwYXJzZWQuc3VicGF0aFxuICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIHRvIGEgcHJldHR5IGZvcm0sIGNvbnZlcnRpbmcgYmFja3NsYXNoZXMgdG8gZm9yd2FyZFxuICogc2xhc2hlcy4gT3RoZXIgbGlua3MgYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igbm9ybWFsaXppbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIG5vcm1hbGl6ZWQgYGZpbGU6Ly9gIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQsIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbDogcGFyYW1zLmFib3J0U2lnbmFsLFxuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiBub3JtYWxpemVGaWxlVXJsTGluayhsaW5rLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzKSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBmaWxlIHRvIGEgcHJldHR5IGZvcm0sIGNvbnZlcnRpbmcgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLlxuICogT3RoZXIgbGlua3MgYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igbm9ybWFsaXppbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgbm9ybWFsaXplZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbmV3VGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbFxuICB9KSk7XG5cbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuXG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgbGV0IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzV2lraWxpbmsgJiYgcGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgIGFsaWFzID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICB9XG5cbiAgYWxpYXMgPz89IHNob3VsZFJlc2V0QWxpYXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFJlc2V0QWxpYXNQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGRpc3BsYXlUZXh0OiBsaW5rLmRpc3BsYXlUZXh0LFxuICAgICAgaXNXaWtpbGluayxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkVGFyZ2V0UGF0aCxcbiAgICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgICB9KSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogcGFyc2VMaW5rUmVzdWx0Py5hbGlhcztcblxuICAvLyBSZWZyZXNoIGEgZmlsZS1uYW1lIGFsaWFzIHRvIHRoZSBuZXcgYmFzZSBuYW1lIHdoZW4gdGhlIGZsYWcgaXMgc2V0LlxuICAvLyBBIGZpbGUtbmFtZSBhbGlhcyBlcXVhbHMgdGhlIE9MRCBiYXNlIG5hbWUgKHdpdGggb3Igd2l0aG91dCBleHRlbnNpb24pOyBhIGN1c3RvbSBhbGlhcyBpcyBrZXB0LlxuICAvLyBHYXRpbmcgb24gdGhlIGZsYWcgYWxzbyByZWZyZXNoZXMgd2lraWxpbmtzIHRoYXQgY2FycnkgYW4gZXhwbGljaXQgYWxpYXMuXG4gIC8vIFRob3NlIHByZXZpb3VzbHkgc2hvcnQtY2lyY3VpdGVkIHRoZSByZWZyZXNoIGFuZCBrZXB0IHRoZSBzdGFsZSBvbGQgYmFzZSBuYW1lLlxuICBpZiAoc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCwgZXh0bmFtZShvbGRUYXJnZXRQYXRoKSkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV3TGluayA9IGdlbmVyYXRlTWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBvbGRTb3VyY2VQYXRoID09PSBvbGRUYXJnZXRQYXRoICYmICEhcGFyc2VMaW5rUmVzdWx0Py5hbGlhcyxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIHVwZGF0ZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudCh7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gaGFzRW1iZWRTeW50YXgobGluay5vcmlnaW5hbCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgICBhcHAsXG4gICAgICAgIGxpbmssXG4gICAgICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgICAgIGxpbmtTdHlsZSxcbiAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICAgICAgfSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBmaWxlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3Moe1xuICAgIC4uLnBhcmFtcyxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSBoYXNFbWJlZFN5bnRheChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1BhdGhTdHlsZSxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlXG4gIH0pO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBNaXJyb3JzIHRoZSBleHBvcnRlZCBmdW5jdGlvbiBpdCBpbXBsZW1lbnRzLlxuZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChwYXJhbXM6IEZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGxQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwoeyBjYWNoZSwga2V5OiBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCB2YWx1ZTogY2hpbGRWYWx1ZSB9KTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChwYXJhbXM6IEdlbmVyYXRlTGlua1RleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgY29uZmlnLCBzdWJwYXRoLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IHNvdXJjZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OiB7XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZToge1xuICAgICAgICBsaW5rVGV4dCA9IHJlbGF0aXZlKGRpcm5hbWUoc291cmNlUGF0aCksIHRhcmdldEZpbGUucGF0aCk7XG4gICAgICAgIGlmIChjb25maWcuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC4vJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICAgIGNvbnN0IHNob3J0ZXN0TmFtZSA9IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpID8gdGFyZ2V0RmlsZS5iYXNlbmFtZSA6IHRhcmdldEZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0TGlua3BhdGhEZXN0KHNob3J0ZXN0TmFtZSwgc291cmNlUGF0aCk7XG4gICAgICAgIGxpbmtUZXh0ID0gbWF0Y2hlZEZpbGVzLmxlbmd0aCA9PT0gMSAmJiBtYXRjaGVkRmlsZXNbMF0gPT09IHRhcmdldEZpbGUgPyB0YXJnZXRGaWxlLm5hbWUgOiB0YXJnZXRGaWxlLnBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCB2YWxpZCBGaW5hbExpbmtQYXRoU3R5bGUgdmFsdWVzIGFyZSBoYW5kbGVkIGFib3ZlLiAqL1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICB9XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGlua1xuICAgID8gdHJpbUVuZCh7XG4gICAgICAkc3RyaW5nOiBsaW5rVGV4dCxcbiAgICAgIHN1ZmZpeDogYC4ke01BUktET1dOX0ZJTEVfRVhURU5TSU9OfWBcbiAgICB9KVxuICAgIDogbGlua1RleHQ7XG4gIGxpbmtUZXh0ICs9IHN1YnBhdGg7XG5cbiAgcmV0dXJuIGxpbmtUZXh0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gcGFyYW1zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcocGFyYW1zKTtcbiAgY29uc3QgbGlua1RleHQgPSBnZW5lcmF0ZUxpbmtUZXh0KHtcbiAgICBhcHAsXG4gICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgIHNvdXJjZVBhdGgsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRGaWxlXG4gIH0pO1xuXG4gIHJldHVybiBsaW5rQ29uZmlnLmlzV2lraWxpbmtcbiAgICA/IGdlbmVyYXRlV2lraUxpbmsoe1xuICAgICAgYWxpYXM6IHBhcmFtcy5hbGlhcyxcbiAgICAgIGlzRW1iZWQ6IGxpbmtDb25maWcuaXNFbWJlZCxcbiAgICAgIGxpbmtUZXh0XG4gICAgfSlcbiAgICA6IGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsoe1xuICAgICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgICAgbGlua1RleHQsXG4gICAgICBtYXJrZG93bkxpbmtQYXJhbXM6IHBhcmFtcyxcbiAgICAgIHRhcmdldEZpbGVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGNvbmZpZywgbGlua1RleHQsIG1hcmtkb3duTGlua1BhcmFtcywgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgYWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGxldCBzaG91bGRFc2NhcGVBbGlhcyA9IG1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgaWYgKCFhbGlhcyAmJiAoaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgfHwgIW1hcmtkb3duTGlua1BhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhbWFya2Rvd25MaW5rUGFyYW1zLnNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzIHx8IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgIHNob3VsZEVzY2FwZUFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZDogY29uZmlnLmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXaWtpTGluayhwYXJhbXM6IEdlbmVyYXRlV2lraUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFsaWFzLCBpc0VtYmVkLCBsaW5rVGV4dCB9ID0gcGFyYW1zO1xuICBpZiAoYWxpYXM/LnRvTG93ZXJDYXNlKCkgPT09IGxpbmtUZXh0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgICAgaXNFbWJlZCxcbiAgICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgICB1cmw6IGFsaWFzXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhwYXJhbXM6IEdldEZpbGVDaGFuZ2VzUGFyYW1zKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGlzQ2FudmFzRmlsZUNhY2hlLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgY29uc3QgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdMaW5rOmdldEZpbGVDaGFuZ2VzJyk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGdldExpbmtzKHsgY2FjaGUsIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzLCBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLCBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyB9KSkge1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBpZiAob2Zmc2V0UmFuZ2UgIT09IHVuZGVmaW5lZCAmJiAhaXNSZWZlcmVuY2VJbk9mZnNldFJhbmdlKGxpbmssIG9mZnNldFJhbmdlKSkge1xuICAgICAgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlcihcbiAgICAgICAgaXNSZWZlcmVuY2VDYWNoZShsaW5rKVxuICAgICAgICAgID8gJ1NraXBwaW5nIGEgbGluayB0aGF0IGlzIG5vdCBmdWxseSBjb250YWluZWQgaW4gdGhlIG9mZnNldCByYW5nZSdcbiAgICAgICAgICA6ICdTa2lwcGluZyBhIGxpbmsgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCwgc28gaXQgY2FuIG5ldmVyIGJlIGluIHRoZSBvZmZzZXQgcmFuZ2UnLFxuICAgICAgICB7IGxpbms6IGxpbmsub3JpZ2luYWwsIG9mZnNldFJhbmdlIH1cbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9ucykpIHtcbiAgICAgICAgZmlsZUNoYW5nZS5uZXdDb250ZW50ID0gZmlsZUNoYW5nZS5uZXdDb250ZW50LnJlcGxhY2VBbGwoVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLCAoKSA9PiBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIpO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VzO1xufVxuXG5mdW5jdGlvbiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwOiBBcHAsIGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtQYXRoU3R5bGUgPz8gTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDtcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0OiB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcCk7XG4gICAgfVxuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZToge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBMaW5rQ29uZmlnIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBpc0VtYmVkOiBwYXJhbXMuaXNFbWJlZCA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0VtYmVkU3ludGF4KHBhcmFtcy5vcmlnaW5hbExpbmspIDogZmFsc2UpLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IHBhcmFtcy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkID8/IHRydWUsXG4gICAgaXNXaWtpbGluazogc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgb3JpZ2luYWxMaW5rOiBwYXJhbXMub3JpZ2luYWxMaW5rXG4gICAgfSkpLFxuICAgIGxpbmtQYXRoU3R5bGU6IGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHAsIHBhcmFtcy5saW5rUGF0aFN0eWxlKSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0FuZ2xlQnJhY2tldHMocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzTGVhZGluZ0RvdChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzTGVhZGluZ1NsYXNoKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGaWxlVXJsTGluayhsaW5rOiBSZWZlcmVuY2UsIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW4pOiBNYXliZVJldHVybjxzdHJpbmc+IHtcbiAgaWYgKGlzUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UobGluaykpIHtcbiAgICBpZiAoIWxpbmsucGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgZnJvbnRtYXR0ZXIgdmFsdWUgaG9sZHMgYSBiYXJlIFVSTCAocmUtc2VyaWFsaXplZC9xdW90ZWQgYXMgWUFNTCksIG5vdCBhIGBbYWxpYXNdKHVybClgIG1hcmtkb3duIGxpbmsuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZpbGVVcmwobGluay5wYXJzZUxpbmtSZXN1bHQudXJsKTtcbiAgfVxuXG4gIGlmICghaXNQYXJzZUxpbmtSZWZlcmVuY2UobGluaykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IHBhcnNlTGlua1Jlc3VsdCB9ID0gbGluaztcbiAgaWYgKCFwYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzOiBwYXJzZUxpbmtSZXN1bHQuYWxpYXMsXG4gICAgaXNFbWJlZDogcGFyc2VMaW5rUmVzdWx0LmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICB1cmw6IG5vcm1hbGl6ZUZpbGVVcmwocGFyc2VMaW5rUmVzdWx0LnVybClcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwOiBBcHApOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCBuZXdMaW5rRm9ybWF0ID0gZ2V0TmV3TGlua0Zvcm1hdChhcHApO1xuICBzd2l0Y2ggKG5ld0xpbmtGb3JtYXQpIHtcbiAgICBjYXNlICdhYnNvbHV0ZSc6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICB9XG4gICAgY2FzZSAncmVsYXRpdmUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIH1cbiAgICBjYXNlICdzaG9ydGVzdCc6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihuZXdMaW5rRm9ybWF0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgaWYgKCFVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAudGVzdChmaWxlQ2hhbmdlLm5ld0NvbnRlbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlUG9zaXRpb25zLnNvbWUoKHRhYmxlUG9zaXRpb24pID0+IHRhYmxlUG9zaXRpb24uc3RhcnQgPD0gZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICYmIGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gdGFibGVQb3NpdGlvbi5lbmQpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKHBhcmFtczogU2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGFwcCwgbGlua1N0eWxlLCBvcmlnaW5hbExpbmsgfSA9IHBhcmFtcztcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtTdHlsZSA/PyBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZztcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rU3R5bGUuTWFya2Rvd246IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZzoge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiBoYXNXaWtpbGlua1N5bnRheChvcmlnaW5hbExpbmspO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlOiBPZmZzZXRSYW5nZSk6IHZvaWQge1xuICBpZiAob2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCByYW5nZTogdGhlIHN0YXJ0IG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5zdGFydE9mZnNldCl9IG11c3Qgbm90IGJlIG5lZ2F0aXZlLmApO1xuICB9XG5cbiAgaWYgKG9mZnNldFJhbmdlLmVuZE9mZnNldCA8IG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCByYW5nZTogdGhlIGVuZCBvZmZzZXQgJHtTdHJpbmcob2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0KX0gbXVzdCBub3QgYmUgbGVzcyB0aGFuIHRoZSBzdGFydCBvZmZzZXQgJHtTdHJpbmcob2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpfS5gKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLDZCQUdPO0FBQ1Asc0JBR087QUFhUCw4QkFBaUM7QUFDakMsbUJBQStCO0FBQy9CLDBCQUE0QztBQUM1QyxzQ0FBeUM7QUFDekMsa0JBTU87QUFDUCxvQkFJTztBQUNQLHlCQUlPO0FBQ1AsaUJBR087QUFDUCx5QkFLTztBQUNQLHlCQU1PO0FBQ1AsNEJBTU87QUFDUCwrQkFHTztBQUNQLHdCQUtPO0FBQ1AsdUJBSU87QUFFUCxNQUFNLDJCQUEyQixPQUFPO0FBS3hDLE1BQU0sb0NBQW9DO0FBS25DLElBQUssZ0JBQUwsa0JBQUtBLG1CQUFMO0FBTUwsRUFBQUEsZUFBQSx5QkFBc0I7QUFLdEIsRUFBQUEsZUFBQSw2QkFBMEI7QUFPMUIsRUFBQUEsZUFB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
@@ -77,6 +77,10 @@ export interface ConvertLinkParams {
77
77
  * A reference for the link.
78
78
  */
79
79
  readonly link: Reference;
80
+ /**
81
+ * A style of the link path.
82
+ */
83
+ readonly linkPathStyle?: LinkPathStyle;
80
84
  /**
81
85
  * A style of the link.
82
86
  */
@@ -561,6 +565,10 @@ export interface UpdateLinkParams {
561
565
  * A reference for the link.
562
566
  */
563
567
  readonly link: Reference;
568
+ /**
569
+ * A style of the link path.
570
+ */
571
+ readonly linkPathStyle?: LinkPathStyle;
564
572
  /**
565
573
  * Whether to force markdown links.
566
574
  */
@@ -596,6 +604,10 @@ export interface UpdateLinksInFileParams extends ProcessOptions {
596
604
  * An Obsidian app instance.
597
605
  */
598
606
  readonly app: App;
607
+ /**
608
+ * A style of the link path.
609
+ */
610
+ readonly linkPathStyle?: LinkPathStyle;
599
611
  /**
600
612
  * A style of the link.
601
613
  */
@@ -631,6 +643,10 @@ interface UpdateLinksInContentParams {
631
643
  * A content to update the links in.
632
644
  */
633
645
  readonly content: string;
646
+ /**
647
+ * A style of the link path.
648
+ */
649
+ readonly linkPathStyle?: LinkPathStyle;
634
650
  /**
635
651
  * A style of the link.
636
652
  */