@alauda-fe/common 1.4.29-beta.2 → 1.4.30-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/array-form-table/form/component.d.ts +1 -1
  2. package/code/managed-fields-folder.util.d.ts +2 -3
  3. package/code/resource-yaml-display/component.d.ts +3 -8
  4. package/code/resource-yaml-editor/component.d.ts +2 -3
  5. package/code/yaml-sidebar/component.d.ts +6 -15
  6. package/core/abstract/base-nested-form-control.d.ts +1 -1
  7. package/core/services/kubernetes-schema.service.d.ts +1 -0
  8. package/core/services/plugin-util.service.d.ts +1 -1
  9. package/core/services/workspace-helper.service.d.ts +1 -1
  10. package/core/services/yaml-util.service.d.ts +1 -1
  11. package/core/types/schema.d.ts +9 -0
  12. package/core/utils/version.d.ts +1 -1
  13. package/esm2022/code/managed-fields-folder.util.mjs +1 -1
  14. package/esm2022/code/resource-yaml-display/component.mjs +24 -28
  15. package/esm2022/code/resource-yaml-editor/component.mjs +12 -15
  16. package/esm2022/code/yaml-examples.mjs +14 -6
  17. package/esm2022/code/yaml-sidebar/component.mjs +92 -118
  18. package/esm2022/core/services/kubernetes-schema.service.mjs +27 -21
  19. package/esm2022/core/services/plugin-util.service.mjs +3 -3
  20. package/esm2022/core/services/workspace-helper.service.mjs +1 -1
  21. package/esm2022/core/services/yaml-util.service.mjs +3 -2
  22. package/esm2022/core/types/schema.mjs +1 -1
  23. package/esm2022/permission/k8s-permission.service.mjs +5 -2
  24. package/esm2022/permission/types.mjs +1 -1
  25. package/esm2022/translate/i18n-assets-loader.mjs +7 -2
  26. package/esm2022/translate/translate.service.mjs +93 -171
  27. package/package.json +1 -1
  28. package/permission/types.d.ts +17 -8
  29. package/table/component.d.ts +1 -1
  30. package/table/helper.d.ts +1 -1
  31. package/translate/translate.service.d.ts +10 -50
@@ -6,7 +6,7 @@ import { __decorate, __metadata } from "tslib";
6
6
  import { HttpClient } from '@angular/common/http';
7
7
  import { Inject, Injectable, Optional, isDevMode, } from '@angular/core';
8
8
  import { IntlMessageFormat } from 'intl-messageformat';
9
- import { get, head, isPlainObject, template } from 'lodash-es';
9
+ import { get, head, has, isPlainObject, template } from 'lodash-es';
10
10
  import { Observable, Subject, forkJoin, throwError, EMPTY, catchError, filter, finalize, map, takeUntil, } from 'rxjs';
11
11
  import { ajax } from 'rxjs/ajax';
12
12
  import { API_GATEWAY } from '../core/constants/constants';
@@ -18,6 +18,18 @@ import { getUserLanguage } from './i18n-config';
18
18
  import { TRANSLATE_OPTIONS, TRANSLATIONS } from './tokens';
19
19
  import * as i0 from "@angular/core";
20
20
  import * as i1 from "@angular/common/http";
21
+ function getLooseLocale(locale) {
22
+ return head(locale.split(/[_-]/)) || locale;
23
+ }
24
+ function hasLodashTemplateFormat(message) {
25
+ return /\{\{[^}]+\}\}/.test(message);
26
+ }
27
+ function hasIcuMessageFormat(message) {
28
+ return /\{[^{}]+\}/.test(message);
29
+ }
30
+ function isTemplatePlainObject(data) {
31
+ return isPlainObject(data);
32
+ }
21
33
  /**
22
34
  * 国际化翻译服务
23
35
  *
@@ -96,16 +108,14 @@ export class TranslateService {
96
108
  }
97
109
  try {
98
110
  // 检测模板类型并使用相应的处理方式
99
- if (this.hasLodashTemplateFormat(translation)) {
111
+ if (hasLodashTemplateFormat(translation)) {
100
112
  return this.formatLodashTemplate(translation, data);
101
113
  }
102
- else if (this.hasIcuMessageFormat(translation)) {
114
+ if (hasIcuMessageFormat(translation)) {
103
115
  return this.formatIcuMessage(translation, data);
104
116
  }
105
- else {
106
- // 如果没有模板语法,直接返回翻译文本
107
- return translation;
108
- }
117
+ // 如果没有模板语法,直接返回翻译文本
118
+ return translation;
109
119
  }
110
120
  catch (error) {
111
121
  this.handleTemplateError(key, error);
@@ -118,17 +128,16 @@ export class TranslateService {
118
128
  * @returns 原始翻译模板文本
119
129
  */
120
130
  getRaw(key) {
131
+ // 当翻译key是null或undefined时返回空字符串
132
+ if (key == null) {
133
+ return '';
134
+ }
121
135
  if (typeof key === 'string') {
122
136
  return this.getTranslationByKey(key);
123
137
  }
124
138
  // 当key是Translation对象时,获取当前语言的翻译值
125
- const value = this.getTranslationByObject(key);
126
- // 如果找到值则返回字符串形式,否则返回JSON字符串表示
127
- if (value !== undefined) {
128
- return value === null ? 'null' : String(value);
129
- }
130
- // 如果没有找到翻译,返回JSON字符串形式
131
- return JSON.stringify(key);
139
+ const value = this.getTranslationByObject(key, this.locale);
140
+ return value == null ? '' : String(value);
132
141
  }
133
142
  /**
134
143
  * 切换到下一个支持的语言环境
@@ -244,22 +253,12 @@ export class TranslateService {
244
253
  return {};
245
254
  }
246
255
  // 如果是纯对象,直接转换其属性
247
- if (this.isPlainTemplateObject(data)) {
256
+ if (isTemplatePlainObject(data)) {
248
257
  return this.convertObjectToIcuData(data);
249
258
  }
250
259
  // 基本类型、数组、Date等包装为 { value: data }
251
260
  return { value: this.convertValueToIcuValue(data) };
252
261
  }
253
- /**
254
- * 检查是否为纯模板对象(不是数组、Date等特殊对象)
255
- */
256
- isPlainTemplateObject(data) {
257
- return (typeof data === 'object' &&
258
- data !== null &&
259
- !Array.isArray(data) &&
260
- !(data instanceof Date) &&
261
- data.constructor === Object);
262
- }
263
262
  /**
264
263
  * 转换对象的所有属性为 ICU 兼容值
265
264
  */
@@ -322,25 +321,6 @@ export class TranslateService {
322
321
  console.warn(message, error);
323
322
  }
324
323
  }
325
- /**
326
- * 检测字符串是否包含 lodash template 格式的模板语法 {{ }}
327
- * @param message - 要检测的字符串
328
- * @returns 是否包含 lodash template 语法
329
- */
330
- hasLodashTemplateFormat(message) {
331
- return /\{\{[^}]+\}\}/.test(message);
332
- }
333
- /**
334
- * 检测字符串是否包含 ICU Message Format 语法
335
- * ICU 语法包括:{variable}、{variable, type}、{variable, type, style} 等
336
- * @param message - 要检测的字符串
337
- * @returns 是否包含 ICU Message Format 语法
338
- */
339
- hasIcuMessageFormat(message) {
340
- // 检测 ICU 格式:{variable}、{variable, type}、{variable, type, style}
341
- // 但排除 lodash template 格式的 {{variable}}
342
- return /\{[^{}]+\}/.test(message) && !this.hasLodashTemplateFormat(message);
343
- }
344
324
  /**
345
325
  * 使用 lodash template 格式化文本
346
326
  * @param message - 包含 {{ }} 语法的模板字符串
@@ -375,7 +355,7 @@ export class TranslateService {
375
355
  return {};
376
356
  }
377
357
  // 如果是纯对象,直接返回
378
- if (this.isPlainTemplateObject(data)) {
358
+ if (isTemplatePlainObject(data)) {
379
359
  return data;
380
360
  }
381
361
  // 这样模板中可以使用 {{ 0 }} 访问第一个元素
@@ -590,18 +570,6 @@ export class TranslateService {
590
570
  return date.toISOString();
591
571
  }
592
572
  }
593
- /**
594
- * 通过字符串键获取翻译
595
- */
596
- getTranslationByKey(key) {
597
- return this.resolveTranslation(key);
598
- }
599
- /**
600
- * 通过翻译对象获取翻译值
601
- */
602
- getTranslationByObject(translationObj) {
603
- return this.getTranslationValue(translationObj, this.locale);
604
- }
605
573
  /**
606
574
  * 处理无效语言环境
607
575
  */
@@ -632,7 +600,8 @@ export class TranslateService {
632
600
  * 标准化远程URL
633
601
  */
634
602
  normalizeRemoteUrl(remoteUrl) {
635
- remoteUrl = this.cleanUrl(remoteUrl);
603
+ // 清理URL(移除hash片段)
604
+ remoteUrl = head(remoteUrl.split(/#/)) || remoteUrl;
636
605
  const isAbsolute = isAbsoluteUrl(remoteUrl);
637
606
  const isApiGateWayRequest = remoteUrl.startsWith(API_GATEWAY);
638
607
  // 开发模式下进行URL验证
@@ -648,12 +617,6 @@ export class TranslateService {
648
617
  }
649
618
  return remoteUrl;
650
619
  }
651
- /**
652
- * 清理URL(移除hash片段)
653
- */
654
- cleanUrl(url) {
655
- return head(url.split(/#/)) || url;
656
- }
657
620
  /**
658
621
  * 验证远程URL(开发模式)
659
622
  */
@@ -680,8 +643,8 @@ export class TranslateService {
680
643
  createMultiLocaleRequest(urlTemplate) {
681
644
  const requests = this.options.locales.map(locale => this.fetchTranslation(urlTemplate, locale).pipe(catchError(error => {
682
645
  if (this.options.loose) {
683
- const looseLocale = this.extractLooseLocale(locale);
684
- if (locale !== looseLocale &&
646
+ const looseLocale = getLooseLocale(locale);
647
+ if (looseLocale !== locale &&
685
648
  !this.options.locales.includes(looseLocale)) {
686
649
  return this.fetchTranslation(urlTemplate, looseLocale);
687
650
  }
@@ -719,140 +682,99 @@ export class TranslateService {
719
682
  }
720
683
  }
721
684
  /**
722
- * 解析翻译文本
685
+ * 通过键查找翻译文本
723
686
  */
724
- resolveTranslation(key, locale = this.locale) {
725
- // 优先从远程翻译中查找
726
- let value = this.searchInTranslationsList(key, locale, this.remoteTranslationsList);
727
- // 如果远程翻译中没有找到(undefined),则从本地翻译中查找
728
- if (value === undefined) {
729
- value = this.searchInTranslationsList(key, locale, this.translationsList);
687
+ getTranslationByKey(key, locale = this.locale) {
688
+ // 1) 精确匹配当前 locale
689
+ let value = this.findInAllTranslations(key, locale);
690
+ // 2) 宽松匹配当前 locale(如 zh-CN -> zh)
691
+ if (value === undefined && this.options.loose) {
692
+ const loose = getLooseLocale(locale);
693
+ if (loose !== locale) {
694
+ value = this.findInAllTranslations(key, loose);
695
+ }
696
+ }
697
+ // 3) 回退到 fallbackLocale
698
+ if (value === undefined && locale !== this.options.fallbackLocale) {
699
+ const fb = this.options.fallbackLocale;
700
+ value = this.findInAllTranslations(key, fb);
701
+ // 4) 宽松匹配回退 locale
702
+ if (value === undefined && this.options.loose) {
703
+ const fbLoose = getLooseLocale(fb);
704
+ if (fbLoose !== fb) {
705
+ value = this.findInAllTranslations(key, fbLoose);
706
+ }
707
+ }
730
708
  }
731
709
  return value ?? key;
732
710
  }
733
711
  /**
734
- * 在翻译列表中搜索
712
+ * 在所有翻译源中查找键值
713
+ */
714
+ findInAllTranslations(key, locale) {
715
+ // 远程翻译优先级更高
716
+ return (this.findInTranslationsList(key, locale, this.remoteTranslationsList) ??
717
+ this.findInTranslationsList(key, locale, this.translationsList));
718
+ }
719
+ /**
720
+ * 在翻译列表中查找键值
735
721
  */
736
- searchInTranslationsList(key, locale, translationsList) {
737
- if (!translationsList || translationsList.length === 0) {
722
+ findInTranslationsList(key, locale, translationsList) {
723
+ if (!translationsList?.length)
738
724
  return undefined;
739
- }
740
- // 从后往前遍历(后加入的优先级更高)
725
+ // 后加入的优先级更高
741
726
  for (let i = translationsList.length - 1; i >= 0; i--) {
742
- const value = this.searchInTranslations(key, locale, translationsList[i]);
743
- if (value !== undefined) {
727
+ const value = this.findInTranslation(key, locale, translationsList[i]);
728
+ if (value !== undefined)
744
729
  return value;
745
- }
746
730
  }
747
731
  return undefined;
748
732
  }
749
733
  /**
750
- * 在单个翻译对象中搜索
734
+ * 在单个翻译对象中查找键值
751
735
  */
752
- searchInTranslations(key, locale, translations) {
753
- const translationValue = this.getTranslationValue(translations, locale);
754
- // 如果没有获取到翻译值对象(getTranslationValue已经处理了loose和fallback),直接返回
755
- if (translationValue === undefined) {
736
+ findInTranslation(key, locale, translations) {
737
+ const localeData = translations[locale];
738
+ if (!localeData)
756
739
  return undefined;
757
- }
758
- // 获取翻译值,支持扁平和嵌套两种结构
759
- const value = this.getTranslationFromSource(translationValue, key);
760
- // 如果找到值(包括null值),则处理并返回
740
+ const value = get(localeData, key);
761
741
  if (value !== undefined) {
762
742
  this.validateTranslationValue(value, locale, key);
763
- // null值转换为字符串'null',其他值正常转换
764
- return value === null ? 'null' : String(value);
765
- }
766
- // 如果在当前语言的翻译值中找不到key,但这不是fallback语言,尝试fallback
767
- if (locale !== this.options.fallbackLocale) {
768
- const fallbackTranslationValue = this.getTranslationValue(translations, this.options.fallbackLocale);
769
- if (fallbackTranslationValue !== undefined) {
770
- const fallbackValue = this.getTranslationFromSource(fallbackTranslationValue, key);
771
- if (fallbackValue !== undefined) {
772
- this.validateTranslationValue(fallbackValue, this.options.fallbackLocale, key);
773
- return fallbackValue === null ? 'null' : String(fallbackValue);
774
- }
775
- }
776
- }
777
- return undefined;
778
- }
779
- /**
780
- * 从翻译源获取翻译值,支持扁平和嵌套两种结构
781
- * @param source - 翻译源对象
782
- * @param key - 翻译键(如 'a.b.c')
783
- * @returns 翻译值或undefined
784
- */
785
- getTranslationFromSource(source, key) {
786
- if (!source || typeof source !== 'object') {
787
- return undefined;
788
- }
789
- // 1. 优先尝试扁平结构:直接查找完整的键 'a.b.c'
790
- if (Object.prototype.hasOwnProperty.call(source, key)) {
791
- return source[key];
792
- }
793
- // 2. 再尝试嵌套结构:使用lodash.get按路径查找 a.b.c
794
- const nestedValue = get(source, key);
795
- if (nestedValue !== undefined) {
796
- return nestedValue;
743
+ return value == null ? '' : String(value);
797
744
  }
798
745
  return undefined;
799
746
  }
800
747
  /**
801
- * 获取指定语言的翻译值(处理loose模式和fallback逻辑)
748
+ * 从Translation对象中获取翻译值(支持宽松匹配和回退逻辑)
802
749
  */
803
- getTranslationValue(source, locale = this.locale) {
804
- if (!source) {
750
+ getTranslationByObject(source, locale = this.locale) {
751
+ if (!source)
805
752
  return undefined;
753
+ // 1) 精确匹配当前 locale
754
+ if (has(source, locale)) {
755
+ return source[locale];
806
756
  }
807
- // 1. 首先检查精确匹配的键是否存在
808
- if (Object.prototype.hasOwnProperty.call(source, locale)) {
809
- return source[locale]; // 返回实际值,可能是null、undefined或其他值
810
- }
811
- // 2. 如果启用了宽松模式,尝试宽松匹配
757
+ // 2) 宽松匹配当前 locale(如 zh-CN -> zh)
812
758
  if (this.options.loose) {
813
- const looseValue = this.getLooseTranslationValue(source, locale);
814
- if (looseValue !== undefined) {
815
- return looseValue;
816
- }
817
- }
818
- // 3. 如果当前语言不是fallback语言,尝试fallback语言
819
- if (locale !== this.options.fallbackLocale) {
820
- // 首先检查fallback语言的精确匹配
821
- if (Object.prototype.hasOwnProperty.call(source, this.options.fallbackLocale)) {
822
- return source[this.options.fallbackLocale];
823
- }
824
- // 如果启用了宽松模式,也对fallback语言进行宽松匹配
825
- if (this.options.loose) {
826
- const fallbackLooseValue = this.getLooseTranslationValue(source, this.options.fallbackLocale);
827
- if (fallbackLooseValue !== undefined) {
828
- return fallbackLooseValue;
829
- }
759
+ const loose = getLooseLocale(locale);
760
+ if (loose !== locale && has(source, loose)) {
761
+ return source[loose];
830
762
  }
831
763
  }
832
- return undefined;
833
- }
834
- /**
835
- * 宽松模式下获取翻译值
836
- */
837
- getLooseTranslationValue(source, locale) {
838
- const looseLocale = this.extractLooseLocale(locale);
839
- if (locale === looseLocale) {
840
- // 寻找匹配的宽松语言
841
- const matchedEntry = Object.entries(source).find(([key]) => looseLocale === this.extractLooseLocale(key));
842
- return matchedEntry?.[1];
764
+ // 3) 回退到 fallbackLocale
765
+ const fb = this.options.fallbackLocale;
766
+ if (fb !== locale && has(source, fb)) {
767
+ return source[fb];
843
768
  }
844
- // 检查宽松语言键是否存在
845
- if (Object.prototype.hasOwnProperty.call(source, looseLocale)) {
846
- return source[looseLocale];
769
+ // 4) 宽松匹配回退 locale
770
+ if (this.options.loose) {
771
+ const fbLoose = getLooseLocale(fb);
772
+ if (fbLoose !== fb && has(source, fbLoose)) {
773
+ return source[fbLoose];
774
+ }
847
775
  }
848
776
  return undefined;
849
777
  }
850
- /**
851
- * 提取宽松语言代码(如:zh-CN -> zh)
852
- */
853
- extractLooseLocale(locale) {
854
- return head(locale.split(/[_-]/)) || locale;
855
- }
856
778
  /**
857
779
  * 验证翻译值(开发模式)
858
780
  */
@@ -871,7 +793,7 @@ export class TranslateService {
871
793
  return;
872
794
  }
873
795
  Object.entries(translation).forEach(([key, value]) => {
874
- if (!Object.prototype.hasOwnProperty.call(prevTranslation, key)) {
796
+ if (!has(prevTranslation, key)) {
875
797
  return;
876
798
  }
877
799
  const prevValue = prevTranslation[key];
@@ -916,4 +838,4 @@ __decorate([
916
838
  type: Inject,
917
839
  args: [TRANSLATIONS]
918
840
  }] }], { locale$: [] }); })();
919
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvdHJhbnNsYXRlL3RyYW5zbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBRVYsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLFFBQVEsRUFDUixVQUFVLEVBQ1YsS0FBSyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFDSCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsY0FBYyxHQUNmLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxN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QkFBSSxNQUFNO3VCQUFDLGlCQUFpQjs7c0JBQ3BDLFFBQVE7O3NCQUFJLE1BQU07dUJBQUMsWUFBWTtxQkFoQnpCLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSB0cmFuc2xhdGVcbiAqL1xuXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW50bE1lc3NhZ2VGb3JtYXQgfSBmcm9tICdpbnRsLW1lc3NhZ2Vmb3JtYXQnO1xuaW1wb3J0IHsgZ2V0LCBoZWFkLCBpc1BsYWluT2JqZWN0LCB0ZW1wbGF0ZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBmb3JrSm9pbixcbiAgdGhyb3dFcnJvcixcbiAgRU1QVFksXG4gIGNhdGNoRXJyb3IsXG4gIGZpbHRlcixcbiAgZmluYWxpemUsXG4gIG1hcCxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGFqYXggfSBmcm9tICdyeGpzL2FqYXgnO1xuXG5pbXBvcnQgeyBBUElfR0FURVdBWSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlSW5wdXQsIFRPS0VOX0JBU0VfSFJFRiB9IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBpc0Fic29sdXRlVXJsIH0gZnJvbSAnLi4vY29yZS91dGlscy9jb21tb24nO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICcuLi9jb3JlL3V0aWxzL3lhbWwnO1xuXG5pbXBvcnQge1xuICBGQUxMQkFDS19MQU5HVUFHRSxcbiAgTE9DQUxFX1BMQUNFSE9MREVSX1JFR0VYLFxuICBMT0NBTEVfU1RPUkFHRSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0VXNlckxhbmd1YWdlIH0gZnJvbSAnLi9pMThuLWNvbmZpZyc7XG5pbXBvcnQgeyBUUkFOU0xBVEVfT1BUSU9OUywgVFJBTlNMQVRJT05TIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHtcbiAgVHJhbnNsYXRlS2V5LFxuICBUcmFuc2xhdGVPcHRpb25zLFxuICBUcmFuc2xhdGlvbixcbiAgVHJhbnNsYXRpb25WYWx1ZSxcbiAgVHJhbnNsYXRpb25zLFxuICBUZW1wbGF0ZURhdGEsXG4gIEljdURhdGEsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIOWbvemZheWMlue/u+ivkeacjeWKoVxuICpcbiAqIOeJueaAp++8mlxuICogLSDmlK/mjIHlpJrlsYLnuqfnv7vor5HkvJjlhYjnuqfvvIjov5znqIvnv7vor5EgPiDmiYvliqjmt7vliqDnv7vor5EgPiDphY3nva7nv7vor5HvvIlcbiAqIC0g5pSv5oyB5Yqo5oCB6K+t6KiA5YiH5o2iXG4gKiAtIOaUr+aMgSBJQ1UgTWVzc2FnZSBGb3JtYXQg5qih5p2/5o+S5YC8XG4gKiAtIOaUr+aMgeWuveadvuaooeW8j+ivreiogOWMuemFjVxuICogLSDmlK/mjIHlvILmraXov5znqIvnv7vor5HliqDovb1cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIOe/u+ivkea3u+WKoOmAmuefpea1gSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCA9IHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5hc09ic2VydmFibGUoKTtcblxuICAvKiog57uE5Lu26ZSA5q+B6YCa55+l5rWBICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiog5pys5Zyw57+76K+R5YiX6KGo77yI5LyY5YWI57qn77ya5ZCO5Yqg5YWl55qE5LyY5YWI57qn5pu06auY77yJICovXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0xpc3Q6IEFycmF5PFJlYWRvbmx5PFRyYW5zbGF0aW9ucz4+ID0gW107XG5cbiAgLyoqIOi/nOeoi+e/u+ivkeWIl+ihqO+8iOS8mOWFiOe6p+acgOmrmO+8iSAqL1xuICByZWFkb25seSByZW1vdGVUcmFuc2xhdGlvbnNMaXN0OiBBcnJheTxSZWFkb25seTxUcmFuc2xhdGlvbnM+PiA9IFtdO1xuXG4gIC8qKiDnv7vor5HphY3nva7pgInpobkgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucztcblxuICAvKiog5b2T5YmN6K+t6KiA546v5aKDICovXG4gIGxvY2FsZTogc3RyaW5nO1xuXG4gIC8qKiDlvZPliY3or63oqIDnjq/looPvvIjlk43lupTlvI/vvIkgKi9cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IGxvY2FsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAvKiog6I635Y+W5pSv5oyB55qE6K+t6KiA5YiX6KGoICovXG4gIGdldCBsb2NhbGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvY2FsZXM7XG4gIH1cblxuICAvKiog6I635Y+W5Zue6YCA6K+t6KiAICovXG4gIGdldCBmYWxsYmFja0xvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUT0tFTl9CQVNFX0hSRUYpIHByaXZhdGUgcmVhZG9ubHkgYmFzZUhyZWY6IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTEFURV9PUFRJT05TKSBvcHRpb25zOiBUcmFuc2xhdGVPcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVFJBTlNMQVRJT05TKSB0cmFuc2xhdGlvbkxpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApIHtcbiAgICAvLyDliJ3lp4vljJbor63oqIDnjq/looNcbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuZ2V0SW5pdGlhbExvY2FsZShvcHRpb25zKTtcblxuICAgIC8vIOWIneWni+WMlumFjee9rumAiemhuVxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZXM6IFt0aGlzLmxvY2FsZV0sXG4gICAgICBmYWxsYmFja0xvY2FsZTogRkFMTEJBQ0tfTEFOR1VBR0UsXG4gICAgICBsb29zZTogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyDliJ3lp4vljJbnv7vor5HliJfooahcbiAgICB0aGlzLnRyYW5zbGF0aW9uc0xpc3QgPSB0aGlzLmdldEluaXRpYWxpemVUcmFuc2xhdGlvbnMoXG4gICAgICBvcHRpb25zLFxuICAgICAgdHJhbnNsYXRpb25MaXN0LFxuICAgICk7XG5cbiAgICAvLyDliqDovb3ov5znqIvnv7vor5FcbiAgICB0aGlzLmxvYWRSZW1vdGVUcmFuc2xhdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog57uE5Lu26ZSA5q+B5riF55CGXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnv7vor5HmlofmnKzlubbov5vooYzmqKHmnb/mj5LlgLxcbiAgICog5pSv5oyB5Lik56eN5qih5p2/6K+t5rOV77yaXG4gICAqIDEuIOS8oOe7n+eahCB7eyBrZXkgfX0g6K+t5rOV77yM5L2/55SoIGxvZGFzaCB0ZW1wbGF0ZSDlpITnkIZcbiAgICogMi4gSUNVIE1lc3NhZ2UgRm9ybWF0IOivreazle+8jOS9v+eUqCBJbnRsTWVzc2FnZUZvcm1hdCDlpITnkIZcbiAgICogQHBhcmFtIGtleSAtIOe/u+ivkemUruaIlue/u+ivkeWvueixoVxuICAgKiBAcGFyYW0gZGF0YSAtIOaooeadv+aVsOaNru+8iOaUr+aMgeWfuuacrOexu+Wei+OAgURhdGXjgIHlr7nosaHlkozmlbDnu4TvvIlcbiAgICogQHJldHVybnMg57+76K+R5ZCO55qE5paH5pysXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gbG9kYXNoIHRlbXBsYXRlIOivreazlVxuICAgKiB0cmFuc2xhdGUuZ2V0KCdoZWxsbycsIHsgbmFtZTogJ1dvcmxkJyB9KSAvLyDmqKHmnb86IFwiSGVsbG8ge3sgbmFtZSB9fVwiXG4gICAqXG4gICAqIC8vIElDVSBNZXNzYWdlIEZvcm1hdCDor63ms5VcbiAgICogdHJhbnNsYXRlLmdldCgnaXRlbUNvdW50JywgeyBjb3VudDogNSB9KSAvLyDmqKHmnb86IFwiSXRlbXM6IHtjb3VudCwgbnVtYmVyfVwiXG4gICAqIHRyYW5zbGF0ZS5nZXQoJ2NyZWF0ZWRBdCcsIHsgZGF0ZTogbmV3IERhdGUoKSB9KSAvLyDmqKHmnb86IFwiQ3JlYXRlZDoge2RhdGUsIGRhdGUsIHNob3J0fVwiXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KGtleTogVHJhbnNsYXRlS2V5LCBkYXRhPzogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMuZ2V0UmF3KGtleSk7XG5cbiAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOajgOa1i+aooeadv+exu+Wei+W5tuS9v+eUqOebuOW6lOeahOWkhOeQhuaWueW8j1xuICAgICAgaWYgKHRoaXMuaGFzTG9kYXNoVGVtcGxhdGVGb3JtYXQodHJhbnNsYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdExvZGFzaFRlbXBsYXRlKHRyYW5zbGF0aW9uLCBkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNJY3VNZXNzYWdlRm9ybWF0KHRyYW5zbGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRJY3VNZXNzYWdlKHRyYW5zbGF0aW9uLCBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWmguaenOayoeacieaooeadv+ivreazle+8jOebtOaOpei/lOWbnue/u+ivkeaWh+acrFxuICAgICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuaGFuZGxlVGVtcGxhdGVFcnJvcihrZXksIGVycm9yKTtcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Y6f5aeL57+76K+R5paH5pys5qih5p2/77yI5LiN6L+b6KGM5o+S5YC85aSE55CG77yJXG4gICAqIEBwYXJhbSBrZXkgLSDnv7vor5HplK7miJbnv7vor5Hlr7nosaFcbiAgICogQHJldHVybnMg5Y6f5aeL57+76K+R5qih5p2/5paH5pysXG4gICAqL1xuICBnZXRSYXcoa2V5OiBUcmFuc2xhdGVLZXkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25CeUtleShrZXkpO1xuICAgIH1cblxuICAgIC8vIOW9k2tleeaYr1RyYW5zbGF0aW9u5a+56LGh5pe277yM6I635Y+W5b2T5YmN6K+t6KiA55qE57+76K+R5YC8XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFRyYW5zbGF0aW9uQnlPYmplY3Qoa2V5KTtcblxuICAgIC8vIOWmguaenOaJvuWIsOWAvOWImei/lOWbnuWtl+espuS4suW9ouW8j++8jOWQpuWImei/lOWbnkpTT07lrZfnrKbkuLLooajnpLpcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gJ251bGwnIDogU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmsqHmnInmib7liLDnv7vor5HvvIzov5Tlm55KU09O5a2X56ym5Liy5b2i5byPXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleSk7XG4gIH1cblxuICAvKipcbiAgICog5YiH5o2i5Yiw5LiL5LiA5Liq5pSv5oyB55qE6K+t6KiA546v5aKDXG4gICAqL1xuICB0b2dnbGVMb2NhbGUoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5vcHRpb25zLmxvY2FsZXMuaW5kZXhPZih0aGlzLmxvY2FsZSk7XG5cbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5oYW5kbGVJbnZhbGlkTG9jYWxlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEluZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgdGhpcy5vcHRpb25zLmxvY2FsZXMubGVuZ3RoO1xuICAgIGNvbnN0IG5leHRMb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlc1tuZXh0SW5kZXhdO1xuXG4gICAgaWYgKG5leHRMb2NhbGUgJiYgbmV4dExvY2FsZSAhPT0gdGhpcy5sb2NhbGUpIHtcbiAgICAgIHRoaXMuc2V0TG9jYWxlKG5leHRMb2NhbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7lvZPliY3or63oqIDnjq/looNcbiAgICogQHBhcmFtIGxvY2FsZSAtIOimgeiuvue9rueahOivreiogOeOr+Wig1xuICAgKi9cbiAgc2V0TG9jYWxlKGxvY2FsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRMb2NhbGUobG9jYWxlKSkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSW52YWxpZCBsb2NhbGU6ICR7bG9jYWxlfS4gU3VwcG9ydGVkIGxvY2FsZXM6ICR7dGhpcy5vcHRpb25zLmxvY2FsZXMuam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMRV9TVE9SQUdFLCBsb2NhbGUpO1xuICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIOaJi+WKqOa3u+WKoOe/u+ivkeWMhVxuICAgKiBAcGFyYW0gdHJhbnNsYXRpb25zIC0g6KaB5re75Yqg55qE57+76K+R5YyFXG4gICAqL1xuICBhZGRUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIXRyYW5zbGF0aW9ucyB8fCB0eXBlb2YgdHJhbnNsYXRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB0cmFuc2xhdGlvbnMgb2JqZWN0IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5byA5Y+R5qih5byP5LiL5qOA5p+l6YeN5aSN57+76K+RXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHRoaXMudHJhbnNsYXRpb25zTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNoZWNrRm9yRHVwbGljYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy50cmFuc2xhdGlvbnNMaXN0LnB1c2godHJhbnNsYXRpb25zKTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uc0FkZGVkJCQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOa3u+WKoOi/nOeoi+e/u+ivkeWMhVxuICAgKiBAcGFyYW0gcmVtb3RlVXJsIC0g6L+c56iL57+76K+R5paH5Lu2VVJMXG4gICAqL1xuICBhZGRSZW1vdGVUcmFuc2xhdGlvbnMocmVtb3RlVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXJlbW90ZVVybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRVcmwgPSB0aGlzLm5vcm1hbGl6ZVJlbW90ZVVybChyZW1vdGVVcmwpO1xuICAgIGNvbnN0IHJlcXVlc3QkID0gdGhpcy5jcmVhdGVSZW1vdGVUcmFuc2xhdGlvblJlcXVlc3Qobm9ybWFsaXplZFVybCk7XG5cbiAgICByZXF1ZXN0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJCksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uc0FkZGVkJCQubmV4dCgpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiByZW1vdGVUcmFuc2xhdGlvbnMgPT4ge1xuICAgICAgICAgIGlmIChyZW1vdGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3RlVHJhbnNsYXRpb25zTGlzdC5wdXNoKHJlbW90ZVRyYW5zbGF0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlbW90ZSB0cmFuc2xhdGlvbnMgZnJvbSAke3JlbW90ZVVybH06YCxcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7jui/nOeoi1VSTOiOt+WPlue/u+ivkeaVsOaNrlxuICAgKiBAcGFyYW0gcmVtb3RlVXJsIC0g6L+c56iLVVJMXG4gICAqIEBwYXJhbSBsb2NhbGUgLSDlj6/pgInnmoTor63oqIDnjq/looPvvIjnlKjkuo5VUkzmqKHmnb/mm7/mjaLvvIlcbiAgICogQHJldHVybnMg57+76K+R5pWw5o2u55qET2JzZXJ2YWJsZVxuICAgKi9cbiAgZmV0Y2hUcmFuc2xhdGlvbihyZW1vdGVVcmw6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPjtcbiAgZmV0Y2hUcmFuc2xhdGlvbihyZW1vdGVVcmw6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uPjtcbiAgZmV0Y2hUcmFuc2xhdGlvbihcbiAgICByZW1vdGVVcmw6IHN0cmluZyxcbiAgICBsb2NhbGU/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zIHwgVHJhbnNsYXRpb24+IHtcbiAgICB0aGlzLnZhbGlkYXRlRmV0Y2hUcmFuc2xhdGlvblBhcmFtcyhyZW1vdGVVcmwsIGxvY2FsZSk7XG5cbiAgICBjb25zdCB0YXJnZXRVcmwgPSBsb2NhbGVcbiAgICAgID8gcmVtb3RlVXJsLnJlcGxhY2UoTE9DQUxFX1BMQUNFSE9MREVSX1JFR0VYLCBsb2NhbGUpXG4gICAgICA6IHJlbW90ZVVybDtcblxuICAgIHJldHVybiB0aGlzLnBlcmZvcm1UcmFuc2xhdGlvblJlcXVlc3QodGFyZ2V0VXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bliJ3lp4vor63oqIDnjq/looNcbiAgICovXG4gIHByaXZhdGUgZ2V0SW5pdGlhbExvY2FsZShvcHRpb25zOiBUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gb3B0aW9ucz8ubG9jYWxlIHx8IGdldFVzZXJMYW5ndWFnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWIneWni+e/u+ivkeWIl+ihqFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbml0aWFsaXplVHJhbnNsYXRpb25zKFxuICAgIG9wdGlvbnM6IFRyYW5zbGF0ZU9wdGlvbnMsXG4gICAgdHJhbnNsYXRpb25MaXN0OiBUcmFuc2xhdGlvbnNbXSxcbiAgKTogVHJhbnNsYXRpb25zW10ge1xuICAgIHJldHVybiBbb3B0aW9ucz8udHJhbnNsYXRpb25zLCAuLi4odHJhbnNsYXRpb25MaXN0IHx8IFtdKV0uZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWKoOi9vei/nOeoi+e/u+ivkVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkUmVtb3RlVHJhbnNsYXRpb25zKG9wdGlvbnM6IFRyYW5zbGF0ZU9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIW9wdGlvbnM/LnJlbW90ZVVybCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdXJscyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5yZW1vdGVVcmwpXG4gICAgICA/IG9wdGlvbnMucmVtb3RlVXJsXG4gICAgICA6IFtvcHRpb25zLnJlbW90ZVVybF07XG5cbiAgICB1cmxzLmZvckVhY2godXJsID0+IHRoaXMuYWRkUmVtb3RlVHJhbnNsYXRpb25zKHVybCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi9rOaNouaooeadv+aVsOaNruS4uiBJQ1Ug5YW85a655qC85byPXG4gICAqIEBwYXJhbSBkYXRhIC0g5qih5p2/5pWw5o2uXG4gICAqIEByZXR1cm5zIElDVSDlhbzlrrnnmoTmlbDmja7lr7nosaFcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplSWN1RGF0YShkYXRhOiBUZW1wbGF0ZURhdGEpOiBJY3VEYXRhIHtcbiAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5piv57qv5a+56LGh77yM55u05o6l6L2s5o2i5YW25bGe5oCnXG4gICAgaWYgKHRoaXMuaXNQbGFpblRlbXBsYXRlT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T2JqZWN0VG9JY3VEYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIC8vIOWfuuacrOexu+Wei+OAgeaVsOe7hOOAgURhdGXnrYnljIXoo4XkuLogeyB2YWx1ZTogZGF0YSB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMuY29udmVydFZhbHVlVG9JY3VWYWx1ZShkYXRhKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOajgOafpeaYr+WQpuS4uue6r+aooeadv+Wvueixoe+8iOS4jeaYr+aVsOe7hOOAgURhdGXnrYnnibnmrorlr7nosaHvvIlcbiAgICovXG4gIHByaXZhdGUgaXNQbGFpblRlbXBsYXRlT2JqZWN0KFxuICAgIGRhdGE6IFRlbXBsYXRlRGF0YSxcbiAgKTogZGF0YSBpcyBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZURhdGE+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICBkYXRhICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgIShkYXRhIGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAgIGRhdGEuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6L2s5o2i5a+56LGh55qE5omA5pyJ5bGe5oCn5Li6IElDVSDlhbzlrrnlgLxcbiAgICovXG4gIHByaXZhdGUgY29udmVydE9iamVjdFRvSWN1RGF0YShvYmo6IFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlRGF0YT4pOiBJY3VEYXRhIHtcbiAgICBjb25zdCByZXN1bHQ6IEljdURhdGEgPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5jb252ZXJ0VmFsdWVUb0ljdVZhbHVlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOWwhuWNleS4quWAvOi9rOaNouS4uiBJQ1Ug5YW85a6557G75Z6LXG4gICAqIOaMieeFpyBJQ1UgTWVzc2FnZUZvcm1hdCDop4TojIPvvIzlj6rmlK/mjIEgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0VmFsdWVUb0ljdVZhbHVlKHZhbHVlOiBUZW1wbGF0ZURhdGEpOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlIHtcbiAgICAvLyBJQ1Ug5Y6f55Sf5pSv5oyB55qE57G75Z6L55u05o6l6L+U5ZueXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyDlhbbku5bnsbvlnovovazkuLrlrZfnrKbkuLJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8g566A5Y2V5pWw57uE6L2s5Li66YCX5Y+35YiG6ZqU55qE5a2X56ym5LiyXG4gICAgICByZXR1cm4gdmFsdWUubWFwKGl0ZW0gPT4gU3RyaW5nKGl0ZW0gPz8gJycpKS5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIOWvueixoei9rOS4uiBKU09OIOWtl+espuS4slxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuaooeadv+mUmeivr1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVUZW1wbGF0ZUVycm9yKGtleTogVHJhbnNsYXRlS2V5LCBlcnJvcjogYW55KTogdm9pZCB7XG4gICAgY29uc3Qga2V5U3RyID0gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBrZXkgOiAnW29iamVjdF0nO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhlIHRyYW5zbGF0aW9uIGtleSAnJHtrZXlTdHJ9JyBpcyBtaXNzaW5nIHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycy5gO1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCBlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOajgOa1i+Wtl+espuS4suaYr+WQpuWMheWQqyBsb2Rhc2ggdGVtcGxhdGUg5qC85byP55qE5qih5p2/6K+t5rOVIHt7IH19XG4gICAqIEBwYXJhbSBtZXNzYWdlIC0g6KaB5qOA5rWL55qE5a2X56ym5LiyXG4gICAqIEByZXR1cm5zIOaYr+WQpuWMheWQqyBsb2Rhc2ggdGVtcGxhdGUg6K+t5rOVXG4gICAqL1xuICBwcml2YXRlIGhhc0xvZGFzaFRlbXBsYXRlRm9ybWF0KG1lc3NhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXFx7XFx7W159XStcXH1cXH0vLnRlc3QobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICog5qOA5rWL5a2X56ym5Liy5piv5ZCm5YyF5ZCrIElDVSBNZXNzYWdlIEZvcm1hdCDor63ms5VcbiAgICogSUNVIOivreazleWMheaLrO+8mnt2YXJpYWJsZX3jgIF7dmFyaWFibGUsIHR5cGV944CBe3ZhcmlhYmxlLCB0eXBlLCBzdHlsZX0g562JXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0g6KaB5qOA5rWL55qE5a2X56ym5LiyXG4gICAqIEByZXR1cm5zIOaYr+WQpuWMheWQqyBJQ1UgTWVzc2FnZSBGb3JtYXQg6K+t5rOVXG4gICAqL1xuICBwcml2YXRlIGhhc0ljdU1lc3NhZ2VGb3JtYXQobWVzc2FnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8g5qOA5rWLIElDVSDmoLzlvI/vvJp7dmFyaWFibGV944CBe3ZhcmlhYmxlLCB0eXBlfeOAgXt2YXJpYWJsZSwgdHlwZSwgc3R5bGV9XG4gICAgLy8g5L2G5o6S6ZmkIGxvZGFzaCB0ZW1wbGF0ZSDmoLzlvI/nmoQge3t2YXJpYWJsZX19XG4gICAgcmV0dXJuIC9cXHtbXnt9XStcXH0vLnRlc3QobWVzc2FnZSkgJiYgIXRoaXMuaGFzTG9kYXNoVGVtcGxhdGVGb3JtYXQobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICog5L2/55SoIGxvZGFzaCB0ZW1wbGF0ZSDmoLzlvI/ljJbmlofmnKxcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSDljIXlkKsge3sgfX0g6K+t5rOV55qE5qih5p2/5a2X56ym5LiyXG4gICAqIEBwYXJhbSBkYXRhIC0g5qih5p2/5pWw5o2uXG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOWtl+espuS4slxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRMb2Rhc2hUZW1wbGF0ZShtZXNzYWdlOiBzdHJpbmcsIGRhdGE6IFRlbXBsYXRlRGF0YSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWwhuaVsOaNruagh+WHhuWMluS4uuWvueixoeagvOW8j1xuICAgICAgY29uc3QgdGVtcGxhdGVEYXRhID0gdGhpcy5ub3JtYWxpemVUZW1wbGF0ZURhdGEoZGF0YSk7XG5cbiAgICAgIC8vIOS9v+eUqCBsb2Rhc2ggdGVtcGxhdGUg5aSE55CGIHt7IH19IOivreazlVxuICAgICAgY29uc3QgY29tcGlsZWQgPSB0ZW1wbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgIGludGVycG9sYXRlOiAvXFx7XFx7KC4rPylcXH1cXH0vZywgLy8g6Ieq5a6a5LmJ5o+S5YC86K+t5rOV5Li6IHt7IH19XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbXBpbGVkKHRlbXBsYXRlRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYExvZGFzaCB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgXCIke21lc3NhZ2V9XCI6YCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIOmZjee6p+WkhOeQhu+8mui/lOWbnuWOn+Wni+a2iOaBr1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagh+WHhuWMluaooeadv+aVsOaNruS4uuWvueixoeagvOW8j1xuICAgKiBAcGFyYW0gZGF0YSAtIOWOn+Wni+aooeadv+aVsOaNrlxuICAgKiBAcmV0dXJucyDmoIflh4bljJblkI7nmoTlr7nosaHmiJbmlbDnu4TvvIjkuLrkuoblkJHlkI7lhbzlrrnvvIlcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplVGVtcGxhdGVEYXRhKFxuICAgIGRhdGE6IFRlbXBsYXRlRGF0YSxcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB8IGFueVtdIHtcbiAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5piv57qv5a+56LGh77yM55u05o6l6L+U5ZueXG4gICAgaWYgKHRoaXMuaXNQbGFpblRlbXBsYXRlT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyDov5nmoLfmqKHmnb/kuK3lj6/ku6Xkvb/nlKgge3sgMCB9fSDorr/pl67nrKzkuIDkuKrlhYPntKBcbiAgICByZXR1cm4gW2RhdGFdIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkvb/nlKggSUNVIG1lc3NhZ2UgZm9ybWF0IOagvOW8j+WMluaWh+acrFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRJY3VNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgZGF0YTogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8g5bCG5pWw5o2u6L2s5o2i5Li6IElDVSDlhbzlrrnmoLzlvI9cbiAgICAgIGNvbnN0IGljdURhdGEgPSB0aGlzLm5vcm1hbGl6ZUljdURhdGEoZGF0YSk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VGb3JtYXQgPSBuZXcgSW50bE1lc3NhZ2VGb3JtYXQoXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHRoaXMubG9jYWxlLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHsgaWdub3JlVGFnOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1lc3NhZ2VGb3JtYXQuZm9ybWF0KGljdURhdGEpIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgSUNVIG1lc3NhZ2UgZm9ybWF0dGluZyBmYWlsZWQgZm9yIFwiJHttZXNzYWdlfVwiOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIC8vIOmZjee6p+WkhOeQhu+8mui/lOWbnuWOn+Wni+a2iOaBr1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMluaVsOWtl1xuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTmlbDlrZdcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDmoLzlvI/ljJbpgInpoblcbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE5pWw5a2X5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdE51bWJlcigxMjM0LjU2KSAvLyBcIjEsMjM0LjU2XCJcbiAgICogZm9ybWF0TnVtYmVyKDAuODUsIHsgc3R5bGU6ICdwZXJjZW50JyB9KSAvLyBcIjg1JVwiXG4gICAqIGZvcm1hdE51bWJlcigxMjM0LjU2LCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogJ0NOWScgfSkgLy8gXCLCpTEsMjM0LjU2XCJcbiAgICovXG4gIGZvcm1hdE51bWJlcih2YWx1ZTogbnVtYmVyLCBvcHRpb25zOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGUsIG9wdGlvbnMpLmZvcm1hdCh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYE51bWJlciBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgdmFsdWUgJHt2YWx1ZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMlui0p+W4gVxuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTph5Hpop1cbiAgICogQHBhcmFtIGN1cnJlbmN5IC0g6LSn5biB5Luj56CB77yM6buY6K6k5Li6IENOWVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOWFtuS7luagvOW8j+WMlumAiemhuVxuICAgKiBAcmV0dXJucyDmoLzlvI/ljJblkI7nmoTotKfluIHlrZfnrKbkuLJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZm9ybWF0Q3VycmVuY3koMTIzNC41NikgLy8gZW4tVVM6IFwiQ07CpTEsMjM0LjU2XCIsIHpoLUNOOiBcIsKlMSwyMzQuNTZcIlxuICAgKiBmb3JtYXRDdXJyZW5jeSgxMjM0LjU2LCAnVVNEJykgLy8gZW4tVVM6IFwiJDEsMjM0LjU2XCIsIHpoLUNOOiBcIlVTJDEsMjM0LjU2XCJcbiAgICovXG4gIGZvcm1hdEN1cnJlbmN5KFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgY3VycmVuY3k6IHN0cmluZyA9ICdDTlknLFxuICAgIG9wdGlvbnM6IE9taXQ8SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zLCAnc3R5bGUnIHwgJ2N1cnJlbmN5Jz4gPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXROdW1iZXIodmFsdWUsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3ksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMlueZvuWIhuavlFxuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTlgLzvvIgwLjg1IOihqOekuiA4NSXvvIlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDmoLzlvI/ljJbpgInpoblcbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE55m+5YiG5q+U5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdFBlcmNlbnQoMC44NSkgLy8gXCI4NSVcIlxuICAgKiBmb3JtYXRQZXJjZW50KDAuODU2NywgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSkgLy8gXCI4NS42NyVcIlxuICAgKi9cbiAgZm9ybWF0UGVyY2VudChcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIG9wdGlvbnM6IE9taXQ8SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zLCAnc3R5bGUnPiA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWJlcih2YWx1ZSwge1xuICAgICAgc3R5bGU6ICdwZXJjZW50JyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW5pel5pyfXG4gICAqIEBwYXJhbSBkYXRlIC0g6KaB5qC85byP5YyW55qE5pel5pyfXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMg5qC85byP6YWN572uXG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOaXpeacn+Wtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXREYXRlKG5ldyBEYXRlKCkpIC8vIGVuLVVTOiBcIjAxLzAxLzIwMjVcIiwgemgtQ046IFwiMjAyNS8wMS8wMVwiXG4gICAqIGZvcm1hdERhdGUobmV3IERhdGUoKSwgeyBkYXRlU3R5bGU6ICdmdWxsJyB9KSAvLyBcIjIwMjTlubQ45pyIMjDml6XmmJ/mnJ/kuoxcIlxuICAgKiBmb3JtYXREYXRlKG5ldyBEYXRlKCksIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJzItZGlnaXQnLCBkYXk6ICcyLWRpZ2l0JyB9KSAvLyDmoLnmja5sb2NhbGXmoLzlvI/ljJZcbiAgICogZm9ybWF0RGF0ZShuZXcgRGF0ZSgpLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJyB9KSAvLyBcIjIwMjTlubQ45pyIXCJcbiAgICovXG4gIGZvcm1hdERhdGUoXG4gICAgZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bWJlcixcbiAgICBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICB9LFxuICApOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICBpZiAoaXNOYU4oZGF0ZU9iai5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlQnlPcHRpb25zKGRhdGVPYmosIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBEYXRlIGZvcm1hdHRpbmcgZmFpbGVkIGZvciBkYXRlICR7ZGF0ZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZyhkYXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW5pel5pyf5ZKM5pe26Ze0XG4gICAqIEBwYXJhbSBkYXRlIC0g6KaB5qC85byP5YyW55qE5pel5pyf5pe26Ze0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMg5qC85byP6YWN572uXG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOaXpeacn+aXtumXtOWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXREYXRlVGltZShuZXcgRGF0ZSgpKSAvLyBlbi1VUzogXCIwMS8wMS8yMDI1LCAxNDozMDowMFwiLCB6aC1DTjogXCIyMDI1LzAxLzAxIDE0OjMwOjAwXCJcbiAgICogZm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSwgeyBkYXRlU3R5bGU6ICdtZWRpdW0nLCB0aW1lU3R5bGU6ICdzaG9ydCcgfSkgLy8gXCIyMDI05bm0OOaciDIw5pelIDE0OjMwXCJcbiAgICogZm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSwgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnMi1kaWdpdCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBzZWNvbmQ6ICcyLWRpZ2l0JywgaG91cjEyOiBmYWxzZSB9KSAvLyDmoLnmja5sb2NhbGXmoLzlvI/ljJZcbiAgICovXG4gIGZvcm1hdERhdGVUaW1lKFxuICAgIGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICB9LFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUoZGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW55u45a+55pe26Ze0XG4gICAqIEBwYXJhbSB2YWx1ZSAtIOaXtumXtOW3ruWAvO+8iOaVsOWtl++8ieaIluaXpeacn+WvueixoVxuICAgKiBAcGFyYW0gdW5pdCAtIOaXtumXtOWNleS9je+8iOW9k3ZhbHVl5Li65pWw5a2X5pe25b+F6aG75o+Q5L6b77yJXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g5qC85byP5YyW6YCJ6aG5XG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOebuOWvueaXtumXtOWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDmiYvliqjmjIflrprljZXkvY1cbiAgICogZm9ybWF0UmVsYXRpdmVUaW1lKC0xLCAnZGF5JykgLy8gZW4tVVM6IFwieWVzdGVyZGF5XCIsIHpoLUNOOiBcIuaYqOWkqVwiXG4gICAqIGZvcm1hdFJlbGF0aXZlVGltZSgyLCAnaG91cicpIC8vIGVuLVVTOiBcImluIDIgaG91cnNcIiwgemgtQ046IFwiMuWwj+aXtuWQjlwiXG4gICAqIGZvcm1hdFJlbGF0aXZlVGltZSgtMzAsICdtaW51dGUnKSAvLyBlbi1VUzogXCIzMCBtaW51dGVzIGFnb1wiLCB6aC1DTjogXCIzMOWIhumSn+WJjVwiXG4gICAqXG4gICAqIC8vIOiHquWKqOiuoeeul+WNleS9jVxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSAtIDYwMDAwKSkgLy8gXCIxIG1pbnV0ZSBhZ29cIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSArIDcyMDAwMDApKSAvLyBcImluIDIgaG91cnNcIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSAtIDg2NDAwMDAwKSkgLy8gXCJ5ZXN0ZXJkYXlcIlxuICAgKi9cbiAgZm9ybWF0UmVsYXRpdmVUaW1lKFxuICAgIHZhbHVlOiBEYXRlLFxuICAgIG9wdGlvbnM/OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMsXG4gICk6IHN0cmluZztcblxuICBmb3JtYXRSZWxhdGl2ZVRpbWUoXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICB1bml0OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQsXG4gICAgb3B0aW9ucz86IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgKTogc3RyaW5nO1xuXG4gIGZvcm1hdFJlbGF0aXZlVGltZShcbiAgICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSxcbiAgICB1bml0T3JPcHRpb25zPzpcbiAgICAgIHwgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0XG4gICAgICB8IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgICBvcHRpb25zOiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG51bWVyaWM6ICdhdXRvJyB9LFxuICApOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBsZXQgZmluYWxWYWx1ZTogbnVtYmVyO1xuICAgICAgbGV0IGZpbmFsVW5pdDogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0O1xuICAgICAgbGV0IGZpbmFsT3B0aW9uczogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIC8vIOiHquWKqOiuoeeul+aXtumXtOW3ruWSjOWNleS9jVxuICAgICAgICBjb25zdCB7IHZhbHVlOiBjYWxjdWxhdGVkVmFsdWUsIHVuaXQ6IGNhbGN1bGF0ZWRVbml0IH0gPVxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVUaW1lKHZhbHVlKTtcbiAgICAgICAgZmluYWxWYWx1ZSA9IGNhbGN1bGF0ZWRWYWx1ZTtcbiAgICAgICAgZmluYWxVbml0ID0gY2FsY3VsYXRlZFVuaXQ7XG4gICAgICAgIGZpbmFsT3B0aW9ucyA9XG4gICAgICAgICAgKHVuaXRPck9wdGlvbnMgYXMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zKSB8fCBvcHRpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5L2/55So5o+Q5L6b55qE5pWw5YC85ZKM5Y2V5L2NXG4gICAgICAgIGZpbmFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZmluYWxVbml0ID0gdW5pdE9yT3B0aW9ucyBhcyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQ7XG4gICAgICAgIGZpbmFsT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIGZpbmFsT3B0aW9ucykuZm9ybWF0KFxuICAgICAgICBmaW5hbFZhbHVlLFxuICAgICAgICBmaW5hbFVuaXQsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmcgZmFpbGVkIGZvciAke3ZhbHVlfTpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgID8gdmFsdWUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUpXG4gICAgICAgIDogYCR7dmFsdWV9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5pel5pyf6K6h566X55u45a+55pe26Ze05beu5YC85ZKM5pyA5ZCI6YCC55qE5Y2V5L2NXG4gICAqIEBwYXJhbSBkYXRlIC0g55uu5qCH5pel5pyfXG4gICAqIEByZXR1cm5zIOWMheWQq+aXtumXtOW3ruWAvOWSjOWNleS9jeeahOWvueixoVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVSZWxhdGl2ZVRpbWUoZGF0ZTogRGF0ZSk6IHtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIHVuaXQ6IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0VW5pdDtcbiAgfSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBkaWZmTXMgPSBkYXRlLmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCk7XG4gICAgY29uc3QgYWJzRGlmZk1zID0gTWF0aC5hYnMoZGlmZk1zKTtcblxuICAgIC8vIOaXtumXtOWNleS9jemYiOWAvO+8iOavq+enku+8iVxuICAgIGNvbnN0IE1JTlVURV9NUyA9IDYwICogMTAwMDtcbiAgICBjb25zdCBIT1VSX01TID0gNjAgKiBNSU5VVEVfTVM7XG4gICAgY29uc3QgREFZX01TID0gMjQgKiBIT1VSX01TO1xuXG4gICAgLy8g5qC55o2u5pe26Ze05beu6YCJ5oup5ZCI6YCC55qE5Y2V5L2N77yM5pyA5aSn5Y2V5L2N5Li6ZGF5XG4gICAgaWYgKGFic0RpZmZNcyA+PSBEQVlfTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIERBWV9NUyksXG4gICAgICAgIHVuaXQ6ICdkYXknLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFic0RpZmZNcyA+PSBIT1VSX01TKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogTWF0aC5yb3VuZChkaWZmTXMgLyBIT1VSX01TKSxcbiAgICAgICAgdW5pdDogJ2hvdXInLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFic0RpZmZNcyA+PSBNSU5VVEVfTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIE1JTlVURV9NUyksXG4gICAgICAgIHVuaXQ6ICdtaW51dGUnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIDEwMDApLFxuICAgICAgdW5pdDogJ3NlY29uZCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7ml6XmnJ/moLzlvI/phY3nva7moLzlvI/ljJbml6XmnJ9cbiAgICog5L2/55So5qCH5YeGIEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zIOehruS/neagvOW8j+WPr+mihOa1i+aAp1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXREYXRlQnlPcHRpb25zKFxuICAgIGRhdGU6IERhdGUsXG4gICAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gICk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSwgb3B0aW9ucykuZm9ybWF0KGRhdGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBEYXRlIGZvcm1hdHRpbmcgZmFpbGVkOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/h+Wtl+espuS4sumUruiOt+WPlue/u+ivkVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbkJ5S2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlVHJhbnNsYXRpb24oa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4fnv7vor5Hlr7nosaHojrflj5bnv7vor5HlgLxcbiAgICovXG4gIHByaXZhdGUgZ2V0VHJhbnNsYXRpb25CeU9iamVjdChcbiAgICB0cmFuc2xhdGlvbk9iajogVHJhbnNsYXRpb24sXG4gICk6IFRyYW5zbGF0aW9uVmFsdWUge1xuICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9uVmFsdWUodHJhbnNsYXRpb25PYmosIHRoaXMubG9jYWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIbml6DmlYjor63oqIDnjq/looNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlSW52YWxpZExvY2FsZSgpOiB2b2lkIHtcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bsb2NhbGVzYCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgY29ycmVjdGx5Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmqjOivgeivreiogOeOr+Wig+aYr+WQpuacieaViFxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZhbGlkTG9jYWxlKGxvY2FsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2NhbGVzLmluY2x1ZGVzKGxvY2FsZSk7XG4gIH1cblxuICAvKipcbiAgICog5qOA5p+l6YeN5aSN57+76K+R77yI5byA5Y+R5qih5byP77yJXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRm9yRHVwbGljYXRlVHJhbnNsYXRpb25zKG5ld1RyYW5zbGF0aW9uczogVHJhbnNsYXRpb25zKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBleGlzdGluZ1RyYW5zbGF0aW9ucyBvZiB0aGlzLnRyYW5zbGF0aW9uc0xpc3QpIHtcbiAgICAgIE9iamVjdC5rZXlzKG5ld1RyYW5zbGF0aW9ucykuZm9yRWFjaChsb2NhbGUgPT4ge1xuICAgICAgICBpZiAoZXhpc3RpbmdUcmFuc2xhdGlvbnNbbG9jYWxlXSkge1xuICAgICAgICAgIHRoaXMuY29tcGFyZVRyYW5zbGF0aW9uS2V5cyhcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIG5ld1RyYW5zbGF0aW9uc1tsb2NhbGVdLFxuICAgICAgICAgICAgZXhpc3RpbmdUcmFuc2xhdGlvbnNbbG9jYWxlXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qCH5YeG5YyW6L+c56iLVVJMXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVJlbW90ZVVybChyZW1vdGVVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmVtb3RlVXJsID0gdGhpcy5jbGVhblVybChyZW1vdGVVcmwpO1xuICAgIGNvbnN0IGlzQWJzb2x1dGUgPSBpc0Fic29sdXRlVXJsKHJlbW90ZVVybCk7XG4gICAgY29uc3QgaXNBcGlHYXRlV2F5UmVxdWVzdCA9IHJlbW90ZVVybC5zdGFydHNXaXRoKEFQSV9HQVRFV0FZKTtcblxuICAgIC8vIOW8gOWPkeaooeW8j+S4i+i/m+ihjFVSTOmqjOivgVxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZVJlbW90ZVVybChyZW1vdGVVcmwsIGlzQWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8vIOebuOWvuVVSTOi9rOaNouS4uue7neWvuVVSTFxuICAgIGlmICghaXNBYnNvbHV0ZSAmJiAhaXNBcGlHYXRlV2F5UmVxdWVzdCkge1xuICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuYmFzZUhyZWYuZW5kc1dpdGgoJy8nKVxuICAgICAgICA/IHRoaXMuYmFzZUhyZWZcbiAgICAgICAgOiBgJHt0aGlzLmJhc2VIcmVmfS9gO1xuICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9JHtyZW1vdGVVcmx9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3RlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIOa4heeQhlVSTO+8iOenu+mZpGhhc2jniYfmrrXvvIlcbiAgICovXG4gIHByaXZhdGUgY2xlYW5VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBoZWFkKHVybC5zcGxpdCgvIy8pKSB8fCB1cmw7XG4gIH1cblxuICAvKipcbiAgICog6aqM6K+B6L+c56iLVVJM77yI5byA5Y+R5qih5byP77yJXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUmVtb3RlVXJsKHJlbW90ZVVybDogc3RyaW5nLCBpc0Fic29sdXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFpc0Fic29sdXRlICYmICghdGhpcy5iYXNlSHJlZiB8fCAhaXNBYnNvbHV0ZVVybCh0aGlzLmJhc2VIcmVmKSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdhYnNvbHV0ZSBiYXNlIGhyZWYgaXMgcmVxdWlyZWQgZm9yIHJlbGF0aXZlIHJlbW90ZSB1cmwnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocmVtb3RlVXJsLnNwbGl0KCc/JylbMF0uaW5jbHVkZXMoJy4vJykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdkbyBub3QgdXNlIGFueSBkb3Qgd2l0aCBzbGFzaCBmb3IgcmVsYXRpdmUgdXJsIHdoaWNoIHNob3VsZCBhbHdheXMgYmFzZSBmcm9tIGJhc2UgaHJlZicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rov5znqIvnv7vor5Hor7fmsYJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUmVtb3RlVHJhbnNsYXRpb25SZXF1ZXN0KFxuICAgIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnM+IHtcbiAgICBpZiAoTE9DQUxFX1BMQUNFSE9MREVSX1JFR0VYLnRlc3Qobm9ybWFsaXplZFVybCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU11bHRpTG9jYWxlUmVxdWVzdChub3JtYWxpemVkVXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2luZ2xlTG9jYWxlUmVxdWVzdChub3JtYWxpemVkVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rlpJror63oqIDor7fmsYJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlTXVsdGlMb2NhbGVSZXF1ZXN0KFxuICAgIHVybFRlbXBsYXRlOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSB0aGlzLm9wdGlvbnMubG9jYWxlcy5tYXAobG9jYWxlID0+XG4gICAgICB0aGlzLmZldGNoVHJhbnNsYXRpb24odXJsVGVtcGxhdGUsIGxvY2FsZSkucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb29zZSkge1xuICAgICAgICAgICAgY29uc3QgbG9vc2VMb2NhbGUgPSB0aGlzLmV4dHJhY3RMb29zZUxvY2FsZShsb2NhbGUpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBsb2NhbGUgIT09IGxvb3NlTG9jYWxlICYmXG4gICAgICAgICAgICAgICF0aGlzLm9wdGlvbnMubG9jYWxlcy5pbmNsdWRlcyhsb29zZUxvY2FsZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFRyYW5zbGF0aW9uKHVybFRlbXBsYXRlLCBsb29zZUxvY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpc0Rldk1vZGUoKSA/IHRocm93RXJyb3IoKCkgPT4gZXJyb3IpIDogRU1QVFk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaWx0ZXIoaXNQbGFpbk9iamVjdCksXG4gICAgICAgIG1hcChcbiAgICAgICAgICAodHJhbnNsYXRpb246IFRyYW5zbGF0aW9uKSA9PlxuICAgICAgICAgICAgKHsgW2xvY2FsZV06IHRyYW5zbGF0aW9uIH0pIGFzIFRyYW5zbGF0aW9ucyxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cykucGlwZShcbiAgICAgIG1hcChyZXN1bHRzID0+XG4gICAgICAgIHJlc3VsdHMucmVkdWNlKChhY2MsIGN1cnIpID0+IE9iamVjdC5hc3NpZ24oYWNjLCBjdXJyKSwge30pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuWNleivreiogOivt+axglxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTaW5nbGVMb2NhbGVSZXF1ZXN0KHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnM+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJmb3JtVHJhbnNsYXRpb25SZXF1ZXN0KHVybCkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gKGlzRGV2TW9kZSgpID8gdGhyb3dFcnJvcigoKSA9PiBlcnJvcikgOiBFTVBUWSkpLFxuICAgICkgYXMgT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnM+O1xuICB9XG5cbiAgLyoqXG4gICAqIOaJp+ihjOe/u+ivkeivt+axglxuICAgKi9cbiAgcHJpdmF0ZSBwZXJmb3JtVHJhbnNsYXRpb25SZXF1ZXN0KHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBpc0pTT04gPSB1cmwuZW5kc1dpdGgoJy5qc29uJyk7XG4gICAgY29uc3QgaXNBcGlHYXRlV2F5UmVxdWVzdCA9IHVybC5zdGFydHNXaXRoKEFQSV9HQVRFV0FZKTtcbiAgICBjb25zdCByZXNwb25zZVR5cGUgPSBpc0pTT04gPyAnanNvbicgOiAndGV4dCc7XG5cbiAgICBpZiAoaXNBcGlHYXRlV2F5UmVxdWVzdCkge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAucmVxdWVzdCgnR0VUJywgdXJsLCB7IHJlc3BvbnNlVHlwZSB9KVxuICAgICAgICAucGlwZShtYXAoYm9keSA9PiAoaXNKU09OID8gYm9keSA6IHBhcnNlKGJvZHkpKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBhamF4KHsgdXJsLCByZXNwb25zZVR5cGUgfSkucGlwZShcbiAgICAgIG1hcCgoeyByZXNwb25zZSB9KSA9PiAoaXNKU09OID8gcmVzcG9uc2UgOiBwYXJzZShyZXNwb25zZSBhcyBzdHJpbmcpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpqozor4FmZXRjaFRyYW5zbGF0aW9u5Y+C5pWwXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmV0Y2hUcmFuc2xhdGlvblBhcmFtcyhcbiAgICByZW1vdGVVcmw6IHN0cmluZyxcbiAgICBsb2NhbGU/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmIChpc0Rldk1vZGUoKSAmJiBMT0NBTEVfUExBQ0VIT0xERVJfUkVHRVgudGVzdChyZW1vdGVVcmwpICYmICFsb2NhbGUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdgbG9jYWxlYCBpcyByZXF1aXJlZCBzaW5jZSB0aGUgcHJvdmlkZWQgcmVtb3RlIHVybCBjb250YWlucyBsb2NhbGUgcGxhY2Vob2xkZXInLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6Kej5p6Q57+76K+R5paH5pysXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVUcmFuc2xhdGlvbihrZXk6IHN0cmluZywgbG9jYWxlID0gdGhpcy5sb2NhbGUpOiBzdHJpbmcge1xuICAgIC8vIOS8mOWFiOS7jui/nOeoi+e/u+ivkeS4reafpeaJvlxuICAgIGxldCB2YWx1ZSA9IHRoaXMuc2VhcmNoSW5UcmFuc2xhdGlvbnNMaXN0KFxuICAgICAga2V5LFxuICAgICAgbG9jYWxlLFxuICAgICAgdGhpcy5yZW1vdGVUcmFuc2xhdGlvbnNMaXN0LFxuICAgICk7XG5cbiAgICAvLyDlpoLmnpzov5znqIvnv7vor5HkuK3msqHmnInmib7liLDvvIh1bmRlZmluZWTvvInvvIzliJnku47mnKzlnLDnv7vor5HkuK3mn6Xmib5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSB0aGlzLnNlYXJjaEluVHJhbnNsYXRpb25zTGlzdChrZXksIGxvY2FsZSwgdGhpcy50cmFuc2xhdGlvbnNMaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUgPz8ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOe/u+ivkeWIl+ihqOS4reaQnOe0olxuICAgKi9cbiAgcHJpdmF0ZSBzZWFyY2hJblRyYW5zbGF0aW9uc0xpc3QoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgdHJhbnNsYXRpb25zTGlzdDogVHJhbnNsYXRpb25zW10sXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0cmFuc2xhdGlvbnNMaXN0IHx8IHRyYW5zbGF0aW9uc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIOS7juWQjuW+gOWJjemBjeWOhu+8iOWQjuWKoOWFpeeahOS8mOWFiOe6p+abtOmrmO+8iVxuICAgIGZvciAobGV0IGkgPSB0cmFuc2xhdGlvbnNMaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VhcmNoSW5UcmFuc2xhdGlvbnMoa2V5LCBsb2NhbGUsIHRyYW5zbGF0aW9uc0xpc3RbaV0pO1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5Y2V5Liq57+76K+R5a+56LGh5Lit5pCc57SiXG4gICAqL1xuICBwcml2YXRlIHNlYXJjaEluVHJhbnNsYXRpb25zKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25zLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uVmFsdWUgPSB0aGlzLmdldFRyYW5zbGF0aW9uVmFsdWUodHJhbnNsYXRpb25zLCBsb2NhbGUpO1xuXG4gICAgLy8g5aaC5p6c5rKh5pyJ6I635Y+W5Yiw57+76K+R5YC85a+56LGh77yIZ2V0VHJhbnNsYXRpb25WYWx1ZeW3sue7j+WkhOeQhuS6hmxvb3Nl5ZKMZmFsbGJhY2vvvInvvIznm7TmjqXov5Tlm55cbiAgICBpZiAodHJhbnNsYXRpb25WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIOiOt+WPlue/u+ivkeWAvO+8jOaUr+aMgeaJgeW5s+WSjOW1jOWll+S4pOenjee7k+aehFxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21Tb3VyY2UodHJhbnNsYXRpb25WYWx1ZSwga2V5KTtcblxuICAgIC8vIOWmguaenOaJvuWIsOWAvO+8iOWMheaLrG51bGzlgLzvvInvvIzliJnlpITnkIblubbov5Tlm55cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52YWxpZGF0ZVRyYW5zbGF0aW9uVmFsdWUodmFsdWUsIGxvY2FsZSwga2V5KTtcbiAgICAgIC8vIG51bGzlgLzovazmjaLkuLrlrZfnrKbkuLInbnVsbCfvvIzlhbbku5blgLzmraPluLjovazmjaJcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/ICdudWxsJyA6IFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5Zyo5b2T5YmN6K+t6KiA55qE57+76K+R5YC85Lit5om+5LiN5Yiwa2V577yM5L2G6L+Z5LiN5pivZmFsbGJhY2vor63oqIDvvIzlsJ3or5VmYWxsYmFja1xuICAgIGlmIChsb2NhbGUgIT09IHRoaXMub3B0aW9ucy5mYWxsYmFja0xvY2FsZSkge1xuICAgICAgY29uc3QgZmFsbGJhY2tUcmFuc2xhdGlvblZhbHVlID0gdGhpcy5nZXRUcmFuc2xhdGlvblZhbHVlKFxuICAgICAgICB0cmFuc2xhdGlvbnMsXG4gICAgICAgIHRoaXMub3B0aW9ucy5mYWxsYmFja0xvY2FsZSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmYWxsYmFja1RyYW5zbGF0aW9uVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmYWxsYmFja1ZhbHVlID0gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21Tb3VyY2UoXG4gICAgICAgICAgZmFsbGJhY2tUcmFuc2xhdGlvblZhbHVlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZhbGxiYWNrVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVUcmFuc2xhdGlvblZhbHVlKFxuICAgICAgICAgICAgZmFsbGJhY2tWYWx1ZSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxsYmFja1ZhbHVlID09PSBudWxsID8gJ251bGwnIDogU3RyaW5nKGZhbGxiYWNrVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDku47nv7vor5HmupDojrflj5bnv7vor5HlgLzvvIzmlK/mjIHmiYHlubPlkozltYzlpZfkuKTnp43nu5PmnoRcbiAgICogQHBhcmFtIHNvdXJjZSAtIOe/u+ivkea6kOWvueixoVxuICAgKiBAcGFyYW0ga2V5IC0g57+76K+R6ZSu77yI5aaCICdhLmIuYyfvvIlcbiAgICogQHJldHVybnMg57+76K+R5YC85oiWdW5kZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zbGF0aW9uRnJvbVNvdXJjZShzb3VyY2U6IGFueSwga2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIDEuIOS8mOWFiOWwneivleaJgeW5s+e7k+aehO+8muebtOaOpeafpeaJvuWujOaVtOeahOmUriAnYS5iLmMnXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Vba2V5XTtcbiAgICB9XG5cbiAgICAvLyAyLiDlho3lsJ3or5XltYzlpZfnu5PmnoTvvJrkvb/nlKhsb2Rhc2guZ2V05oyJ6Lev5b6E5p+l5om+IGEuYi5jXG4gICAgY29uc3QgbmVzdGVkVmFsdWUgPSBnZXQoc291cmNlLCBrZXkpO1xuICAgIGlmIChuZXN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmVzdGVkVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmjIflrpror63oqIDnmoTnv7vor5HlgLzvvIjlpITnkIZsb29zZeaooeW8j+WSjGZhbGxiYWNr6YC76L6R77yJXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zbGF0aW9uVmFsdWUoXG4gICAgc291cmNlOiBUcmFuc2xhdGlvbixcbiAgICBsb2NhbGUgPSB0aGlzLmxvY2FsZSxcbiAgKTogVHJhbnNsYXRpb25WYWx1ZSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gMS4g6aaW5YWI5qOA5p+l57K+56Gu5Yy56YWN55qE6ZSu5piv5ZCm5a2Y5ZyoXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2VbbG9jYWxlXTsgLy8g6L+U5Zue5a6e6ZmF5YC877yM5Y+v6IO95pivbnVsbOOAgXVuZGVmaW5lZOaIluWFtuS7luWAvFxuICAgIH1cblxuICAgIC8vIDIuIOWmguaenOWQr+eUqOS6huWuveadvuaooeW8j++8jOWwneivleWuveadvuWMuemFjVxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgIGNvbnN0IGxvb3NlVmFsdWUgPSB0aGlzLmdldExvb3NlVHJhbnNsYXRpb25WYWx1ZShzb3VyY2UsIGxvY2FsZSk7XG4gICAgICBpZiAobG9vc2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsb29zZVZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIOWmguaenOW9k+WJjeivreiogOS4jeaYr2ZhbGxiYWNr6K+t6KiA77yM5bCd6K+VZmFsbGJhY2vor63oqIBcbiAgICBpZiAobG9jYWxlICE9PSB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGUpIHtcbiAgICAgIC8vIOmmluWFiOajgOafpWZhbGxiYWNr6K+t6KiA55qE57K+56Gu5Yy56YWNXG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVt0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGVdO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzlkK/nlKjkuoblrr3mnb7mqKHlvI/vvIzkuZ/lr7lmYWxsYmFja+ivreiogOi/m+ihjOWuveadvuWMuemFjVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb29zZSkge1xuICAgICAgICBjb25zdCBmYWxsYmFja0xvb3NlVmFsdWUgPSB0aGlzLmdldExvb3NlVHJhbnNsYXRpb25WYWx1ZShcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZmFsbGJhY2tMb29zZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2tMb29zZVZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlrr3mnb7mqKHlvI/kuIvojrflj5bnv7vor5HlgLxcbiAgICovXG4gIHByaXZhdGUgZ2V0TG9vc2VUcmFuc2xhdGlvblZhbHVlKFxuICAgIHNvdXJjZTogVHJhbnNsYXRpb24sXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICk6IFRyYW5zbGF0aW9uVmFsdWUge1xuICAgIGNvbnN0IGxvb3NlTG9jYWxlID0gdGhpcy5leHRyYWN0TG9vc2VMb2NhbGUobG9jYWxlKTtcblxuICAgIGlmIChsb2NhbGUgPT09IGxvb3NlTG9jYWxlKSB7XG4gICAgICAvLyDlr7vmib7ljLnphY3nmoTlrr3mnb7or63oqIBcbiAgICAgIGNvbnN0IG1hdGNoZWRFbnRyeSA9IE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZmluZChcbiAgICAgICAgKFtrZXldKSA9PiBsb29zZUxvY2FsZSA9PT0gdGhpcy5leHRyYWN0TG9vc2VMb2NhbGUoa2V5KSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbWF0Y2hlZEVudHJ5Py5bMV07XG4gICAgfVxuXG4gICAgLy8g5qOA5p+l5a695p2+6K+t6KiA6ZSu5piv5ZCm5a2Y5ZyoXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGxvb3NlTG9jYWxlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZVtsb29zZUxvY2FsZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmj5Dlj5blrr3mnb7or63oqIDku6PnoIHvvIjlpoLvvJp6aC1DTiAtPiB6aO+8iVxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0TG9vc2VMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBoZWFkKGxvY2FsZS5zcGxpdCgvW18tXS8pKSB8fCBsb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICog6aqM6K+B57+76K+R5YC877yI5byA5Y+R5qih5byP77yJXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNsYXRpb25WYWx1ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBpc0Rldk1vZGUoKSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIGdldCh2YWx1ZSwgU3ltYm9sLnRvUHJpbWl0aXZlKSAhPT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgVGhlIHRyYW5zbGF0aW9uIGZvciBsb2NhbGU6IFxcYCR7bG9jYWxlfVxcYCBhbmQga2V5OlxcYCR7a2V5fVxcYCBpcyBhbiBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIHVuZXhwZWN0ZWRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5q+U6L6D57+76K+R6ZSu77yI5byA5Y+R5qih5byP5LiL5qOA5p+l6YeN5aSN77yJXG4gICAqL1xuICBwcml2YXRlIGNvbXBhcmVUcmFuc2xhdGlvbktleXMoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uLFxuICAgIHByZXZUcmFuc2xhdGlvbjogVHJhbnNsYXRpb24sXG4gICAgcGF0aDogc3RyaW5nW10gPSBbXSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRyYW5zbGF0aW9uID09IG51bGwgfHwgcHJldlRyYW5zbGF0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyh0cmFuc2xhdGlvbikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcmV2VHJhbnNsYXRpb24sIGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBwcmV2VHJhbnNsYXRpb25ba2V5XTtcbiAgICAgIGNvbnN0IHZhbHVlSXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgICAgY29uc3QgcHJldlZhbHVlSXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3QocHJldlZhbHVlKTtcblxuICAgICAgaWYgKHZhbHVlSXNQbGFpbk9iamVjdCAmJiBwcmV2VmFsdWVJc1BsYWluT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuY29tcGFyZVRyYW5zbGF0aW9uS2V5cyhcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgdmFsdWUgYXMgVHJhbnNsYXRpb24sXG4gICAgICAgICAgcHJldlZhbHVlIGFzIFRyYW5zbGF0aW9uLFxuICAgICAgICAgIFsuLi5wYXRoLCBrZXldLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsdWVJc1BsYWluT2JqZWN0ICYmICFwcmV2VmFsdWVJc1BsYWluT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBbLi4ucGF0aCwga2V5XS5qb2luKCcgLT4gJyk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gcHJldlZhbHVlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFRoZSBjdXN0b21pemVkIHRyYW5zbGF0aW9uIGZvciBsb2NhbGU6IFxcYCR7bG9jYWxlfVxcYCBhbmQgcGF0aDogXFxgJHtvdXRwdXRQYXRofVxcYCBpcyBkdXBsaWNhdGVkIHdpdGggdGhlIG90aGVyIHRyYW5zbGF0aW9uLCBwbGVhc2UgcmVtb3ZlIGl0IGluIHlvdXIgdHJhbnNsYXRpb24gZmlsZS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFR3byBrZXlzIHRoYXQgdGhlIGxvY2FsZSBpcyBcXGAke2xvY2FsZX1cXGAgYW5kIHRoZSBwYXRoIGlzIFxcYCR7b3V0cHV0UGF0aH1cXGAgYXJlIHNhbWUsIGJ1dCB0aGVpciB2YWx1ZXMgYXJlIG5vdCBlcXVhbCwgcGxlYXNlIHJlbW92ZSBvbmUgb2YgdGhlbSBvciBjaGFuZ2Ugb25lIG9mIHRoZSBrZXlzLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
841
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvdHJhbnNsYXRlL3RyYW5zbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBRVYsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsVUFBVSxFQUNWLE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQUNWLEtBQUssRUFDTCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixHQUFHLEVBQ0gsU0FBUyxHQUNWLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGNBQWMsR0FDZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZ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QUFoQixnQkFBZ0IsbUJBREgsTUFBTTs7QUF3QnJCO0lBRFIsZUFBZSxFQUFFOzhCQUNBLFVBQVU7aURBQVM7aUZBdkIxQixnQkFBZ0I7Y0FENUIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7c0JBc0M3QixNQUFNO3VCQUFDLGVBQWU7O3NCQUN0QixRQUFROztzQkFBSSxNQUFNO3VCQUFDLGlCQUFpQjs7c0JBQ3BDLFFBQVE7O3NCQUFJLE1BQU07dUJBQUMsWUFBWTtxQkFoQnpCLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSB0cmFuc2xhdGVcbiAqL1xuXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW50bE1lc3NhZ2VGb3JtYXQgfSBmcm9tICdpbnRsLW1lc3NhZ2Vmb3JtYXQnO1xuaW1wb3J0IHsgZ2V0LCBoZWFkLCBoYXMsIGlzUGxhaW5PYmplY3QsIHRlbXBsYXRlIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGZvcmtKb2luLFxuICB0aHJvd0Vycm9yLFxuICBFTVBUWSxcbiAgY2F0Y2hFcnJvcixcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgbWFwLFxuICB0YWtlVW50aWwsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYWpheCB9IGZyb20gJ3J4anMvYWpheCc7XG5cbmltcG9ydCB7IEFQSV9HQVRFV0FZIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE9ic2VydmFibGVJbnB1dCwgVE9LRU5fQkFTRV9IUkVGIH0gZnJvbSAnLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IGlzQWJzb2x1dGVVcmwgfSBmcm9tICcuLi9jb3JlL3V0aWxzL2NvbW1vbic7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJy4uL2NvcmUvdXRpbHMveWFtbCc7XG5cbmltcG9ydCB7XG4gIEZBTExCQUNLX0xBTkdVQUdFLFxuICBMT0NBTEVfUExBQ0VIT0xERVJfUkVHRVgsXG4gIExPQ0FMRV9TVE9SQUdFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRVc2VyTGFuZ3VhZ2UgfSBmcm9tICcuL2kxOG4tY29uZmlnJztcbmltcG9ydCB7IFRSQU5TTEFURV9PUFRJT05TLCBUUkFOU0xBVElPTlMgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQge1xuICBUcmFuc2xhdGVLZXksXG4gIFRyYW5zbGF0ZU9wdGlvbnMsXG4gIFRyYW5zbGF0aW9uLFxuICBUcmFuc2xhdGlvblZhbHVlLFxuICBUcmFuc2xhdGlvbnMsXG4gIFRlbXBsYXRlRGF0YSxcbiAgSWN1RGF0YSxcbiAgVGVtcGxhdGVEYXRhT2JqZWN0LFxufSBmcm9tICcuL3R5cGVzJztcblxuZnVuY3Rpb24gZ2V0TG9vc2VMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaGVhZChsb2NhbGUuc3BsaXQoL1tfLV0vKSkgfHwgbG9jYWxlO1xufVxuXG5mdW5jdGlvbiBoYXNMb2Rhc2hUZW1wbGF0ZUZvcm1hdChtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXHtcXHtbXn1dK1xcfVxcfS8udGVzdChtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gaGFzSWN1TWVzc2FnZUZvcm1hdChtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXHtbXnt9XStcXH0vLnRlc3QobWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIGlzVGVtcGxhdGVQbGFpbk9iamVjdChkYXRhOiBUZW1wbGF0ZURhdGEpOiBkYXRhIGlzIFRlbXBsYXRlRGF0YU9iamVjdCB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGRhdGEpO1xufVxuXG4vKipcbiAqIOWbvemZheWMlue/u+ivkeacjeWKoVxuICpcbiAqIOeJueaAp++8mlxuICogLSDmlK/mjIHlpJrlsYLnuqfnv7vor5HkvJjlhYjnuqfvvIjov5znqIvnv7vor5EgPiDmiYvliqjmt7vliqDnv7vor5EgPiDphY3nva7nv7vor5HvvIlcbiAqIC0g5pSv5oyB5Yqo5oCB6K+t6KiA5YiH5o2iXG4gKiAtIOaUr+aMgSBJQ1UgTWVzc2FnZSBGb3JtYXQg5qih5p2/5o+S5YC8XG4gKiAtIOaUr+aMgeWuveadvuaooeW8j+ivreiogOWMuemFjVxuICogLSDmlK/mjIHlvILmraXov5znqIvnv7vor5HliqDovb1cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIOe/u+ivkea3u+WKoOmAmuefpea1gSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCA9IHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5hc09ic2VydmFibGUoKTtcblxuICAvKiog57uE5Lu26ZSA5q+B6YCa55+l5rWBICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiog5pys5Zyw57+76K+R5YiX6KGo77yI5LyY5YWI57qn77ya5ZCO5Yqg5YWl55qE5LyY5YWI57qn5pu06auY77yJICovXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0xpc3Q6IEFycmF5PFJlYWRvbmx5PFRyYW5zbGF0aW9ucz4+ID0gW107XG5cbiAgLyoqIOi/nOeoi+e/u+ivkeWIl+ihqO+8iOS8mOWFiOe6p+acgOmrmO+8iSAqL1xuICByZWFkb25seSByZW1vdGVUcmFuc2xhdGlvbnNMaXN0OiBBcnJheTxSZWFkb25seTxUcmFuc2xhdGlvbnM+PiA9IFtdO1xuXG4gIC8qKiDnv7vor5HphY3nva7pgInpobkgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucztcblxuICAvKiog5b2T5YmN6K+t6KiA546v5aKDICovXG4gIGxvY2FsZTogc3RyaW5nO1xuXG4gIC8qKiDlvZPliY3or63oqIDnjq/looPvvIjlk43lupTlvI/vvIkgKi9cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IGxvY2FsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAvKiog6I635Y+W5pSv5oyB55qE6K+t6KiA5YiX6KGoICovXG4gIGdldCBsb2NhbGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvY2FsZXM7XG4gIH1cblxuICAvKiog6I635Y+W5Zue6YCA6K+t6KiAICovXG4gIGdldCBmYWxsYmFja0xvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUT0tFTl9CQVNFX0hSRUYpIHByaXZhdGUgcmVhZG9ubHkgYmFzZUhyZWY6IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTEFURV9PUFRJT05TKSBvcHRpb25zOiBUcmFuc2xhdGVPcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVFJBTlNMQVRJT05TKSB0cmFuc2xhdGlvbkxpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApIHtcbiAgICAvLyDliJ3lp4vljJbor63oqIDnjq/looNcbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuZ2V0SW5pdGlhbExvY2FsZShvcHRpb25zKTtcblxuICAgIC8vIOWIneWni+WMlumFjee9rumAiemhuVxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZXM6IFt0aGlzLmxvY2FsZV0sXG4gICAgICBmYWxsYmFja0xvY2FsZTogRkFMTEJBQ0tfTEFOR1VBR0UsXG4gICAgICBsb29zZTogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyDliJ3lp4vljJbnv7vor5HliJfooahcbiAgICB0aGlzLnRyYW5zbGF0aW9uc0xpc3QgPSB0aGlzLmdldEluaXRpYWxpemVUcmFuc2xhdGlvbnMoXG4gICAgICBvcHRpb25zLFxuICAgICAgdHJhbnNsYXRpb25MaXN0LFxuICAgICk7XG5cbiAgICAvLyDliqDovb3ov5znqIvnv7vor5FcbiAgICB0aGlzLmxvYWRSZW1vdGVUcmFuc2xhdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog57uE5Lu26ZSA5q+B5riF55CGXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnv7vor5HmlofmnKzlubbov5vooYzmqKHmnb/mj5LlgLxcbiAgICog5pSv5oyB5Lik56eN5qih5p2/6K+t5rOV77yaXG4gICAqIDEuIOS8oOe7n+eahCB7eyBrZXkgfX0g6K+t5rOV77yM5L2/55SoIGxvZGFzaCB0ZW1wbGF0ZSDlpITnkIZcbiAgICogMi4gSUNVIE1lc3NhZ2UgRm9ybWF0IOivreazle+8jOS9v+eUqCBJbnRsTWVzc2FnZUZvcm1hdCDlpITnkIZcbiAgICogQHBhcmFtIGtleSAtIOe/u+ivkemUruaIlue/u+ivkeWvueixoVxuICAgKiBAcGFyYW0gZGF0YSAtIOaooeadv+aVsOaNru+8iOaUr+aMgeWfuuacrOexu+Wei+OAgURhdGXjgIHlr7nosaHlkozmlbDnu4TvvIlcbiAgICogQHJldHVybnMg57+76K+R5ZCO55qE5paH5pysXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gbG9kYXNoIHRlbXBsYXRlIOivreazlVxuICAgKiB0cmFuc2xhdGUuZ2V0KCdoZWxsbycsIHsgbmFtZTogJ1dvcmxkJyB9KSAvLyDmqKHmnb86IFwiSGVsbG8ge3sgbmFtZSB9fVwiXG4gICAqXG4gICAqIC8vIElDVSBNZXNzYWdlIEZvcm1hdCDor63ms5VcbiAgICogdHJhbnNsYXRlLmdldCgnaXRlbUNvdW50JywgeyBjb3VudDogNSB9KSAvLyDmqKHmnb86IFwiSXRlbXM6IHtjb3VudCwgbnVtYmVyfVwiXG4gICAqIHRyYW5zbGF0ZS5nZXQoJ2NyZWF0ZWRBdCcsIHsgZGF0ZTogbmV3IERhdGUoKSB9KSAvLyDmqKHmnb86IFwiQ3JlYXRlZDoge2RhdGUsIGRhdGUsIHNob3J0fVwiXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KGtleTogVHJhbnNsYXRlS2V5LCBkYXRhPzogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMuZ2V0UmF3KGtleSk7XG5cbiAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOajgOa1i+aooeadv+exu+Wei+W5tuS9v+eUqOebuOW6lOeahOWkhOeQhuaWueW8j1xuICAgICAgaWYgKGhhc0xvZGFzaFRlbXBsYXRlRm9ybWF0KHRyYW5zbGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRMb2Rhc2hUZW1wbGF0ZSh0cmFuc2xhdGlvbiwgZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzSWN1TWVzc2FnZUZvcm1hdCh0cmFuc2xhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0SWN1TWVzc2FnZSh0cmFuc2xhdGlvbiwgZGF0YSk7XG4gICAgICB9XG4gICAgICAvLyDlpoLmnpzmsqHmnInmqKHmnb/or63ms5XvvIznm7TmjqXov5Tlm57nv7vor5HmlofmnKxcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVUZW1wbGF0ZUVycm9yKGtleSwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bljp/lp4vnv7vor5HmlofmnKzmqKHmnb/vvIjkuI3ov5vooYzmj5LlgLzlpITnkIbvvIlcbiAgICogQHBhcmFtIGtleSAtIOe/u+ivkemUruaIlue/u+ivkeWvueixoVxuICAgKiBAcmV0dXJucyDljp/lp4vnv7vor5HmqKHmnb/mlofmnKxcbiAgICovXG4gIGdldFJhdyhrZXk6IFRyYW5zbGF0ZUtleSk6IHN0cmluZyB7XG4gICAgLy8g5b2T57+76K+Ra2V55pivbnVsbOaIlnVuZGVmaW5lZOaXtui/lOWbnuepuuWtl+espuS4slxuICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25CeUtleShrZXkpO1xuICAgIH1cblxuICAgIC8vIOW9k2tleeaYr1RyYW5zbGF0aW9u5a+56LGh5pe277yM6I635Y+W5b2T5YmN6K+t6KiA55qE57+76K+R5YC8XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFRyYW5zbGF0aW9uQnlPYmplY3Qoa2V5LCB0aGlzLmxvY2FsZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLliLDkuIvkuIDkuKrmlK/mjIHnmoTor63oqIDnjq/looNcbiAgICovXG4gIHRvZ2dsZUxvY2FsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLm9wdGlvbnMubG9jYWxlcy5pbmRleE9mKHRoaXMubG9jYWxlKTtcblxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmhhbmRsZUludmFsaWRMb2NhbGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0SW5kZXggPSAoY3VycmVudEluZGV4ICsgMSkgJSB0aGlzLm9wdGlvbnMubG9jYWxlcy5sZW5ndGg7XG4gICAgY29uc3QgbmV4dExvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGVzW25leHRJbmRleF07XG5cbiAgICBpZiAobmV4dExvY2FsZSAmJiBuZXh0TG9jYWxlICE9PSB0aGlzLmxvY2FsZSkge1xuICAgICAgdGhpcy5zZXRMb2NhbGUobmV4dExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruW9k+WJjeivreiogOeOr+Wig1xuICAgKiBAcGFyYW0gbG9jYWxlIC0g6KaB6K6+572u55qE6K+t6KiA546v5aKDXG4gICAqL1xuICBzZXRMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZExvY2FsZShsb2NhbGUpKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBJbnZhbGlkIGxvY2FsZTogJHtsb2NhbGV9LiBTdXBwb3J0ZWQgbG9jYWxlczogJHt0aGlzLm9wdGlvbnMubG9jYWxlcy5qb2luKCcsICcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxFX1NUT1JBR0UsIGxvY2FsZSk7XG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICog5omL5Yqo5re75Yqg57+76K+R5YyFXG4gICAqIEBwYXJhbSB0cmFuc2xhdGlvbnMgLSDopoHmt7vliqDnmoTnv7vor5HljIVcbiAgICovXG4gIGFkZFRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdHJhbnNsYXRpb25zIHx8IHR5cGVvZiB0cmFuc2xhdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHRyYW5zbGF0aW9ucyBvYmplY3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlvIDlj5HmqKHlvI/kuIvmo4Dmn6Xph43lpI3nv7vor5FcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy50cmFuc2xhdGlvbnNMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY2hlY2tGb3JEdXBsaWNhdGVUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zbGF0aW9uc0xpc3QucHVzaCh0cmFuc2xhdGlvbnMpO1xuICAgIHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICog5re75Yqg6L+c56iL57+76K+R5YyFXG4gICAqIEBwYXJhbSByZW1vdGVVcmwgLSDov5znqIvnv7vor5Hmlofku7ZVUkxcbiAgICovXG4gIGFkZFJlbW90ZVRyYW5zbGF0aW9ucyhyZW1vdGVVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmVtb3RlVXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFVybCA9IHRoaXMubm9ybWFsaXplUmVtb3RlVXJsKHJlbW90ZVVybCk7XG4gICAgY29uc3QgcmVxdWVzdCQgPSB0aGlzLmNyZWF0ZVJlbW90ZVRyYW5zbGF0aW9uUmVxdWVzdChub3JtYWxpemVkVXJsKTtcblxuICAgIHJlcXVlc3QkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5uZXh0KCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IHJlbW90ZVRyYW5zbGF0aW9ucyA9PiB7XG4gICAgICAgICAgaWYgKHJlbW90ZVRyYW5zbGF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVUcmFuc2xhdGlvbnNMaXN0LnB1c2gocmVtb3RlVHJhbnNsYXRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVtb3RlIHRyYW5zbGF0aW9ucyBmcm9tICR7cmVtb3RlVXJsfTpgLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5LuO6L+c56iLVVJM6I635Y+W57+76K+R5pWw5o2uXG4gICAqIEBwYXJhbSByZW1vdGVVcmwgLSDov5znqItVUkxcbiAgICogQHBhcmFtIGxvY2FsZSAtIOWPr+mAieeahOivreiogOeOr+Wig++8iOeUqOS6jlVSTOaooeadv+abv+aNou+8iVxuICAgKiBAcmV0dXJucyDnv7vor5HmlbDmja7nmoRPYnNlcnZhYmxlXG4gICAqL1xuICBmZXRjaFRyYW5zbGF0aW9uKHJlbW90ZVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnM+O1xuICBmZXRjaFRyYW5zbGF0aW9uKHJlbW90ZVVybDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb24+O1xuICBmZXRjaFRyYW5zbGF0aW9uKFxuICAgIHJlbW90ZVVybDogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnMgfCBUcmFuc2xhdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdGVGZXRjaFRyYW5zbGF0aW9uUGFyYW1zKHJlbW90ZVVybCwgbG9jYWxlKTtcblxuICAgIGNvbnN0IHRhcmdldFVybCA9IGxvY2FsZVxuICAgICAgPyByZW1vdGVVcmwucmVwbGFjZShMT0NBTEVfUExBQ0VIT0xERVJfUkVHRVgsIGxvY2FsZSlcbiAgICAgIDogcmVtb3RlVXJsO1xuXG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh0YXJnZXRVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWIneWni+ivreiogOeOr+Wig1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbml0aWFsTG9jYWxlKG9wdGlvbnM6IFRyYW5zbGF0ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb25zPy5sb2NhbGUgfHwgZ2V0VXNlckxhbmd1YWdlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Yid5aeL57+76K+R5YiX6KGoXG4gICAqL1xuICBwcml2YXRlIGdldEluaXRpYWxpemVUcmFuc2xhdGlvbnMoXG4gICAgb3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucyxcbiAgICB0cmFuc2xhdGlvbkxpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApOiBUcmFuc2xhdGlvbnNbXSB7XG4gICAgcmV0dXJuIFtvcHRpb25zPy50cmFuc2xhdGlvbnMsIC4uLih0cmFuc2xhdGlvbkxpc3QgfHwgW10pXS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvKipcbiAgICog5Yqg6L296L+c56iL57+76K+RXG4gICAqL1xuICBwcml2YXRlIGxvYWRSZW1vdGVUcmFuc2xhdGlvbnMob3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucz8ucmVtb3RlVXJsKSByZXR1cm47XG5cbiAgICBjb25zdCB1cmxzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnJlbW90ZVVybClcbiAgICAgID8gb3B0aW9ucy5yZW1vdGVVcmxcbiAgICAgIDogW29wdGlvbnMucmVtb3RlVXJsXTtcblxuICAgIHVybHMuZm9yRWFjaCh1cmwgPT4gdGhpcy5hZGRSZW1vdGVUcmFuc2xhdGlvbnModXJsKSk7XG4gIH1cblxuICAvKipcbiAgICog6L2s5o2i5qih5p2/5pWw5o2u5Li6IElDVSDlhbzlrrnmoLzlvI9cbiAgICogQHBhcmFtIGRhdGEgLSDmqKHmnb/mlbDmja5cbiAgICogQHJldHVybnMgSUNVIOWFvOWuueeahOaVsOaNruWvueixoVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVJY3VEYXRhKGRhdGE6IFRlbXBsYXRlRGF0YSk6IEljdURhdGEge1xuICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/nuq/lr7nosaHvvIznm7TmjqXovazmjaLlhbblsZ7mgKdcbiAgICBpZiAoaXNUZW1wbGF0ZVBsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T2JqZWN0VG9JY3VEYXRhKGRhdGEgYXMgVGVtcGxhdGVEYXRhT2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyDln7rmnKznsbvlnovjgIHmlbDnu4TjgIFEYXRl562J5YyF6KOF5Li6IHsgdmFsdWU6IGRhdGEgfVxuICAgIHJldHVybiB7IHZhbHVlOiB0aGlzLmNvbnZlcnRWYWx1ZVRvSWN1VmFsdWUoZGF0YSkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDovazmjaLlr7nosaHnmoTmiYDmnInlsZ7mgKfkuLogSUNVIOWFvOWuueWAvFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0T2JqZWN0VG9JY3VEYXRhKG9iajogVGVtcGxhdGVEYXRhT2JqZWN0KTogSWN1RGF0YSB7XG4gICAgY29uc3QgcmVzdWx0OiBJY3VEYXRhID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29udmVydFZhbHVlVG9JY3VWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlsIbljZXkuKrlgLzovazmjaLkuLogSUNVIOWFvOWuueexu+Wei1xuICAgKiDmjInnhacgSUNVIE1lc3NhZ2VGb3JtYXQg6KeE6IyD77yM5Y+q5pSv5oyBIHN0cmluZyB8IG51bWJlciB8IERhdGVcbiAgICovXG4gIHByaXZhdGUgY29udmVydFZhbHVlVG9JY3VWYWx1ZSh2YWx1ZTogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XG4gICAgLy8gSUNVIOWOn+eUn+aUr+aMgeeahOexu+Wei+ebtOaOpei/lOWbnlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8g5YW25LuW57G75Z6L6L2s5Li65a2X56ym5LiyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIOeugOWNleaVsOe7hOi9rOS4uumAl+WPt+WIhumalOeahOWtl+espuS4slxuICAgICAgcmV0dXJuIHZhbHVlLm1hcChpdGVtID0+IFN0cmluZyhpdGVtID8/ICcnKSkuam9pbignLCAnKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyDlr7nosaHovazkuLogSlNPTiDlrZfnrKbkuLJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIbmqKHmnb/plJnor69cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlVGVtcGxhdGVFcnJvcihrZXk6IFRyYW5zbGF0ZUtleSwgZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGtleVN0ciA9IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ga2V5IDogJ1tvYmplY3RdJztcbiAgICBjb25zdCBtZXNzYWdlID0gYFRoZSB0cmFuc2xhdGlvbiBrZXkgJyR7a2V5U3RyfScgaXMgbWlzc2luZyB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMuYDtcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkvb/nlKggbG9kYXNoIHRlbXBsYXRlIOagvOW8j+WMluaWh+acrFxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIOWMheWQqyB7eyB9fSDor63ms5XnmoTmqKHmnb/lrZfnrKbkuLJcbiAgICogQHBhcmFtIGRhdGEgLSDmqKHmnb/mlbDmja5cbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE5a2X56ym5LiyXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdExvZGFzaFRlbXBsYXRlKG1lc3NhZ2U6IHN0cmluZywgZGF0YTogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8g5bCG5pWw5o2u5qCH5YeG5YyW5Li65a+56LGh5qC85byPXG4gICAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSB0aGlzLm5vcm1hbGl6ZVRlbXBsYXRlRGF0YShkYXRhKTtcblxuICAgICAgLy8g5L2/55SoIGxvZGFzaCB0ZW1wbGF0ZSDlpITnkIYge3sgfX0g6K+t5rOVXG4gICAgICBjb25zdCBjb21waWxlZCA9IHRlbXBsYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgaW50ZXJwb2xhdGU6IC9cXHtcXHsoLis/KVxcfVxcfS9nLCAvLyDoh6rlrprkuYnmj5LlgLzor63ms5XkuLoge3sgfX1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY29tcGlsZWQodGVtcGxhdGVEYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgTG9kYXNoIHRlbXBsYXRlIGZvcm1hdHRpbmcgZmFpbGVkIGZvciBcIiR7bWVzc2FnZX1cIjpgLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8g6ZmN57qn5aSE55CG77ya6L+U5Zue5Y6f5aeL5raI5oGvXG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qCH5YeG5YyW5qih5p2/5pWw5o2u5Li65a+56LGh5qC85byPXG4gICAqIEBwYXJhbSBkYXRhIC0g5Y6f5aeL5qih5p2/5pWw5o2uXG4gICAqIEByZXR1cm5zIOagh+WHhuWMluWQjueahOWvueixoeaIluaVsOe7hO+8iOS4uuS6huWQkeWQjuWFvOWuue+8iVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVUZW1wbGF0ZURhdGEoXG4gICAgZGF0YTogVGVtcGxhdGVEYXRhLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W10ge1xuICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/nuq/lr7nosaHvvIznm7TmjqXov5Tlm55cbiAgICBpZiAoaXNUZW1wbGF0ZVBsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyDov5nmoLfmqKHmnb/kuK3lj6/ku6Xkvb/nlKgge3sgMCB9fSDorr/pl67nrKzkuIDkuKrlhYPntKBcbiAgICByZXR1cm4gW2RhdGFdIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkvb/nlKggSUNVIG1lc3NhZ2UgZm9ybWF0IOagvOW8j+WMluaWh+acrFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRJY3VNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgZGF0YTogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8g5bCG5pWw5o2u6L2s5o2i5Li6IElDVSDlhbzlrrnmoLzlvI9cbiAgICAgIGNvbnN0IGljdURhdGEgPSB0aGlzLm5vcm1hbGl6ZUljdURhdGEoZGF0YSk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VGb3JtYXQgPSBuZXcgSW50bE1lc3NhZ2VGb3JtYXQoXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHRoaXMubG9jYWxlLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHsgaWdub3JlVGFnOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1lc3NhZ2VGb3JtYXQuZm9ybWF0KGljdURhdGEpIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgSUNVIG1lc3NhZ2UgZm9ybWF0dGluZyBmYWlsZWQgZm9yIFwiJHttZXNzYWdlfVwiOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIC8vIOmZjee6p+WkhOeQhu+8mui/lOWbnuWOn+Wni+a2iOaBr1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMluaVsOWtl1xuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTmlbDlrZdcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDmoLzlvI/ljJbpgInpoblcbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE5pWw5a2X5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdE51bWJlcigxMjM0LjU2KSAvLyBcIjEsMjM0LjU2XCJcbiAgICogZm9ybWF0TnVtYmVyKDAuODUsIHsgc3R5bGU6ICdwZXJjZW50JyB9KSAvLyBcIjg1JVwiXG4gICAqIGZvcm1hdE51bWJlcigxMjM0LjU2LCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogJ0NOWScgfSkgLy8gXCLCpTEsMjM0LjU2XCJcbiAgICovXG4gIGZvcm1hdE51bWJlcih2YWx1ZTogbnVtYmVyLCBvcHRpb25zOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGUsIG9wdGlvbnMpLmZvcm1hdCh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYE51bWJlciBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgdmFsdWUgJHt2YWx1ZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMlui0p+W4gVxuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTph5Hpop1cbiAgICogQHBhcmFtIGN1cnJlbmN5IC0g6LSn5biB5Luj56CB77yM6buY6K6k5Li6IENOWVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOWFtuS7luagvOW8j+WMlumAiemhuVxuICAgKiBAcmV0dXJucyDmoLzlvI/ljJblkI7nmoTotKfluIHlrZfnrKbkuLJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZm9ybWF0Q3VycmVuY3koMTIzNC41NikgLy8gZW4tVVM6IFwiQ07CpTEsMjM0LjU2XCIsIHpoLUNOOiBcIsKlMSwyMzQuNTZcIlxuICAgKiBmb3JtYXRDdXJyZW5jeSgxMjM0LjU2LCAnVVNEJykgLy8gZW4tVVM6IFwiJDEsMjM0LjU2XCIsIHpoLUNOOiBcIlVTJDEsMjM0LjU2XCJcbiAgICovXG4gIGZvcm1hdEN1cnJlbmN5KFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgY3VycmVuY3k6IHN0cmluZyA9ICdDTlknLFxuICAgIG9wdGlvbnM6IE9taXQ8SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zLCAnc3R5bGUnIHwgJ2N1cnJlbmN5Jz4gPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXROdW1iZXIodmFsdWUsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3ksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMlueZvuWIhuavlFxuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTlgLzvvIgwLjg1IOihqOekuiA4NSXvvIlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDmoLzlvI/ljJbpgInpoblcbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE55m+5YiG5q+U5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdFBlcmNlbnQoMC44NSkgLy8gXCI4NSVcIlxuICAgKiBmb3JtYXRQZXJjZW50KDAuODU2NywgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSkgLy8gXCI4NS42NyVcIlxuICAgKi9cbiAgZm9ybWF0UGVyY2VudChcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIG9wdGlvbnM6IE9taXQ8SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zLCAnc3R5bGUnPiA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWJlcih2YWx1ZSwge1xuICAgICAgc3R5bGU6ICdwZXJjZW50JyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW5pel5pyfXG4gICAqIEBwYXJhbSBkYXRlIC0g6KaB5qC85byP5YyW55qE5pel5pyfXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMg5qC85byP6YWN572uXG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOaXpeacn+Wtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXREYXRlKG5ldyBEYXRlKCkpIC8vIGVuLVVTOiBcIjAxLzAxLzIwMjVcIiwgemgtQ046IFwiMjAyNS8wMS8wMVwiXG4gICAqIGZvcm1hdERhdGUobmV3IERhdGUoKSwgeyBkYXRlU3R5bGU6ICdmdWxsJyB9KSAvLyBcIjIwMjTlubQ45pyIMjDml6XmmJ/mnJ/kuoxcIlxuICAgKiBmb3JtYXREYXRlKG5ldyBEYXRlKCksIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJzItZGlnaXQnLCBkYXk6ICcyLWRpZ2l0JyB9KSAvLyDmoLnmja5sb2NhbGXmoLzlvI/ljJZcbiAgICogZm9ybWF0RGF0ZShuZXcgRGF0ZSgpLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJyB9KSAvLyBcIjIwMjTlubQ45pyIXCJcbiAgICovXG4gIGZvcm1hdERhdGUoXG4gICAgZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bWJlcixcbiAgICBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICB9LFxuICApOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICBpZiAoaXNOYU4oZGF0ZU9iai5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlQnlPcHRpb25zKGRhdGVPYmosIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBEYXRlIGZvcm1hdHRpbmcgZmFpbGVkIGZvciBkYXRlICR7ZGF0ZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZyhkYXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW5pel5pyf5ZKM5pe26Ze0XG4gICAqIEBwYXJhbSBkYXRlIC0g6KaB5qC85byP5YyW55qE5pel5pyf5pe26Ze0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMg5qC85byP6YWN572uXG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOaXpeacn+aXtumXtOWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXREYXRlVGltZShuZXcgRGF0ZSgpKSAvLyBlbi1VUzogXCIwMS8wMS8yMDI1LCAxNDozMDowMFwiLCB6aC1DTjogXCIyMDI1LzAxLzAxIDE0OjMwOjAwXCJcbiAgICogZm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSwgeyBkYXRlU3R5bGU6ICdtZWRpdW0nLCB0aW1lU3R5bGU6ICdzaG9ydCcgfSkgLy8gXCIyMDI05bm0OOaciDIw5pelIDE0OjMwXCJcbiAgICogZm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSwgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnMi1kaWdpdCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBzZWNvbmQ6ICcyLWRpZ2l0JywgaG91cjEyOiBmYWxzZSB9KSAvLyDmoLnmja5sb2NhbGXmoLzlvI/ljJZcbiAgICovXG4gIGZvcm1hdERhdGVUaW1lKFxuICAgIGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICB9LFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUoZGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW55u45a+55pe26Ze0XG4gICAqIEBwYXJhbSB2YWx1ZSAtIOaXtumXtOW3ruWAvO+8iOaVsOWtl++8ieaIluaXpeacn+WvueixoVxuICAgKiBAcGFyYW0gdW5pdCAtIOaXtumXtOWNleS9je+8iOW9k3ZhbHVl5Li65pWw5a2X5pe25b+F6aG75o+Q5L6b77yJXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g5qC85byP5YyW6YCJ6aG5XG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOebuOWvueaXtumXtOWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDmiYvliqjmjIflrprljZXkvY1cbiAgICogZm9ybWF0UmVsYXRpdmVUaW1lKC0xLCAnZGF5JykgLy8gZW4tVVM6IFwieWVzdGVyZGF5XCIsIHpoLUNOOiBcIuaYqOWkqVwiXG4gICAqIGZvcm1hdFJlbGF0aXZlVGltZSgyLCAnaG91cicpIC8vIGVuLVVTOiBcImluIDIgaG91cnNcIiwgemgtQ046IFwiMuWwj+aXtuWQjlwiXG4gICAqIGZvcm1hdFJlbGF0aXZlVGltZSgtMzAsICdtaW51dGUnKSAvLyBlbi1VUzogXCIzMCBtaW51dGVzIGFnb1wiLCB6aC1DTjogXCIzMOWIhumSn+WJjVwiXG4gICAqXG4gICAqIC8vIOiHquWKqOiuoeeul+WNleS9jVxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSAtIDYwMDAwKSkgLy8gXCIxIG1pbnV0ZSBhZ29cIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSArIDcyMDAwMDApKSAvLyBcImluIDIgaG91cnNcIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSAtIDg2NDAwMDAwKSkgLy8gXCJ5ZXN0ZXJkYXlcIlxuICAgKi9cbiAgZm9ybWF0UmVsYXRpdmVUaW1lKFxuICAgIHZhbHVlOiBEYXRlLFxuICAgIG9wdGlvbnM/OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMsXG4gICk6IHN0cmluZztcblxuICBmb3JtYXRSZWxhdGl2ZVRpbWUoXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICB1bml0OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQsXG4gICAgb3B0aW9ucz86IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgKTogc3RyaW5nO1xuXG4gIGZvcm1hdFJlbGF0aXZlVGltZShcbiAgICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSxcbiAgICB1bml0T3JPcHRpb25zPzpcbiAgICAgIHwgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0XG4gICAgICB8IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgICBvcHRpb25zOiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG51bWVyaWM6ICdhdXRvJyB9LFxuICApOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBsZXQgZmluYWxWYWx1ZTogbnVtYmVyO1xuICAgICAgbGV0IGZpbmFsVW5pdDogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0O1xuICAgICAgbGV0IGZpbmFsT3B0aW9uczogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIC8vIOiHquWKqOiuoeeul+aXtumXtOW3ruWSjOWNleS9jVxuICAgICAgICBjb25zdCB7IHZhbHVlOiBjYWxjdWxhdGVkVmFsdWUsIHVuaXQ6IGNhbGN1bGF0ZWRVbml0IH0gPVxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVUaW1lKHZhbHVlKTtcbiAgICAgICAgZmluYWxWYWx1ZSA9IGNhbGN1bGF0ZWRWYWx1ZTtcbiAgICAgICAgZmluYWxVbml0ID0gY2FsY3VsYXRlZFVuaXQ7XG4gICAgICAgIGZpbmFsT3B0aW9ucyA9XG4gICAgICAgICAgKHVuaXRPck9wdGlvbnMgYXMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zKSB8fCBvcHRpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5L2/55So5o+Q5L6b55qE5pWw5YC85ZKM5Y2V5L2NXG4gICAgICAgIGZpbmFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZmluYWxVbml0ID0gdW5pdE9yT3B0aW9ucyBhcyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQ7XG4gICAgICAgIGZpbmFsT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIGZpbmFsT3B0aW9ucykuZm9ybWF0KFxuICAgICAgICBmaW5hbFZhbHVlLFxuICAgICAgICBmaW5hbFVuaXQsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmcgZmFpbGVkIGZvciAke3ZhbHVlfTpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgID8gdmFsdWUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUpXG4gICAgICAgIDogYCR7dmFsdWV9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5pel5pyf6K6h566X55u45a+55pe26Ze05beu5YC85ZKM5pyA5ZCI6YCC55qE5Y2V5L2NXG4gICAqIEBwYXJhbSBkYXRlIC0g55uu5qCH5pel5pyfXG4gICAqIEByZXR1cm5zIOWMheWQq+aXtumXtOW3ruWAvOWSjOWNleS9jeeahOWvueixoVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVSZWxhdGl2ZVRpbWUoZGF0ZTogRGF0ZSk6IHtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIHVuaXQ6IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0VW5pdDtcbiAgfSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBkaWZmTXMgPSBkYXRlLmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCk7XG4gICAgY29uc3QgYWJzRGlmZk1zID0gTWF0aC5hYnMoZGlmZk1zKTtcblxuICAgIC8vIOaXtumXtOWNleS9jemYiOWAvO+8iOavq+enku+8iVxuICAgIGNvbnN0IE1JTlVURV9NUyA9IDYwICogMTAwMDtcbiAgICBjb25zdCBIT1VSX01TID0gNjAgKiBNSU5VVEVfTVM7XG4gICAgY29uc3QgREFZX01TID0gMjQgKiBIT1VSX01TO1xuXG4gICAgLy8g5qC55o2u5pe26Ze05beu6YCJ5oup5ZCI6YCC55qE5Y2V5L2N77yM5pyA5aSn5Y2V5L2N5Li6ZGF5XG4gICAgaWYgKGFic0RpZmZNcyA+PSBEQVlfTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIERBWV9NUyksXG4gICAgICAgIHVuaXQ6ICdkYXknLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFic0RpZmZNcyA+PSBIT1VSX01TKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogTWF0aC5yb3VuZChkaWZmTXMgLyBIT1VSX01TKSxcbiAgICAgICAgdW5pdDogJ2hvdXInLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFic0RpZmZNcyA+PSBNSU5VVEVfTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIE1JTlVURV9NUyksXG4gICAgICAgIHVuaXQ6ICdtaW51dGUnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIDEwMDApLFxuICAgICAgdW5pdDogJ3NlY29uZCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7ml6XmnJ/moLzlvI/phY3nva7moLzlvI/ljJbml6XmnJ9cbiAgICog5L2/55So5qCH5YeGIEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zIOehruS/neagvOW8j+WPr+mihOa1i+aAp1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXREYXRlQnlPcHRpb25zKFxuICAgIGRhdGU6IERhdGUsXG4gICAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gICk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSwgb3B0aW9ucykuZm9ybWF0KGRhdGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBEYXRlIGZvcm1hdHRpbmcgZmFpbGVkOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuaXoOaViOivreiogOeOr+Wig1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVJbnZhbGlkTG9jYWxlKCk6IHZvaWQge1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGxvY2FsZXNgIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBjb3JyZWN0bHknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6aqM6K+B6K+t6KiA546v5aKD5piv5ZCm5pyJ5pWIXG4gICAqL1xuICBwcml2YXRlIGlzVmFsaWRMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvY2FsZXMuaW5jbHVkZXMobG9jYWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmo4Dmn6Xph43lpI3nv7vor5HvvIjlvIDlj5HmqKHlvI/vvIlcbiAgICovXG4gIHByaXZhdGUgY2hlY2tGb3JEdXBsaWNhdGVUcmFuc2xhdGlvbnMobmV3VHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnMpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGV4aXN0aW5nVHJhbnNsYXRpb25zIG9mIHRoaXMudHJhbnNsYXRpb25zTGlzdCkge1xuICAgICAgT2JqZWN0LmtleXMobmV3VHJhbnNsYXRpb25zKS5mb3JFYWNoKGxvY2FsZSA9PiB7XG4gICAgICAgIGlmIChleGlzdGluZ1RyYW5zbGF0aW9uc1tsb2NhbGVdKSB7XG4gICAgICAgICAgdGhpcy5jb21wYXJlVHJhbnNsYXRpb25LZXlzKFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgbmV3VHJhbnNsYXRpb25zW2xvY2FsZV0sXG4gICAgICAgICAgICBleGlzdGluZ1RyYW5zbGF0aW9uc1tsb2NhbGVdLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoIflh4bljJbov5znqItVUkxcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplUmVtb3RlVXJsKHJlbW90ZVVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyDmuIXnkIZVUkzvvIjnp7vpmaRoYXNo54mH5q6177yJXG4gICAgcmVtb3RlVXJsID0gaGVhZChyZW1vdGVVcmwuc3BsaXQoLyMvKSkgfHwgcmVtb3RlVXJsO1xuICAgIGNvbnN0IGlzQWJzb2x1dGUgPSBpc0Fic29sdXRlVXJsKHJlbW90ZVVybCk7XG4gICAgY29uc3QgaXNBcGlHYXRlV2F5UmVxdWVzdCA9IHJlbW90ZVVybC5zdGFydHNXaXRoKEFQSV9HQVRFV0FZKTtcblxuICAgIC8vIOW8gOWPkeaooeW8j+S4i+i/m+ihjFVSTOmqjOivgVxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZVJlbW90ZVVybChyZW1vdGVVcmwsIGlzQWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8vIOebuOWvuVVSTOi9rOaNouS4uue7neWvuVVSTFxuICAgIGlmICghaXNBYnNvbHV0ZSAmJiAhaXNBcGlHYXRlV2F5UmVxdWVzdCkge1xuICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuYmFzZUhyZWYuZW5kc1dpdGgoJy8nKVxuICAgICAgICA/IHRoaXMuYmFzZUhyZWZcbiAgICAgICAgOiBgJHt0aGlzLmJhc2VIcmVmfS9gO1xuICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9JHtyZW1vdGVVcmx9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3RlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIOmqjOivgei/nOeoi1VSTO+8iOW8gOWPkeaooeW8j++8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlbW90ZVVybChyZW1vdGVVcmw6IHN0cmluZywgaXNBYnNvbHV0ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghaXNBYnNvbHV0ZSAmJiAoIXRoaXMuYmFzZUhyZWYgfHwgIWlzQWJzb2x1dGVVcmwodGhpcy5iYXNlSHJlZikpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnYWJzb2x1dGUgYmFzZSBocmVmIGlzIHJlcXVpcmVkIGZvciByZWxhdGl2ZSByZW1vdGUgdXJsJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW90ZVVybC5zcGxpdCgnPycpWzBdLmluY2x1ZGVzKCcuLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnZG8gbm90IHVzZSBhbnkgZG90IHdpdGggc2xhc2ggZm9yIHJlbGF0aXZlIHVybCB3aGljaCBzaG91bGQgYWx3YXlzIGJhc2UgZnJvbSBiYXNlIGhyZWYnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu66L+c56iL57+76K+R6K+35rGCXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVJlbW90ZVRyYW5zbGF0aW9uUmVxdWVzdChcbiAgICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPiB7XG4gICAgaWYgKExPQ0FMRV9QTEFDRUhPTERFUl9SRUdFWC50ZXN0KG5vcm1hbGl6ZWRVcmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVNdWx0aUxvY2FsZVJlcXVlc3Qobm9ybWFsaXplZFVybCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZUxvY2FsZVJlcXVlc3Qobm9ybWFsaXplZFVybCk7XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65aSa6K+t6KiA6K+35rGCXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU11bHRpTG9jYWxlUmVxdWVzdChcbiAgICB1cmxUZW1wbGF0ZTogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9ucz4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpcy5vcHRpb25zLmxvY2FsZXMubWFwKGxvY2FsZSA9PlxuICAgICAgdGhpcy5mZXRjaFRyYW5zbGF0aW9uKHVybFRlbXBsYXRlLCBsb2NhbGUpLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvb3NlTG9jYWxlID0gZ2V0TG9vc2VMb2NhbGUobG9jYWxlKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbG9vc2VMb2NhbGUgIT09IGxvY2FsZSAmJlxuICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLmxvY2FsZXMuaW5jbHVkZXMobG9vc2VMb2NhbGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hUcmFuc2xhdGlvbih1cmxUZW1wbGF0ZSwgbG9vc2VMb2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXNEZXZNb2RlKCkgPyB0aHJvd0Vycm9yKCgpID0+IGVycm9yKSA6IEVNUFRZO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKGlzUGxhaW5PYmplY3QpLFxuICAgICAgICBtYXAoXG4gICAgICAgICAgKHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbikgPT5cbiAgICAgICAgICAgICh7IFtsb2NhbGVdOiB0cmFuc2xhdGlvbiB9KSBhcyBUcmFuc2xhdGlvbnMsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpLnBpcGUoXG4gICAgICBtYXAocmVzdWx0cyA9PlxuICAgICAgICByZXN1bHRzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBPYmplY3QuYXNzaWduKGFjYywgY3VyciksIHt9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rljZXor63oqIDor7fmsYJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2luZ2xlTG9jYWxlUmVxdWVzdCh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPiB7XG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh1cmwpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IChpc0Rldk1vZGUoKSA/IHRocm93RXJyb3IoKCkgPT4gZXJyb3IpIDogRU1QVFkpKSxcbiAgICApIGFzIE9ic2VydmFibGU8VHJhbnNsYXRpb25zPjtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiafooYznv7vor5Hor7fmsYJcbiAgICovXG4gIHByaXZhdGUgcGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaXNKU09OID0gdXJsLmVuZHNXaXRoKCcuanNvbicpO1xuICAgIGNvbnN0IGlzQXBpR2F0ZVdheVJlcXVlc3QgPSB1cmwuc3RhcnRzV2l0aChBUElfR0FURVdBWSk7XG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gaXNKU09OID8gJ2pzb24nIDogJ3RleHQnO1xuXG4gICAgaWYgKGlzQXBpR2F0ZVdheVJlcXVlc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgLnJlcXVlc3QoJ0dFVCcsIHVybCwgeyByZXNwb25zZVR5cGUgfSlcbiAgICAgICAgLnBpcGUobWFwKGJvZHkgPT4gKGlzSlNPTiA/IGJvZHkgOiBwYXJzZShib2R5KSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWpheCh7IHVybCwgcmVzcG9uc2VUeXBlIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgcmVzcG9uc2UgfSkgPT4gKGlzSlNPTiA/IHJlc3BvbnNlIDogcGFyc2UocmVzcG9uc2UgYXMgc3RyaW5nKSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6aqM6K+BZmV0Y2hUcmFuc2xhdGlvbuWPguaVsFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZldGNoVHJhbnNsYXRpb25QYXJhbXMoXG4gICAgcmVtb3RlVXJsOiBzdHJpbmcsXG4gICAgbG9jYWxlPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgTE9DQUxFX1BMQUNFSE9MREVSX1JFR0VYLnRlc3QocmVtb3RlVXJsKSAmJiAhbG9jYWxlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnYGxvY2FsZWAgaXMgcmVxdWlyZWQgc2luY2UgdGhlIHByb3ZpZGVkIHJlbW90ZSB1cmwgY29udGFpbnMgbG9jYWxlIHBsYWNlaG9sZGVyJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/h+mUruafpeaJvue/u+ivkeaWh+acrFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbkJ5S2V5KGtleTogc3RyaW5nLCBsb2NhbGUgPSB0aGlzLmxvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8gMSkg57K+56Gu5Yy56YWN5b2T5YmNIGxvY2FsZVxuICAgIGxldCB2YWx1ZSA9IHRoaXMuZmluZEluQWxsVHJhbnNsYXRpb25zKGtleSwgbG9jYWxlKTtcblxuICAgIC8vIDIpIOWuveadvuWMuemFjeW9k+WJjSBsb2NhbGXvvIjlpoIgemgtQ04gLT4gemjvvIlcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgIGNvbnN0IGxvb3NlID0gZ2V0TG9vc2VMb2NhbGUobG9jYWxlKTtcbiAgICAgIGlmIChsb29zZSAhPT0gbG9jYWxlKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5maW5kSW5BbGxUcmFuc2xhdGlvbnMoa2V5LCBsb29zZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMykg5Zue6YCA5YiwIGZhbGxiYWNrTG9jYWxlXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbG9jYWxlICE9PSB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGUpIHtcbiAgICAgIGNvbnN0IGZiID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlO1xuICAgICAgdmFsdWUgPSB0aGlzLmZpbmRJbkFsbFRyYW5zbGF0aW9ucyhrZXksIGZiKTtcblxuICAgICAgLy8gNCkg5a695p2+5Yy56YWN5Zue6YCAIGxvY2FsZVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgdGhpcy5vcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIGNvbnN0IGZiTG9vc2UgPSBnZXRMb29zZUxvY2FsZShmYik7XG4gICAgICAgIGlmIChmYkxvb3NlICE9PSBmYikge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5maW5kSW5BbGxUcmFuc2xhdGlvbnMoa2V5LCBmYkxvb3NlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA/PyBrZXk7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5omA5pyJ57+76K+R5rqQ5Lit5p+l5om+6ZSu5YC8XG4gICAqL1xuICBwcml2YXRlIGZpbmRJbkFsbFRyYW5zbGF0aW9ucyhcbiAgICBrZXk6IHN0cmluZyxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyDov5znqIvnv7vor5HkvJjlhYjnuqfmm7Tpq5hcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maW5kSW5UcmFuc2xhdGlvbnNMaXN0KGtleSwgbG9jYWxlLCB0aGlzLnJlbW90ZVRyYW5zbGF0aW9uc0xpc3QpID8/XG4gICAgICB0aGlzLmZpbmRJblRyYW5zbGF0aW9uc0xpc3Qoa2V5LCBsb2NhbGUsIHRoaXMudHJhbnNsYXRpb25zTGlzdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOe/u+ivkeWIl+ihqOS4reafpeaJvumUruWAvFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kSW5UcmFuc2xhdGlvbnNMaXN0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uc0xpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNsYXRpb25zTGlzdD8ubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8g5ZCO5Yqg5YWl55qE5LyY5YWI57qn5pu06auYXG4gICAgZm9yIChsZXQgaSA9IHRyYW5zbGF0aW9uc0xpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maW5kSW5UcmFuc2xhdGlvbihrZXksIGxvY2FsZSwgdHJhbnNsYXRpb25zTGlzdFtpXSk7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOWNleS4que/u+ivkeWvueixoeS4reafpeaJvumUruWAvFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kSW5UcmFuc2xhdGlvbihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb2NhbGVEYXRhID0gdHJhbnNsYXRpb25zW2xvY2FsZV07XG4gICAgaWYgKCFsb2NhbGVEYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdmFsdWUgPSBnZXQobG9jYWxlRGF0YSwga2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52YWxpZGF0ZVRyYW5zbGF0aW9uVmFsdWUodmFsdWUsIGxvY2FsZSwga2V5KTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7jlRyYW5zbGF0aW9u5a+56LGh5Lit6I635Y+W57+76K+R5YC877yI5pSv5oyB5a695p2+5Yy56YWN5ZKM5Zue6YCA6YC76L6R77yJXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zbGF0aW9uQnlPYmplY3QoXG4gICAgc291cmNlOiBUcmFuc2xhdGlvbixcbiAgICBsb2NhbGUgPSB0aGlzLmxvY2FsZSxcbiAgKTogVHJhbnNsYXRpb25WYWx1ZSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyAxKSDnsr7noa7ljLnphY3lvZPliY0gbG9jYWxlXG4gICAgaWYgKGhhcyhzb3VyY2UsIGxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2VbbG9jYWxlXTtcbiAgICB9XG5cbiAgICAvLyAyKSDlrr3mnb7ljLnphY3lvZPliY0gbG9jYWxl77yI5aaCIHpoLUNOIC0+IHpo77yJXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb29zZSkge1xuICAgICAgY29uc3QgbG9vc2UgPSBnZXRMb29zZUxvY2FsZShsb2NhbGUpO1xuICAgICAgaWYgKGxvb3NlICE9PSBsb2NhbGUgJiYgaGFzKHNvdXJjZSwgbG9vc2UpKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2VbbG9vc2VdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMpIOWbnumAgOWIsCBmYWxsYmFja0xvY2FsZVxuICAgIGNvbnN0IGZiID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlO1xuICAgIGlmIChmYiAhPT0gbG9jYWxlICYmIGhhcyhzb3VyY2UsIGZiKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZVtmYl07XG4gICAgfVxuXG4gICAgLy8gNCkg5a695p2+5Yy56YWN5Zue6YCAIGxvY2FsZVxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgIGNvbnN0IGZiTG9vc2UgPSBnZXRMb29zZUxvY2FsZShmYik7XG4gICAgICBpZiAoZmJMb29zZSAhPT0gZmIgJiYgaGFzKHNvdXJjZSwgZmJMb29zZSkpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVtmYkxvb3NlXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOmqjOivgee/u+ivkeWAvO+8iOW8gOWPkeaooeW8j++8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zbGF0aW9uVmFsdWUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgaXNEZXZNb2RlKCkgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBnZXQodmFsdWUsIFN5bWJvbC50b1ByaW1pdGl2ZSkgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFRoZSB0cmFuc2xhdGlvbiBmb3IgbG9jYWxlOiBcXGAke2xvY2FsZX1cXGAgYW5kIGtleTpcXGAke2tleX1cXGAgaXMgYW4gb2JqZWN0LCB3aGljaCBjb3VsZCBiZSB1bmV4cGVjdGVkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOavlOi+g+e/u+ivkemUru+8iOW8gOWPkeaooeW8j+S4i+ajgOafpemHjeWkje+8iVxuICAgKi9cbiAgcHJpdmF0ZSBjb21wYXJlVHJhbnNsYXRpb25LZXlzKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbixcbiAgICBwcmV2VHJhbnNsYXRpb246IFRyYW5zbGF0aW9uLFxuICAgIHBhdGg6IHN0cmluZ1tdID0gW10sXG4gICk6IHZvaWQge1xuICAgIGlmICh0cmFuc2xhdGlvbiA9PSBudWxsIHx8IHByZXZUcmFuc2xhdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb24pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKCFoYXMocHJldlRyYW5zbGF0aW9uLCBrZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldlZhbHVlID0gcHJldlRyYW5zbGF0aW9uW2tleV07XG4gICAgICBjb25zdCB2YWx1ZUlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZUlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0KHByZXZWYWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZUlzUGxhaW5PYmplY3QgJiYgcHJldlZhbHVlSXNQbGFpbk9iamVjdCkge1xuICAgICAgICB0aGlzLmNvbXBhcmVUcmFuc2xhdGlvbktleXMoXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHZhbHVlIGFzIFRyYW5zbGF0aW9uLFxuICAgICAgICAgIHByZXZWYWx1ZSBhcyBUcmFuc2xhdGlvbixcbiAgICAgICAgICBbLi4ucGF0aCwga2V5XSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlSXNQbGFpbk9iamVjdCAmJiAhcHJldlZhbHVlSXNQbGFpbk9iamVjdCkge1xuICAgICAgICBjb25zdCBvdXRwdXRQYXRoID0gWy4uLnBhdGgsIGtleV0uam9pbignIC0+ICcpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHByZXZWYWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBUaGUgY3VzdG9taXplZCB0cmFuc2xhdGlvbiBmb3IgbG9jYWxlOiBcXGAke2xvY2FsZX1cXGAgYW5kIHBhdGg6IFxcYCR7b3V0cHV0UGF0aH1cXGAgaXMgZHVwbGljYXRlZCB3aXRoIHRoZSBvdGhlciB0cmFuc2xhdGlvbiwgcGxlYXNlIHJlbW92ZSBpdCBpbiB5b3VyIHRyYW5zbGF0aW9uIGZpbGUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBUd28ga2V5cyB0aGF0IHRoZSBsb2NhbGUgaXMgXFxgJHtsb2NhbGV9XFxgIGFuZCB0aGUgcGF0aCBpcyBcXGAke291dHB1dFBhdGh9XFxgIGFyZSBzYW1lLCBidXQgdGhlaXIgdmFsdWVzIGFyZSBub3QgZXF1YWwsIHBsZWFzZSByZW1vdmUgb25lIG9mIHRoZW0gb3IgY2hhbmdlIG9uZSBvZiB0aGUga2V5cy5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19