@vendure/admin-ui 2.0.0-next.10 → 2.0.0-next.13

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 (173) hide show
  1. package/catalog/components/generate-product-variants/generate-product-variants.component.d.ts +3 -3
  2. package/catalog/components/option-value-input/option-value-input.component.d.ts +21 -9
  3. package/catalog/components/product-variants-editor/product-variants-editor.component.d.ts +10 -3
  4. package/core/common/generated-types.d.ts +242 -127
  5. package/core/common/utilities/configurable-operation-utils.d.ts +4 -2
  6. package/core/common/version.d.ts +1 -1
  7. package/core/data/definitions/order-definitions.d.ts +2 -0
  8. package/core/data/definitions/product-definitions.d.ts +1 -0
  9. package/core/data/providers/order-data.service.d.ts +1 -0
  10. package/core/data/providers/product-data.service.d.ts +1 -0
  11. package/core/public_api.d.ts +11 -1
  12. package/core/shared/components/custom-field-control/custom-field-control.component.d.ts +6 -2
  13. package/core/shared/components/dropdown/dropdown-menu.component.d.ts +2 -1
  14. package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.d.ts +31 -0
  15. package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.d.ts +34 -0
  16. package/core/shared/components/rich-text-editor/prosemirror/custom-nodes.d.ts +4 -0
  17. package/core/shared/components/rich-text-editor/prosemirror/inputrules.d.ts +5 -5
  18. package/core/shared/components/rich-text-editor/prosemirror/menu/links.d.ts +1 -1
  19. package/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.d.ts +12 -0
  20. package/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.d.ts +9 -0
  21. package/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.d.ts +14 -0
  22. package/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.d.ts +7 -0
  23. package/core/shared/components/rich-text-editor/prosemirror/plugins/link-select-plugin.d.ts +1 -1
  24. package/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.d.ts +7 -0
  25. package/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.d.ts +13 -0
  26. package/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.d.ts +7 -3
  27. package/core/shared/components/rich-text-editor/prosemirror/types.d.ts +0 -2
  28. package/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.d.ts +21 -0
  29. package/core/shared/components/rich-text-editor/rich-text-editor.component.d.ts +6 -2
  30. package/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.d.ts +30 -0
  31. package/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.d.ts +22 -0
  32. package/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.d.ts +5 -17
  33. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +3 -1
  34. package/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.d.ts +10 -2
  35. package/core/shared/pipes/custom-field-label.pipe.d.ts +4 -10
  36. package/core/shared/shared.module.d.ts +33 -30
  37. package/customer/components/customer-group-list/customer-group-list.component.d.ts +6 -4
  38. package/esm2020/catalog/components/assets/assets.component.mjs +1 -1
  39. package/esm2020/catalog/components/collection-detail/collection-detail.component.mjs +1 -1
  40. package/esm2020/catalog/components/collection-tree/collection-tree-node.component.mjs +2 -2
  41. package/esm2020/catalog/components/facet-detail/facet-detail.component.mjs +1 -1
  42. package/esm2020/catalog/components/facet-list/facet-list.component.mjs +1 -1
  43. package/esm2020/catalog/components/generate-product-variants/generate-product-variants.component.mjs +12 -4
  44. package/esm2020/catalog/components/option-value-input/option-value-input.component.mjs +65 -11
  45. package/esm2020/catalog/components/product-list/product-list.component.mjs +1 -1
  46. package/esm2020/catalog/components/product-variants-editor/product-variants-editor.component.mjs +107 -12
  47. package/esm2020/core/common/generated-types.mjs +2 -1
  48. package/esm2020/core/common/introspection-result.mjs +191 -255
  49. package/esm2020/core/common/utilities/configurable-operation-utils.mjs +13 -10
  50. package/esm2020/core/common/version.mjs +2 -2
  51. package/esm2020/core/components/app-shell/app-shell.component.mjs +2 -2
  52. package/esm2020/core/components/channel-switcher/channel-switcher.component.mjs +1 -1
  53. package/esm2020/core/components/main-nav/main-nav.component.mjs +2 -2
  54. package/esm2020/core/components/user-menu/user-menu.component.mjs +1 -1
  55. package/esm2020/core/data/definitions/order-definitions.mjs +39 -25
  56. package/esm2020/core/data/definitions/product-definitions.mjs +743 -735
  57. package/esm2020/core/data/providers/order-data.service.mjs +7 -2
  58. package/esm2020/core/data/providers/product-data.service.mjs +5 -2
  59. package/esm2020/core/public_api.mjs +12 -2
  60. package/esm2020/core/shared/components/asset-preview-links/asset-preview-links.component.mjs +1 -1
  61. package/esm2020/core/shared/components/custom-field-control/custom-field-control.component.mjs +10 -4
  62. package/esm2020/core/shared/components/data-table/data-table.component.mjs +3 -3
  63. package/esm2020/core/shared/components/datetime-picker/datetime-picker.component.mjs +1 -1
  64. package/esm2020/core/shared/components/dropdown/dropdown-menu.component.mjs +25 -22
  65. package/esm2020/core/shared/components/dropdown/dropdown-trigger.directive.mjs +1 -1
  66. package/esm2020/core/shared/components/entity-info/entity-info.component.mjs +1 -1
  67. package/esm2020/core/shared/components/facet-value-selector/facet-value-selector.component.mjs +1 -1
  68. package/esm2020/core/shared/components/history-entry-detail/history-entry-detail.component.mjs +1 -1
  69. package/esm2020/core/shared/components/language-selector/language-selector.component.mjs +1 -1
  70. package/esm2020/core/shared/components/rich-text-editor/external-image-dialog/external-image-dialog.component.mjs +3 -3
  71. package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.mjs +132 -0
  72. package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.mjs +46 -0
  73. package/esm2020/core/shared/components/rich-text-editor/prosemirror/custom-nodes.mjs +57 -0
  74. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/links.mjs +4 -4
  75. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.mjs +22 -1
  76. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.mjs +12 -0
  77. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu.mjs +73 -18
  78. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.mjs +16 -0
  79. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.mjs +100 -0
  80. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.mjs +96 -0
  81. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.mjs +166 -0
  82. package/esm2020/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.mjs +42 -16
  83. package/esm2020/core/shared/components/rich-text-editor/prosemirror/types.mjs +1 -1
  84. package/esm2020/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.mjs +59 -0
  85. package/esm2020/core/shared/components/rich-text-editor/rich-text-editor.component.mjs +14 -7
  86. package/esm2020/core/shared/components/ui-extension-point/ui-extension-point.component.mjs +1 -1
  87. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.mjs +57 -0
  88. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.mjs +63 -0
  89. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.mjs +48 -83
  90. package/esm2020/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.mjs +1 -1
  91. package/esm2020/core/shared/dynamic-form-inputs/register-dynamic-input-components.mjs +3 -1
  92. package/esm2020/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.mjs +21 -11
  93. package/esm2020/core/shared/pipes/custom-field-label.pipe.mjs +7 -19
  94. package/esm2020/core/shared/shared.module.mjs +15 -3
  95. package/esm2020/customer/components/address-card/address-card.component.mjs +1 -1
  96. package/esm2020/customer/components/customer-group-list/customer-group-list.component.mjs +29 -15
  97. package/esm2020/customer/components/customer-history/customer-history.component.mjs +1 -1
  98. package/esm2020/customer/components/customer-list/customer-list.component.mjs +1 -1
  99. package/esm2020/dashboard/components/dashboard/dashboard.component.mjs +1 -1
  100. package/esm2020/marketing/components/promotion-detail/promotion-detail.component.mjs +1 -1
  101. package/esm2020/marketing/components/promotion-list/promotion-list.component.mjs +1 -1
  102. package/esm2020/order/components/fulfill-order-dialog/fulfill-order-dialog.component.mjs +6 -2
  103. package/esm2020/order/components/fulfillment-card/fulfillment-card.component.mjs +1 -1
  104. package/esm2020/order/components/fulfillment-detail/fulfillment-detail.component.mjs +8 -17
  105. package/esm2020/order/components/line-fulfillment/line-fulfillment.component.mjs +8 -22
  106. package/esm2020/order/components/order-custom-fields-card/order-custom-fields-card.component.mjs +30 -6
  107. package/esm2020/order/components/order-detail/order-detail.component.mjs +79 -39
  108. package/esm2020/order/components/order-history/order-history.component.mjs +1 -1
  109. package/esm2020/order/components/order-list/order-list.component.mjs +23 -16
  110. package/esm2020/order/components/order-payment-card/order-payment-card.component.mjs +3 -3
  111. package/esm2020/order/components/order-table/order-table.component.mjs +11 -3
  112. package/esm2020/order/components/refund-order-dialog/refund-order-dialog.component.mjs +1 -1
  113. package/esm2020/settings/components/administrator-list/administrator-list.component.mjs +1 -1
  114. package/esm2020/settings/components/channel-list/channel-list.component.mjs +1 -1
  115. package/esm2020/settings/components/country-list/country-list.component.mjs +1 -1
  116. package/esm2020/settings/components/payment-method-detail/payment-method-detail.component.mjs +1 -1
  117. package/esm2020/settings/components/payment-method-list/payment-method-list.component.mjs +1 -1
  118. package/esm2020/settings/components/role-list/role-list.component.mjs +1 -1
  119. package/esm2020/settings/components/shipping-method-detail/shipping-method-detail.component.mjs +1 -1
  120. package/esm2020/settings/components/shipping-method-list/shipping-method-list.component.mjs +1 -1
  121. package/esm2020/settings/components/tax-category-list/tax-category-list.component.mjs +1 -1
  122. package/esm2020/settings/components/tax-rate-list/tax-rate-list.component.mjs +1 -1
  123. package/esm2020/settings/components/zone-list/zone-list.component.mjs +1 -1
  124. package/esm2020/system/components/job-list/job-list.component.mjs +1 -1
  125. package/fesm2015/vendure-admin-ui-catalog.mjs +192 -28
  126. package/fesm2015/vendure-admin-ui-catalog.mjs.map +1 -1
  127. package/fesm2015/vendure-admin-ui-core.mjs +1988 -1208
  128. package/fesm2015/vendure-admin-ui-core.mjs.map +1 -1
  129. package/fesm2015/vendure-admin-ui-customer.mjs +29 -17
  130. package/fesm2015/vendure-admin-ui-customer.mjs.map +1 -1
  131. package/fesm2015/vendure-admin-ui-dashboard.mjs +1 -1
  132. package/fesm2015/vendure-admin-ui-marketing.mjs +2 -2
  133. package/fesm2015/vendure-admin-ui-order.mjs +164 -104
  134. package/fesm2015/vendure-admin-ui-order.mjs.map +1 -1
  135. package/fesm2015/vendure-admin-ui-settings.mjs +11 -11
  136. package/fesm2015/vendure-admin-ui-system.mjs +1 -1
  137. package/fesm2020/vendure-admin-ui-catalog.mjs +185 -28
  138. package/fesm2020/vendure-admin-ui-catalog.mjs.map +1 -1
  139. package/fesm2020/vendure-admin-ui-core.mjs +1986 -1212
  140. package/fesm2020/vendure-admin-ui-core.mjs.map +1 -1
  141. package/fesm2020/vendure-admin-ui-customer.mjs +29 -17
  142. package/fesm2020/vendure-admin-ui-customer.mjs.map +1 -1
  143. package/fesm2020/vendure-admin-ui-dashboard.mjs +1 -1
  144. package/fesm2020/vendure-admin-ui-marketing.mjs +2 -2
  145. package/fesm2020/vendure-admin-ui-order.mjs +162 -103
  146. package/fesm2020/vendure-admin-ui-order.mjs.map +1 -1
  147. package/fesm2020/vendure-admin-ui-settings.mjs +11 -11
  148. package/fesm2020/vendure-admin-ui-system.mjs +1 -1
  149. package/order/components/order-custom-fields-card/order-custom-fields-card.component.d.ts +4 -2
  150. package/order/components/order-list/order-list.component.d.ts +1 -0
  151. package/order/components/order-table/order-table.component.d.ts +1 -0
  152. package/package.json +13 -12
  153. package/static/i18n-messages/cs.json +6 -3
  154. package/static/i18n-messages/de.json +6 -3
  155. package/static/i18n-messages/en.json +7 -3
  156. package/static/i18n-messages/es.json +6 -3
  157. package/static/i18n-messages/fr.json +6 -3
  158. package/static/i18n-messages/it.json +6 -3
  159. package/static/i18n-messages/pl.json +6 -3
  160. package/static/i18n-messages/pt_BR.json +6 -3
  161. package/static/i18n-messages/pt_PT.json +6 -3
  162. package/static/i18n-messages/ru.json +6 -3
  163. package/static/i18n-messages/uk.json +6 -3
  164. package/static/i18n-messages/zh_Hans.json +6 -3
  165. package/static/i18n-messages/zh_Hant.json +6 -3
  166. package/static/styles/_variables.scss +3 -0
  167. package/static/styles/global/_sass-overrides.scss +3 -0
  168. package/static/styles/global/_utilities.scss +1 -0
  169. package/static/styles/styles.scss +1 -0
  170. package/static/styles/ui-extension-theme.scss +1 -0
  171. package/static/theme.min.css +1 -1
  172. package/core/shared/components/rich-text-editor/prosemirror/menu/images.d.ts +0 -4
  173. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/images.mjs +0 -36
@@ -1,12 +1,12 @@
1
1
  import { ChangeDetectionStrategy, Component } from '@angular/core';
2
2
  import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
3
- import { getDefaultUiLanguage, } from '@vendure/admin-ui/core';
3
+ import { DeletionResult, getDefaultUiLanguage, } from '@vendure/admin-ui/core';
4
4
  import { normalizeString } from '@vendure/common/lib/normalize-string';
5
5
  import { pick } from '@vendure/common/lib/pick';
6
6
  import { generateAllCombinations, notNullOrUndefined } from '@vendure/common/lib/shared-utils';
7
7
  import { unique } from '@vendure/common/lib/unique';
8
8
  import { EMPTY, forkJoin, of } from 'rxjs';
9
- import { filter, map, mergeMap, switchMap } from 'rxjs/operators';
9
+ import { defaultIfEmpty, filter, map, mergeMap, switchMap } from 'rxjs/operators';
10
10
  import { ConfirmVariantDeletionDialogComponent } from '../confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/router";
@@ -32,6 +32,7 @@ export class ProductVariantsEditorComponent {
32
32
  this.notificationService = notificationService;
33
33
  this.modalService = modalService;
34
34
  this.formValueChanged = false;
35
+ this.optionsChanged = false;
35
36
  this.generatedVariants = [];
36
37
  }
37
38
  ngOnInit() {
@@ -57,16 +58,102 @@ export class ProductVariantsEditorComponent {
57
58
  ? _('catalog.default-variant')
58
59
  : variant.options.map(o => o.name).join(' ');
59
60
  }
60
- addOption() {
61
+ addOptionGroup() {
61
62
  this.optionGroups.push({
62
63
  isNew: true,
64
+ locked: false,
63
65
  name: '',
64
66
  values: [],
65
67
  });
68
+ this.optionsChanged = true;
66
69
  }
67
- removeOption(optionGroup) {
68
- this.optionGroups = this.optionGroups.filter(og => og !== optionGroup);
70
+ removeOptionGroup(optionGroup) {
71
+ const id = optionGroup.id;
72
+ if (optionGroup.isNew) {
73
+ this.optionGroups = this.optionGroups.filter(og => og !== optionGroup);
74
+ this.generateVariants();
75
+ this.optionsChanged = true;
76
+ }
77
+ else if (id) {
78
+ this.modalService
79
+ .dialog({
80
+ title: _('catalog.confirm-delete-product-option-group'),
81
+ translationVars: { name: optionGroup.name },
82
+ buttons: [
83
+ { type: 'secondary', label: _('common.cancel') },
84
+ { type: 'danger', label: _('common.delete'), returnValue: true },
85
+ ],
86
+ })
87
+ .pipe(switchMap(val => {
88
+ if (val) {
89
+ return this.dataService.product.removeOptionGroupFromProduct({
90
+ optionGroupId: id,
91
+ productId: this.product.id,
92
+ });
93
+ }
94
+ else {
95
+ return EMPTY;
96
+ }
97
+ }))
98
+ .subscribe(({ removeOptionGroupFromProduct }) => {
99
+ if (removeOptionGroupFromProduct.__typename === 'Product') {
100
+ this.notificationService.success(_('common.notify-delete-success'), {
101
+ entity: 'ProductOptionGroup',
102
+ });
103
+ this.initOptionsAndVariants();
104
+ this.optionsChanged = true;
105
+ }
106
+ else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {
107
+ this.notificationService.error(removeOptionGroupFromProduct.message ?? '');
108
+ }
109
+ });
110
+ }
111
+ }
112
+ addOption(groupId, optionName) {
113
+ this.optionGroups.find(g => g.id === groupId)?.values.push({ name: optionName, locked: false });
69
114
  this.generateVariants();
115
+ this.optionsChanged = true;
116
+ }
117
+ removeOption(groupId, { id, name }) {
118
+ const optionGroup = this.optionGroups.find(g => g.id === groupId);
119
+ if (optionGroup) {
120
+ if (!id) {
121
+ optionGroup.values = optionGroup.values.filter(v => v.name !== name);
122
+ this.generateVariants();
123
+ }
124
+ else {
125
+ this.modalService
126
+ .dialog({
127
+ title: _('catalog.confirm-delete-product-option'),
128
+ translationVars: { name },
129
+ buttons: [
130
+ { type: 'secondary', label: _('common.cancel') },
131
+ { type: 'danger', label: _('common.delete'), returnValue: true },
132
+ ],
133
+ })
134
+ .pipe(switchMap(val => {
135
+ if (val) {
136
+ return this.dataService.product.deleteProductOption(id);
137
+ }
138
+ else {
139
+ return EMPTY;
140
+ }
141
+ }))
142
+ .subscribe(({ deleteProductOption }) => {
143
+ if (deleteProductOption.result === DeletionResult.DELETED) {
144
+ this.notificationService.success(_('common.notify-delete-success'), {
145
+ entity: 'ProductOption',
146
+ });
147
+ optionGroup.values = optionGroup.values.filter(v => v.id !== id);
148
+ this.generateVariants();
149
+ this.optionsChanged = true;
150
+ }
151
+ else {
152
+ this.notificationService.error(deleteProductOption.message ?? '');
153
+ }
154
+ });
155
+ }
156
+ }
70
157
  }
71
158
  generateVariants() {
72
159
  const groups = this.optionGroups.map(g => g.values);
@@ -107,10 +194,11 @@ export class ProductVariantsEditorComponent {
107
194
  stock: 0,
108
195
  };
109
196
  }
110
- deleteVariant(id) {
197
+ deleteVariant(id, options) {
111
198
  this.modalService
112
199
  .dialog({
113
200
  title: _('catalog.confirm-delete-product-variant'),
201
+ translationVars: { name: options.map(o => o.name).join(' ') },
114
202
  buttons: [
115
203
  { type: 'secondary', label: _('common.cancel') },
116
204
  { type: 'danger', label: _('common.delete'), returnValue: true },
@@ -145,12 +233,14 @@ export class ProductVariantsEditorComponent {
145
233
  count: variants.length,
146
234
  });
147
235
  this.initOptionsAndVariants();
236
+ this.optionsChanged = false;
148
237
  },
149
238
  });
150
239
  }
151
240
  checkUniqueSkus() {
152
241
  const withDuplicateSkus = this.generatedVariants.filter((variant, index) => {
153
- return this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant);
242
+ return (variant.enabled &&
243
+ this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant));
154
244
  });
155
245
  if (withDuplicateSkus.length) {
156
246
  return this.modalService
@@ -233,7 +323,7 @@ export class ProductVariantsEditorComponent {
233
323
  return forkJoin(groupsIds.map(id => this.dataService.product
234
324
  .getProductOptionGroup(id)
235
325
  .mapSingle(data => data.productOptionGroup)
236
- .pipe(filter(notNullOrUndefined))));
326
+ .pipe(filter(notNullOrUndefined)))).pipe(defaultIfEmpty([]));
237
327
  }
238
328
  createNewProductVariants(groups) {
239
329
  const options = groups
@@ -281,15 +371,20 @@ export class ProductVariantsEditorComponent {
281
371
  .mapSingle(({ product }) => product)
282
372
  .subscribe(p => {
283
373
  this.product = p;
374
+ const allUsedOptionIds = p.variants.map(v => v.options.map(option => option.id)).flat();
375
+ const allUsedOptionGroupIds = p.variants
376
+ .map(v => v.options.map(option => option.groupId))
377
+ .flat();
284
378
  this.optionGroups = p.optionGroups.map(og => {
285
379
  return {
286
380
  id: og.id,
287
381
  isNew: false,
288
382
  name: og.name,
383
+ locked: allUsedOptionGroupIds.includes(og.id),
289
384
  values: og.options.map(o => ({
290
385
  id: o.id,
291
386
  name: o.name,
292
- locked: true,
387
+ locked: allUsedOptionIds.includes(o.id),
293
388
  })),
294
389
  };
295
390
  });
@@ -310,9 +405,9 @@ export class ProductVariantsEditorComponent {
310
405
  }
311
406
  }
312
407
  ProductVariantsEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ProductVariantsEditorComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.DataService }, { token: i3.ProductDetailService }, { token: i2.NotificationService }, { token: i2.ModalService }], target: i0.ɵɵFactoryTarget.Component });
313
- ProductVariantsEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: ProductVariantsEditorComponent, selector: "vdr-product-variants-editor", ngImport: i0, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!formValueChanged || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button *ngIf=\"group.isNew\" class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOption(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button\r\n class=\"btn btn-primary-outline btn-sm\"\r\n (click)=\"addOption()\"\r\n>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.create' | translate }}</th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"!variant.existing\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"], components: [{ type: i2.ActionBarComponent, selector: "vdr-action-bar" }, { type: i2.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { type: i4.OptionValueInputComponent, selector: "vdr-option-value-input", inputs: ["groupName"] }, { type: i5.ClrInputContainer, selector: "clr-input-container" }, { type: i2.CurrencyInputComponent, selector: "vdr-currency-input", inputs: ["disabled", "readonly", "value", "currencyCode"], outputs: ["valueChange"] }, { type: i2.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i2.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.ClrLabel, selector: "label", inputs: ["for"] }, { type: i2.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.ClrInput, selector: "[clrInput]" }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.ClrIconCustomTag, selector: "clr-icon" }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i5.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i2.DropdownItemDirective, selector: "[vdrDropdownItem]" }], pipes: { "translate": i8.TranslatePipe, "localeCurrency": i2.LocaleCurrencyPipe }, changeDetection: i0.ChangeDetectionStrategy.Default });
408
+ ProductVariantsEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: ProductVariantsEditorComponent, selector: "vdr-product-variants-editor", ngImport: i0, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(!formValueChanged && !optionsChanged) || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [options]=\"group.values\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n (add)=\"addOption(group.id, $event.name)\"\r\n (remove)=\"removeOption(group.id, $event)\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button\r\n [disabled]=\"group.locked\"\r\n class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td class=\"left\">\r\n <clr-checkbox-wrapper *ngIf=\"!variant.existing\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n <label>{{ 'common.create' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId, variant.options)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"], components: [{ type: i2.ActionBarComponent, selector: "vdr-action-bar" }, { type: i2.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { type: i4.OptionValueInputComponent, selector: "vdr-option-value-input", inputs: ["groupName", "options", "disabled"], outputs: ["add", "remove", "edit"] }, { type: i5.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { type: i5.ClrInputContainer, selector: "clr-input-container" }, { type: i2.CurrencyInputComponent, selector: "vdr-currency-input", inputs: ["disabled", "readonly", "value", "currencyCode"], outputs: ["valueChange"] }, { type: i2.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i2.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition", "customClasses"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.ClrLabel, selector: "label", inputs: ["for"] }, { type: i2.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.ClrInput, selector: "[clrInput]" }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.ClrIconCustomTag, selector: "clr-icon" }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i5.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i2.DropdownItemDirective, selector: "[vdrDropdownItem]" }], pipes: { "translate": i8.TranslatePipe, "localeCurrency": i2.LocaleCurrencyPipe }, changeDetection: i0.ChangeDetectionStrategy.Default });
314
409
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ProductVariantsEditorComponent, decorators: [{
315
410
  type: Component,
316
- args: [{ selector: 'vdr-product-variants-editor', changeDetection: ChangeDetectionStrategy.Default, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!formValueChanged || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button *ngIf=\"group.isNew\" class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOption(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button\r\n class=\"btn btn-primary-outline btn-sm\"\r\n (click)=\"addOption()\"\r\n>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.create' | translate }}</th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"!variant.existing\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"] }]
411
+ args: [{ selector: 'vdr-product-variants-editor', changeDetection: ChangeDetectionStrategy.Default, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(!formValueChanged && !optionsChanged) || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [options]=\"group.values\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n (add)=\"addOption(group.id, $event.name)\"\r\n (remove)=\"removeOption(group.id, $event)\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button\r\n [disabled]=\"group.locked\"\r\n class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td class=\"left\">\r\n <clr-checkbox-wrapper *ngIf=\"!variant.existing\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n <label>{{ 'common.create' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId, variant.options)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"] }]
317
412
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.DataService }, { type: i3.ProductDetailService }, { type: i2.NotificationService }, { type: i2.ModalService }]; } });
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXRhbG9nL3NyYy9jb21wb25lbnRzL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY2F0YWxvZy9zcmMvY29tcG9uZW50cy9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEUsT0FBTyxFQU1ILG9CQUFvQixHQU12QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0YsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbEUsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sOEVBQThFLENBQUM7Ozs7Ozs7Ozs7QUFFckksTUFBTSxPQUFPLGdCQUFnQjtJQVV6QixZQUFZLE1BQWlDO1FBQ3pD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LENBQUM7SUFDbkIsQ0FBQzs7MkhBOVdRLDhCQUE4QjsrR0FBOUIsOEJBQThCLG1FQzVEM0MsaTFLQWdJQTsyRkRwRWEsOEJBQThCO2tCQU4xQyxTQUFTOytCQUNJLDZCQUE2QixtQkFHdEIsdUJBQXVCLENBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IG1hcmtlciBhcyBfIH0gZnJvbSAnQGJpZXNiamVyZy9uZ3gtdHJhbnNsYXRlLWV4dHJhY3QtbWFya2VyJztcclxuaW1wb3J0IHtcclxuICAgIENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cE11dGF0aW9uLFxyXG4gICAgQ3JlYXRlUHJvZHVjdE9wdGlvbklucHV0LFxyXG4gICAgQ3VycmVuY3lDb2RlLFxyXG4gICAgRGF0YVNlcnZpY2UsXHJcbiAgICBEZWFjdGl2YXRlQXdhcmUsXHJcbiAgICBnZXREZWZhdWx0VWlMYW5ndWFnZSxcclxuICAgIEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5LFxyXG4gICAgTGFuZ3VhZ2VDb2RlLFxyXG4gICAgTW9kYWxTZXJ2aWNlLFxyXG4gICAgTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnQsXHJcbn0gZnJvbSAnQHZlbmR1cmUvYWRtaW4tdWkvY29yZSc7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVN0cmluZyB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvbm9ybWFsaXplLXN0cmluZyc7XHJcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL3BpY2snO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZUFsbENvbWJpbmF0aW9ucywgbm90TnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi9zaGFyZWQtdXRpbHMnO1xyXG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL3VuaXF1ZSc7XHJcbmltcG9ydCB7IEVNUFRZLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBQcm9kdWN0RGV0YWlsU2VydmljZSB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9wcm9kdWN0LWRldGFpbC9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybVZhcmlhbnREZWxldGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm0tdmFyaWFudC1kZWxldGlvbi1kaWFsb2cvY29uZmlybS12YXJpYW50LWRlbGV0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRlZFZhcmlhbnQge1xyXG4gICAgaXNEZWZhdWx0OiBib29sZWFuO1xyXG4gICAgb3B0aW9uczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGlkPzogc3RyaW5nIH0+O1xyXG4gICAgcHJvZHVjdFZhcmlhbnRJZD86IHN0cmluZztcclxuICAgIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBleGlzdGluZzogYm9vbGVhbjtcclxuICAgIHNrdTogc3RyaW5nO1xyXG4gICAgcHJpY2U6IG51bWJlcjtcclxuICAgIHN0b2NrOiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPEdlbmVyYXRlZFZhcmlhbnQ+KSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkge1xyXG4gICAgICAgICAgICB0aGlzW2tleV0gPSBjb25maWdba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBPcHRpb25Hcm91cFVpTW9kZWwge1xyXG4gICAgaWQ/OiBzdHJpbmc7XHJcbiAgICBpc05ldzogYm9vbGVhbjtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHZhbHVlczogQXJyYXk8e1xyXG4gICAgICAgIGlkPzogc3RyaW5nO1xyXG4gICAgICAgIG5hbWU6IHN0cmluZztcclxuICAgICAgICBsb2NrZWQ6IGJvb2xlYW47XHJcbiAgICB9PjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3Zkci1wcm9kdWN0LXZhcmlhbnRzLWVkaXRvcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vcHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3RWYXJpYW50c0VkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgRGVhY3RpdmF0ZUF3YXJlIHtcclxuICAgIGZvcm1WYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGdlbmVyYXRlZFZhcmlhbnRzOiBHZW5lcmF0ZWRWYXJpYW50W10gPSBbXTtcclxuICAgIG9wdGlvbkdyb3VwczogT3B0aW9uR3JvdXBVaU1vZGVsW107XHJcbiAgICBwcm9kdWN0OiBOb25OdWxsYWJsZTxHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnNRdWVyeVsncHJvZHVjdCddPjtcclxuICAgIGN1cnJlbmN5Q29kZTogQ3VycmVuY3lDb2RlO1xyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZUNvZGU6IExhbmd1YWdlQ29kZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2R1Y3REZXRhaWxTZXJ2aWNlOiBQcm9kdWN0RGV0YWlsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9XHJcbiAgICAgICAgICAgICh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnbGFuZycpIGFzIExhbmd1YWdlQ29kZSkgfHwgZ2V0RGVmYXVsdFVpTGFuZ3VhZ2UoKTtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnNldHRpbmdzLmdldEFjdGl2ZUNoYW5uZWwoKS5zaW5nbGUkLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeUNvZGUgPSBkYXRhLmFjdGl2ZUNoYW5uZWwuY3VycmVuY3lDb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybUNoYW5nZWQodmFyaWFudEluZm86IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHZhcmlhbnRJbmZvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbkRlYWN0aXZhdGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmZvcm1WYWx1ZUNoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFyaWFudHNUb0FkZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIodiA9PiAhdi5leGlzdGluZyAmJiB2LmVuYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhcmlhbnROYW1lKHZhcmlhbnQ6IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICByZXR1cm4gdmFyaWFudC5vcHRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICA/IF8oJ2NhdGFsb2cuZGVmYXVsdC12YXJpYW50JylcclxuICAgICAgICAgICAgOiB2YXJpYW50Lm9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5qb2luKCcgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkT3B0aW9uKCkge1xyXG4gICAgICAgIHRoaXMub3B0aW9uR3JvdXBzLnB1c2goe1xyXG4gICAgICAgICAgICBpc05ldzogdHJ1ZSxcclxuICAgICAgICAgICAgbmFtZTogJycsXHJcbiAgICAgICAgICAgIHZhbHVlczogW10sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3B0aW9uKG9wdGlvbkdyb3VwOiBPcHRpb25Hcm91cFVpTW9kZWwpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbkdyb3VwcyA9IHRoaXMub3B0aW9uR3JvdXBzLmZpbHRlcihvZyA9PiBvZyAhPT0gb3B0aW9uR3JvdXApO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVWYXJpYW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlVmFyaWFudHMoKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5vcHRpb25Hcm91cHMubWFwKGcgPT4gZy52YWx1ZXMpO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFyaWFudHMgPSB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzO1xyXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZFZhcmlhbnRGYWN0b3J5ID0gKFxyXG4gICAgICAgICAgICBpc0RlZmF1bHQ6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IEdlbmVyYXRlZFZhcmlhbnRbJ29wdGlvbnMnXSxcclxuICAgICAgICAgICAgZXhpc3RpbmdWYXJpYW50PzogTm9uTnVsbGFibGU8R2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zUXVlcnlbJ3Byb2R1Y3QnXT5bJ3ZhcmlhbnRzJ11bbnVtYmVyXSxcclxuICAgICAgICAgICAgcHJvdG90eXBlVmFyaWFudD86IE5vbk51bGxhYmxlPEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5Wydwcm9kdWN0J10+Wyd2YXJpYW50cyddW251bWJlcl0sXHJcbiAgICAgICAgKTogR2VuZXJhdGVkVmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMuZ2V0VmFyaWFudFByb3RvdHlwZShvcHRpb25zLCBwcmV2aW91c1ZhcmlhbnRzKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRWYXJpYW50KHtcclxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBleGlzdGluZzogISFleGlzdGluZ1ZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0VmFyaWFudElkOiBleGlzdGluZ1ZhcmlhbnQ/LmlkLFxyXG4gICAgICAgICAgICAgICAgaXNEZWZhdWx0LFxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgICAgIHByaWNlOiBleGlzdGluZ1ZhcmlhbnQ/LnByaWNlID8/IHByb3RvdHlwZVZhcmlhbnQ/LnByaWNlID8/IHByb3RvdHlwZS5wcmljZSxcclxuICAgICAgICAgICAgICAgIHNrdTogZXhpc3RpbmdWYXJpYW50Py5za3UgPz8gcHJvdG90eXBlVmFyaWFudD8uc2t1ID8/IHByb3RvdHlwZS5za3UsXHJcbiAgICAgICAgICAgICAgICBzdG9jazogZXhpc3RpbmdWYXJpYW50Py5zdG9ja09uSGFuZCA/PyBwcm90b3R5cGVWYXJpYW50Py5zdG9ja09uSGFuZCA/PyBwcm90b3R5cGUuc3RvY2ssXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWYXJpYW50cyA9IGdyb3Vwcy5sZW5ndGhcclxuICAgICAgICAgICAgPyBnZW5lcmF0ZUFsbENvbWJpbmF0aW9ucyhncm91cHMpLm1hcChvcHRpb25zID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdWYXJpYW50ID0gdGhpcy5wcm9kdWN0LnZhcmlhbnRzLmZpbmQodiA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQXJlRXF1YWwodi5vcHRpb25zLCBvcHRpb25zKSxcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvdG90eXBlVmFyaWFudCA9IHRoaXMucHJvZHVjdC52YXJpYW50cy5maW5kKHYgPT5cclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0FyZVN1YnNldCh2Lm9wdGlvbnMsIG9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkVmFyaWFudEZhY3RvcnkoZmFsc2UsIG9wdGlvbnMsIGV4aXN0aW5nVmFyaWFudCwgcHJvdG90eXBlVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgOiBbZ2VuZXJhdGVkVmFyaWFudEZhY3RvcnkodHJ1ZSwgW10sIHRoaXMucHJvZHVjdC52YXJpYW50c1swXSldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBvbmUgb2YgdGhlIGV4aXN0aW5nIHZhcmlhbnRzIHRvIGJhc2UgdGhlIG5ld2x5LWdlbmVyYXRlZCB2YXJpYW50J3NcclxuICAgICAqIGRldGFpbHMgb2ZmLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhcmlhbnRQcm90b3R5cGUoXHJcbiAgICAgICAgb3B0aW9uczogR2VuZXJhdGVkVmFyaWFudFsnb3B0aW9ucyddLFxyXG4gICAgICAgIHByZXZpb3VzVmFyaWFudHM6IEdlbmVyYXRlZFZhcmlhbnRbXSxcclxuICAgICk6IFBpY2s8R2VuZXJhdGVkVmFyaWFudCwgJ3NrdScgfCAncHJpY2UnIHwgJ3N0b2NrJz4ge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhbnRzV2l0aFNpbWlsYXJPcHRpb25zID0gcHJldmlvdXNWYXJpYW50cy5maWx0ZXIodiA9PlxyXG4gICAgICAgICAgICBvcHRpb25zLm1hcChvID0+IG8ubmFtZSkuZmlsdGVyKG5hbWUgPT4gdi5vcHRpb25zLm1hcChvID0+IG8ubmFtZSkuaW5jbHVkZXMobmFtZSkpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHZhcmlhbnRzV2l0aFNpbWlsYXJPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGljayhwcmV2aW91c1ZhcmlhbnRzWzBdLCBbJ3NrdScsICdwcmljZScsICdzdG9jayddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2t1OiAnJyxcclxuICAgICAgICAgICAgcHJpY2U6IDAsXHJcbiAgICAgICAgICAgIHN0b2NrOiAwLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlVmFyaWFudChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgLmRpYWxvZyh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXygnY2F0YWxvZy5jb25maXJtLWRlbGV0ZS1wcm9kdWN0LXZhcmlhbnQnKSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdzZWNvbmRhcnknLCBsYWJlbDogXygnY29tbW9uLmNhbmNlbCcpIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZGFuZ2VyJywgbGFiZWw6IF8oJ2NvbW1vbi5kZWxldGUnKSwgcmV0dXJuVmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPyB0aGlzLnByb2R1Y3REZXRhaWxTZXJ2aWNlLmRlbGV0ZVByb2R1Y3RWYXJpYW50KGlkLCB0aGlzLnByb2R1Y3QuaWQpIDogRU1QVFksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVGZXRjaFByb2R1Y3QobnVsbCkpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXygnY29tbW9uLm5vdGlmeS1kZWxldGUtc3VjY2VzcycpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogJ1Byb2R1Y3RWYXJpYW50JyxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihfKCdjb21tb24ubm90aWZ5LWRlbGV0ZS1lcnJvcicpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogJ1Byb2R1Y3RWYXJpYW50JyxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZSgpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbkdyb3VwcyA9IHRoaXMub3B0aW9uR3JvdXBzLmZpbHRlcihnID0+IGcudmFsdWVzLmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uR3JvdXBzID0gdGhpcy5vcHRpb25Hcm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcihvZyA9PiBvZy5pc05ldylcclxuICAgICAgICAgICAgLm1hcChvZyA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogb2cubmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogW10sXHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1VuaXF1ZVNrdXMoKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuY29uZmlybURlbGV0aW9uT2ZPYnNvbGV0ZVZhcmlhbnRzKCkpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxTZXJ2aWNlLmNyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cHMobmV3T3B0aW9uR3JvdXBzLCB0aGlzLmxhbmd1YWdlQ29kZSksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoY3JlYXRlZE9wdGlvbkdyb3VwcyA9PiB0aGlzLmFkZE9wdGlvbkdyb3Vwc1RvUHJvZHVjdChjcmVhdGVkT3B0aW9uR3JvdXBzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChjcmVhdGVkT3B0aW9uR3JvdXBzID0+IHRoaXMuYWRkTmV3T3B0aW9uc1RvR3JvdXBzKGNyZWF0ZWRPcHRpb25Hcm91cHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKGdyb3Vwc0lkcyA9PiB0aGlzLmZldGNoT3B0aW9uR3JvdXBzKGdyb3Vwc0lkcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoZ3JvdXBzID0+IHRoaXMuY3JlYXRlTmV3UHJvZHVjdFZhcmlhbnRzKGdyb3VwcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAocmVzID0+IHRoaXMuZGVsZXRlT2Jzb2xldGVWYXJpYW50cyhyZXMuY3JlYXRlUHJvZHVjdFZhcmlhbnRzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCh2YXJpYW50cyA9PiB0aGlzLnJlRmV0Y2hQcm9kdWN0KHZhcmlhbnRzKSksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiB2YXJpYW50cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXygnY2F0YWxvZy5jcmVhdGVkLW5ldy12YXJpYW50cy1zdWNjZXNzJyksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IHZhcmlhbnRzLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tVbmlxdWVTa3VzKCkge1xyXG4gICAgICAgIGNvbnN0IHdpdGhEdXBsaWNhdGVTa3VzID0gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIoKHZhcmlhbnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzLmZpbmQoZ3YgPT4gZ3Yuc2t1LnRyaW0oKSA9PT0gdmFyaWFudC5za3UudHJpbSgpICYmIGd2ICE9PSB2YXJpYW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAod2l0aER1cGxpY2F0ZVNrdXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGFsU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLmRpYWxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuZHVwbGljYXRlLXNrdS13YXJuaW5nJyksXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogdW5pcXVlKHdpdGhEdXBsaWNhdGVTa3VzLm1hcCh2ID0+IGAke3Yuc2t1fWApKS5qb2luKCcsICcpLFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFt7IGxhYmVsOiBfKCdjb21tb24uY2xvc2UnKSwgcmV0dXJuVmFsdWU6IGZhbHNlLCB0eXBlOiAncHJpbWFyeScgfV0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnBpcGUobWVyZ2VNYXAocmVzID0+IEVNUFRZKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbmZpcm1EZWxldGlvbk9mT2Jzb2xldGVWYXJpYW50cygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBvYnNvbGV0ZVZhcmlhbnRzID0gdGhpcy5nZXRPYnNvbGV0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgaWYgKG9ic29sZXRlVmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGFsU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLmZyb21Db21wb25lbnQoQ29uZmlybVZhcmlhbnREZWxldGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2Fsczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogb2Jzb2xldGVWYXJpYW50cyxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlTWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMgPT09IHRydWUgPyBvZih0cnVlKSA6IEVNUFRZO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0T2Jzb2xldGVWYXJpYW50cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0LnZhcmlhbnRzLmZpbHRlcihcclxuICAgICAgICAgICAgdmFyaWFudCA9PiAhdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maW5kKGd2ID0+IGd2LnByb2R1Y3RWYXJpYW50SWQgPT09IHZhcmlhbnQuaWQpLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYXNPbmx5RGVmYXVsdFZhcmlhbnQocHJvZHVjdDogTm9uTnVsbGFibGU8R2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zUXVlcnlbJ3Byb2R1Y3QnXT4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdC52YXJpYW50cy5sZW5ndGggPT09IDEgJiYgcHJvZHVjdC5vcHRpb25Hcm91cHMubGVuZ3RoID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkT3B0aW9uR3JvdXBzVG9Qcm9kdWN0KFxyXG4gICAgICAgIGNyZWF0ZWRPcHRpb25Hcm91cHM6IEFycmF5PENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cE11dGF0aW9uWydjcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAnXT4sXHJcbiAgICApOiBPYnNlcnZhYmxlPEFycmF5PENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cE11dGF0aW9uWydjcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAnXT4+IHtcclxuICAgICAgICBpZiAoY3JlYXRlZE9wdGlvbkdyb3Vwcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZE9wdGlvbkdyb3Vwcy5tYXAob3B0aW9uR3JvdXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuYWRkT3B0aW9uR3JvdXBUb1Byb2R1Y3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWQ6IHRoaXMucHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uR3JvdXBJZDogb3B0aW9uR3JvdXAuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKS5waXBlKG1hcCgoKSA9PiBjcmVhdGVkT3B0aW9uR3JvdXBzKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGROZXdPcHRpb25zVG9Hcm91cHMoXHJcbiAgICAgICAgY3JlYXRlZE9wdGlvbkdyb3VwczogQXJyYXk8Q3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwTXV0YXRpb25bJ2NyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cCddPixcclxuICAgICk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcclxuICAgICAgICBjb25zdCBuZXdPcHRpb25zOiBDcmVhdGVQcm9kdWN0T3B0aW9uSW5wdXRbXSA9IHRoaXMub3B0aW9uR3JvdXBzXHJcbiAgICAgICAgICAgIC5tYXAob2cgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEdyb3VwID0gY3JlYXRlZE9wdGlvbkdyb3Vwcy5maW5kKGNvZyA9PiBjb2cubmFtZSA9PT0gb2cubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9kdWN0T3B0aW9uR3JvdXBJZCA9IGNyZWF0ZWRHcm91cCA/IGNyZWF0ZWRHcm91cC5pZCA6IG9nLmlkO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwcm9kdWN0T3B0aW9uR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCBhIHByb2R1Y3RPcHRpb25Hcm91cElkJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2cudmFsdWVzXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih2ID0+ICF2LmxvY2tlZClcclxuICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdE9wdGlvbkdyb3VwSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IG5vcm1hbGl6ZVN0cmluZyh2Lm5hbWUsICctJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogW3sgbmFtZTogdi5uYW1lLCBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnJlZHVjZSgoZmxhdCwgb3B0aW9ucykgPT4gWy4uLmZsYXQsIC4uLm9wdGlvbnNdLCBbXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbEdyb3VwSWRzID0gW1xyXG4gICAgICAgICAgICAuLi5jcmVhdGVkT3B0aW9uR3JvdXBzLm1hcChnID0+IGcuaWQpLFxyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLmlkKS5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAobmV3T3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG5ld09wdGlvbnMubWFwKGlucHV0ID0+IHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5hZGRPcHRpb25Ub0dyb3VwKGlucHV0KSkpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gYWxsR3JvdXBJZHMpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihhbGxHcm91cElkcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmV0Y2hPcHRpb25Hcm91cHMoZ3JvdXBzSWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8UHJvZHVjdE9wdGlvbkdyb3VwV2l0aE9wdGlvbnNGcmFnbWVudFtdPiB7XHJcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICAgICAgICBncm91cHNJZHMubWFwKGlkID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3RcclxuICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdE9wdGlvbkdyb3VwKGlkKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXBTaW5nbGUoZGF0YSA9PiBkYXRhLnByb2R1Y3RPcHRpb25Hcm91cClcclxuICAgICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKSksXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZU5ld1Byb2R1Y3RWYXJpYW50cyhncm91cHM6IFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnRbXSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBncm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpXHJcbiAgICAgICAgICAgIC5tYXAob2cgPT4gb2cub3B0aW9ucylcclxuICAgICAgICAgICAgLnJlZHVjZSgoZmxhdCwgbykgPT4gWy4uLmZsYXQsIC4uLm9dLCBbXSk7XHJcbiAgICAgICAgY29uc3QgdmFyaWFudHMgPSB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzXHJcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2LmVuYWJsZWQgJiYgIXYuZXhpc3RpbmcpXHJcbiAgICAgICAgICAgIC5tYXAodiA9PiAoe1xyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHYucHJpY2UsXHJcbiAgICAgICAgICAgICAgICBza3U6IHYuc2t1LFxyXG4gICAgICAgICAgICAgICAgc3RvY2s6IHYuc3RvY2ssXHJcbiAgICAgICAgICAgICAgICBvcHRpb25JZHM6IHYub3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobmFtZSA9PiBvcHRpb25zLmZpbmQobyA9PiBvLm5hbWUgPT09IG5hbWUubmFtZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChvID0+IG8uaWQpLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdERldGFpbFNlcnZpY2UuY3JlYXRlUHJvZHVjdFZhcmlhbnRzKFxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3QsXHJcbiAgICAgICAgICAgIHZhcmlhbnRzLFxyXG4gICAgICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVsZXRlT2Jzb2xldGVWYXJpYW50czxUPihpbnB1dDogVCk6IE9ic2VydmFibGU8VCB8IFRbXT4ge1xyXG4gICAgICAgIGNvbnN0IG9ic29sZXRlVmFyaWFudHMgPSB0aGlzLmdldE9ic29sZXRlVmFyaWFudHMoKTtcclxuICAgICAgICBpZiAob2Jzb2xldGVWYXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsZXRlT3BlcmF0aW9ucyA9IG9ic29sZXRlVmFyaWFudHMubWFwKHYgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5kZWxldGVQcm9kdWN0VmFyaWFudCh2LmlkKS5waXBlKG1hcCgoKSA9PiBpbnB1dCkpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oLi4uZGVsZXRlT3BlcmF0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZUZldGNoUHJvZHVjdDxUPihpbnB1dDogVCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIC8vIFJlLWZldGNoIHRoZSBQcm9kdWN0IHRvIGZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgdmlldy5cclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpO1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmdldFByb2R1Y3QoaWQpLnNpbmdsZSQucGlwZShtYXAoKCkgPT4gaW5wdXQpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0T3B0aW9uc0FuZFZhcmlhbnRzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdFxyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgIC5nZXRQcm9kdWN0VmFyaWFudHNPcHRpb25zKHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpISlcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAubWFwU2luZ2xlKCh7IHByb2R1Y3QgfSkgPT4gcHJvZHVjdCEpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3QgPSBwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMgPSBwLm9wdGlvbkdyb3Vwcy5tYXAob2cgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvZy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvZy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG9nLm9wdGlvbnMubWFwKG8gPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogby5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb3B0aW9uc0FyZUVxdWFsKGE6IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+LCBiOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvT3B0aW9uU3RyaW5nKGEpID09PSB0aGlzLnRvT3B0aW9uU3RyaW5nKGIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb3B0aW9uc0FyZVN1YnNldChhOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9PiwgYjogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b09wdGlvblN0cmluZyhiKS5pbmNsdWRlcyh0aGlzLnRvT3B0aW9uU3RyaW5nKGEpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvT3B0aW9uU3RyaW5nKG86IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gb1xyXG4gICAgICAgICAgICAubWFwKHggPT4geC5uYW1lKVxyXG4gICAgICAgICAgICAuc29ydCgpXHJcbiAgICAgICAgICAgIC5qb2luKCd8Jyk7XHJcbiAgICB9XHJcbn1cclxuIiwiPHZkci1hY3Rpb24tYmFyPlxyXG4gICAgPHZkci1hYi1yaWdodD5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9ybVZhbHVlQ2hhbmdlZCB8fCBnZXRWYXJpYW50c1RvQWRkKCkubGVuZ3RoID09PSAwXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7ICdjb21tb24uYWRkLW5ldy12YXJpYW50cycgfCB0cmFuc2xhdGU6IHsgY291bnQ6IGdldFZhcmlhbnRzVG9BZGQoKS5sZW5ndGggfSB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC92ZHItYWItcmlnaHQ+XHJcbjwvdmRyLWFjdGlvbi1iYXI+XHJcblxyXG48ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBvcHRpb25Hcm91cHNcIiBjbGFzcz1cIm9wdGlvbi1ncm91cHNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgPGxhYmVsPnt7ICdjYXRhbG9nLm9wdGlvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBjbHJJbnB1dCBbKG5nTW9kZWwpXT1cImdyb3VwLm5hbWVcIiBuYW1lPVwibmFtZVwiIFtyZWFkb25seV09XCIhZ3JvdXAuaXNOZXdcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidmFsdWVzXCI+XHJcbiAgICAgICAgPGxhYmVsPnt7ICdjYXRhbG9nLm9wdGlvbi12YWx1ZXMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICA8dmRyLW9wdGlvbi12YWx1ZS1pbnB1dFxyXG4gICAgICAgICAgICAjb3B0aW9uVmFsdWVJbnB1dENvbXBvbmVudFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyb3VwLnZhbHVlc1wiXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImdlbmVyYXRlVmFyaWFudHMoKVwiXHJcbiAgICAgICAgICAgIFtncm91cE5hbWVdPVwiZ3JvdXAubmFtZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5uYW1lID09PSAnJ1wiXHJcbiAgICAgICAgPjwvdmRyLW9wdGlvbi12YWx1ZS1pbnB1dD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ3JvdXAuaXNOZXdcIiBjbGFzcz1cImJ0biBidG4taWNvbiBidG4tZGFuZ2VyLW91dGxpbmUgbXQ1XCIgKGNsaWNrKT1cInJlbW92ZU9wdGlvbihncm91cClcIj5cclxuICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwidHJhc2hcIj48L2Nsci1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48YnV0dG9uXHJcbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeS1vdXRsaW5lIGJ0bi1zbVwiXHJcbiAgICAoY2xpY2spPVwiYWRkT3B0aW9uKClcIlxyXG4+XHJcbiAgICA8Y2xyLWljb24gc2hhcGU9XCJwbHVzXCI+PC9jbHItaWNvbj5cclxuICAgIHt7ICdjYXRhbG9nLmFkZC1vcHRpb24nIHwgdHJhbnNsYXRlIH19XHJcbjwvYnV0dG9uPlxyXG5cclxuPGRpdiBjbGFzcz1cInZhcmlhbnRzLXByZXZpZXdcIj5cclxuICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2NvbW1vbi5jcmVhdGUnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD57eyAnY2F0YWxvZy52YXJpYW50JyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2NhdGFsb2cuc2t1JyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2NhdGFsb2cucHJpY2UnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD57eyAnY2F0YWxvZy5zdG9jay1vbi1oYW5kJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgdmFyaWFudCBvZiBnZW5lcmF0ZWRWYXJpYW50c1wiIFtjbGFzcy5kaXNhYmxlZF09XCIhdmFyaWFudC5lbmFibGVkIHx8IHZhcmlhbnQuZXhpc3RpbmdcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiF2YXJpYW50LmV4aXN0aW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhcmlhbnQuZW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsckNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZm9ybVZhbHVlQ2hhbmdlZCA9IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAge3sgZ2V0VmFyaWFudE5hbWUodmFyaWFudCkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGNsci1pbnB1dC1jb250YWluZXIgKm5nSWY9XCIhdmFyaWFudC5leGlzdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbHJJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5za3VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2NhdGFsb2cuc2t1JyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJza3VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZvcm1DaGFuZ2VkKHZhcmlhbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9jbHItaW5wdXQtY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50LmV4aXN0aW5nXCI+e3sgdmFyaWFudC5za3UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxjbHItaW5wdXQtY29udGFpbmVyICpuZ0lmPVwiIXZhcmlhbnQuZXhpc3RpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dmRyLWN1cnJlbmN5LWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNscklucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5wcmljZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwcmljZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeUNvZGVdPVwiY3VycmVuY3lDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlZCh2YXJpYW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvdmRyLWN1cnJlbmN5LWlucHV0PlxyXG4gICAgICAgICAgICAgICAgPC9jbHItaW5wdXQtY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50LmV4aXN0aW5nXCI+e3sgdmFyaWFudC5wcmljZSB8IGxvY2FsZUN1cnJlbmN5OiBjdXJyZW5jeUNvZGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxjbHItaW5wdXQtY29udGFpbmVyICpuZ0lmPVwiIXZhcmlhbnQuZXhpc3RpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xySW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5zdG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJzdG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZWQodmFyaWFudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Nsci1pbnB1dC1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInZhcmlhbnQuZXhpc3RpbmdcIj57eyB2YXJpYW50LnN0b2NrIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8dmRyLWRyb3Bkb3duICpuZ0lmPVwidmFyaWFudC5wcm9kdWN0VmFyaWFudElkIGFzIHByb2R1Y3RWYXJpYW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idXR0b25cIiB2ZHJEcm9wZG93blRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImVsbGlwc2lzLXZlcnRpY2FsXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8dmRyLWRyb3Bkb3duLW1lbnUgdmRyUG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZhcmlhbnQocHJvZHVjdFZhcmlhbnRJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRyRHJvcGRvd25JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cInRyYXNoXCIgY2xhc3M9XCJpcy1kYW5nZXJcIj48L2Nsci1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2NvbW1vbi5kZWxldGUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdmRyLWRyb3Bkb3duLW1lbnU+XHJcbiAgICAgICAgICAgICAgICA8L3Zkci1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuPC9kaXY+XHJcbiJdfQ==
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXRhbG9nL3NyYy9jb21wb25lbnRzL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY2F0YWxvZy9zcmMvY29tcG9uZW50cy9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEUsT0FBTyxFQU1ILGNBQWMsRUFDZCxvQkFBb0IsR0FNdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRixPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQzs7Ozs7Ozs7OztBQUVySSxNQUFNLE9BQU8sZ0JBQWdCO0lB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Qiw4QkFBOEIsbUVDOUQzQyxtOExBd0lBOzJGRDFFYSw4QkFBOEI7a0JBTjFDLFNBQVM7K0JBQ0ksNkJBQTZCLG1CQUd0Qix1QkFBdUIsQ0FBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgbWFya2VyIGFzIF8gfSBmcm9tICdAYmllc2JqZXJnL25neC10cmFuc2xhdGUtZXh0cmFjdC1tYXJrZXInO1xyXG5pbXBvcnQge1xyXG4gICAgQ3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwTXV0YXRpb24sXHJcbiAgICBDcmVhdGVQcm9kdWN0T3B0aW9uSW5wdXQsXHJcbiAgICBDdXJyZW5jeUNvZGUsXHJcbiAgICBEYXRhU2VydmljZSxcclxuICAgIERlYWN0aXZhdGVBd2FyZSxcclxuICAgIERlbGV0aW9uUmVzdWx0LFxyXG4gICAgZ2V0RGVmYXVsdFVpTGFuZ3VhZ2UsXHJcbiAgICBHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnNRdWVyeSxcclxuICAgIExhbmd1YWdlQ29kZSxcclxuICAgIE1vZGFsU2VydmljZSxcclxuICAgIE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50LFxyXG59IGZyb20gJ0B2ZW5kdXJlL2FkbWluLXVpL2NvcmUnO1xyXG5pbXBvcnQgeyBub3JtYWxpemVTdHJpbmcgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL25vcm1hbGl6ZS1zdHJpbmcnO1xyXG5pbXBvcnQgeyBwaWNrIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi9waWNrJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVBbGxDb21iaW5hdGlvbnMsIG5vdE51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvc2hhcmVkLXV0aWxzJztcclxuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi91bmlxdWUnO1xyXG5pbXBvcnQgeyBFTVBUWSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlZmF1bHRJZkVtcHR5LCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IFByb2R1Y3REZXRhaWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL3Byb2R1Y3QtZGV0YWlsL3Byb2R1Y3QtZGV0YWlsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25maXJtVmFyaWFudERlbGV0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybS12YXJpYW50LWRlbGV0aW9uLWRpYWxvZy9jb25maXJtLXZhcmlhbnQtZGVsZXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgR2VuZXJhdGVkVmFyaWFudCB7XHJcbiAgICBpc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgICBvcHRpb25zOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgaWQ/OiBzdHJpbmcgfT47XHJcbiAgICBwcm9kdWN0VmFyaWFudElkPzogc3RyaW5nO1xyXG4gICAgZW5hYmxlZDogYm9vbGVhbjtcclxuICAgIGV4aXN0aW5nOiBib29sZWFuO1xyXG4gICAgc2t1OiBzdHJpbmc7XHJcbiAgICBwcmljZTogbnVtYmVyO1xyXG4gICAgc3RvY2s6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8R2VuZXJhdGVkVmFyaWFudD4pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7XHJcbiAgICAgICAgICAgIHRoaXNba2V5XSA9IGNvbmZpZ1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIE9wdGlvbkdyb3VwVWlNb2RlbCB7XHJcbiAgICBpZD86IHN0cmluZztcclxuICAgIGlzTmV3OiBib29sZWFuO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgbG9ja2VkOiBib29sZWFuO1xyXG4gICAgdmFsdWVzOiBBcnJheTx7XHJcbiAgICAgICAgaWQ/OiBzdHJpbmc7XHJcbiAgICAgICAgbmFtZTogc3RyaW5nO1xyXG4gICAgICAgIGxvY2tlZDogYm9vbGVhbjtcclxuICAgIH0+O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndmRyLXByb2R1Y3QtdmFyaWFudHMtZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvZHVjdFZhcmlhbnRzRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEZWFjdGl2YXRlQXdhcmUge1xyXG4gICAgZm9ybVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgb3B0aW9uc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgIGdlbmVyYXRlZFZhcmlhbnRzOiBHZW5lcmF0ZWRWYXJpYW50W10gPSBbXTtcclxuICAgIG9wdGlvbkdyb3VwczogT3B0aW9uR3JvdXBVaU1vZGVsW107XHJcbiAgICBwcm9kdWN0OiBOb25OdWxsYWJsZTxHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnNRdWVyeVsncHJvZHVjdCddPjtcclxuICAgIGN1cnJlbmN5Q29kZTogQ3VycmVuY3lDb2RlO1xyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZUNvZGU6IExhbmd1YWdlQ29kZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2R1Y3REZXRhaWxTZXJ2aWNlOiBQcm9kdWN0RGV0YWlsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9XHJcbiAgICAgICAgICAgICh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnbGFuZycpIGFzIExhbmd1YWdlQ29kZSkgfHwgZ2V0RGVmYXVsdFVpTGFuZ3VhZ2UoKTtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnNldHRpbmdzLmdldEFjdGl2ZUNoYW5uZWwoKS5zaW5nbGUkLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeUNvZGUgPSBkYXRhLmFjdGl2ZUNoYW5uZWwuY3VycmVuY3lDb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybUNoYW5nZWQodmFyaWFudEluZm86IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHZhcmlhbnRJbmZvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbkRlYWN0aXZhdGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmZvcm1WYWx1ZUNoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFyaWFudHNUb0FkZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIodiA9PiAhdi5leGlzdGluZyAmJiB2LmVuYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhcmlhbnROYW1lKHZhcmlhbnQ6IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICByZXR1cm4gdmFyaWFudC5vcHRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICA/IF8oJ2NhdGFsb2cuZGVmYXVsdC12YXJpYW50JylcclxuICAgICAgICAgICAgOiB2YXJpYW50Lm9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5qb2luKCcgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkT3B0aW9uR3JvdXAoKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMucHVzaCh7XHJcbiAgICAgICAgICAgIGlzTmV3OiB0cnVlLFxyXG4gICAgICAgICAgICBsb2NrZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICAgICAgdmFsdWVzOiBbXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVPcHRpb25Hcm91cChvcHRpb25Hcm91cDogT3B0aW9uR3JvdXBVaU1vZGVsKSB7XHJcbiAgICAgICAgY29uc3QgaWQgPSBvcHRpb25Hcm91cC5pZDtcclxuICAgICAgICBpZiAob3B0aW9uR3JvdXAuaXNOZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwcy5maWx0ZXIob2cgPT4gb2cgIT09IG9wdGlvbkdyb3VwKTtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfKCdjYXRhbG9nLmNvbmZpcm0tZGVsZXRlLXByb2R1Y3Qtb3B0aW9uLWdyb3VwJyksXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25WYXJzOiB7IG5hbWU6IG9wdGlvbkdyb3VwLm5hbWUgfSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3NlY29uZGFyeScsIGxhYmVsOiBfKCdjb21tb24uY2FuY2VsJykgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZGFuZ2VyJywgbGFiZWw6IF8oJ2NvbW1vbi5kZWxldGUnKSwgcmV0dXJuVmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LnJlbW92ZU9wdGlvbkdyb3VwRnJvbVByb2R1Y3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkdyb3VwSWQ6IGlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZDogdGhpcy5wcm9kdWN0LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgcmVtb3ZlT3B0aW9uR3JvdXBGcm9tUHJvZHVjdCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZU9wdGlvbkdyb3VwRnJvbVByb2R1Y3QuX190eXBlbmFtZSA9PT0gJ1Byb2R1Y3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiAnUHJvZHVjdE9wdGlvbkdyb3VwJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbW92ZU9wdGlvbkdyb3VwRnJvbVByb2R1Y3QuX190eXBlbmFtZSA9PT0gJ1Byb2R1Y3RPcHRpb25JblVzZUVycm9yJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IocmVtb3ZlT3B0aW9uR3JvdXBGcm9tUHJvZHVjdC5tZXNzYWdlID8/ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkT3B0aW9uKGdyb3VwSWQ6IHN0cmluZywgb3B0aW9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMuZmluZChnID0+IGcuaWQgPT09IGdyb3VwSWQpPy52YWx1ZXMucHVzaCh7IG5hbWU6IG9wdGlvbk5hbWUsIGxvY2tlZDogZmFsc2UgfSk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zQ2hhbmdlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3B0aW9uKGdyb3VwSWQ6IHN0cmluZywgeyBpZCwgbmFtZSB9OiB7IGlkPzogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbkdyb3VwID0gdGhpcy5vcHRpb25Hcm91cHMuZmluZChnID0+IGcuaWQgPT09IGdyb3VwSWQpO1xyXG4gICAgICAgIGlmIChvcHRpb25Hcm91cCkge1xyXG4gICAgICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25Hcm91cC52YWx1ZXMgPSBvcHRpb25Hcm91cC52YWx1ZXMuZmlsdGVyKHYgPT4gdi5uYW1lICE9PSBuYW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVWYXJpYW50cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZGlhbG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC1vcHRpb24nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25WYXJzOiB7IG5hbWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnc2Vjb25kYXJ5JywgbGFiZWw6IF8oJ2NvbW1vbi5jYW5jZWwnKSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZGFuZ2VyJywgbGFiZWw6IF8oJ2NvbW1vbi5kZWxldGUnKSwgcmV0dXJuVmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAodmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmRlbGV0ZVByb2R1Y3RPcHRpb24oaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGRlbGV0ZVByb2R1Y3RPcHRpb24gfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlUHJvZHVjdE9wdGlvbi5yZXN1bHQgPT09IERlbGV0aW9uUmVzdWx0LkRFTEVURUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogJ1Byb2R1Y3RPcHRpb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25Hcm91cC52YWx1ZXMgPSBvcHRpb25Hcm91cC52YWx1ZXMuZmlsdGVyKHYgPT4gdi5pZCAhPT0gaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihkZWxldGVQcm9kdWN0T3B0aW9uLm1lc3NhZ2UgPz8gJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVWYXJpYW50cygpIHtcclxuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLnZhbHVlcyk7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYXJpYW50cyA9IHRoaXMuZ2VuZXJhdGVkVmFyaWFudHM7XHJcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkVmFyaWFudEZhY3RvcnkgPSAoXHJcbiAgICAgICAgICAgIGlzRGVmYXVsdDogYm9vbGVhbixcclxuICAgICAgICAgICAgb3B0aW9uczogR2VuZXJhdGVkVmFyaWFudFsnb3B0aW9ucyddLFxyXG4gICAgICAgICAgICBleGlzdGluZ1ZhcmlhbnQ/OiBOb25OdWxsYWJsZTxHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnNRdWVyeVsncHJvZHVjdCddPlsndmFyaWFudHMnXVtudW1iZXJdLFxyXG4gICAgICAgICAgICBwcm90b3R5cGVWYXJpYW50PzogTm9uTnVsbGFibGU8R2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zUXVlcnlbJ3Byb2R1Y3QnXT5bJ3ZhcmlhbnRzJ11bbnVtYmVyXSxcclxuICAgICAgICApOiBHZW5lcmF0ZWRWYXJpYW50ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5nZXRWYXJpYW50UHJvdG90eXBlKG9wdGlvbnMsIHByZXZpb3VzVmFyaWFudHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRlZFZhcmlhbnQoe1xyXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nOiAhIWV4aXN0aW5nVmFyaWFudCxcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RWYXJpYW50SWQ6IGV4aXN0aW5nVmFyaWFudD8uaWQsXHJcbiAgICAgICAgICAgICAgICBpc0RlZmF1bHQsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IGV4aXN0aW5nVmFyaWFudD8ucHJpY2UgPz8gcHJvdG90eXBlVmFyaWFudD8ucHJpY2UgPz8gcHJvdG90eXBlLnByaWNlLFxyXG4gICAgICAgICAgICAgICAgc2t1OiBleGlzdGluZ1ZhcmlhbnQ/LnNrdSA/PyBwcm90b3R5cGVWYXJpYW50Py5za3UgPz8gcHJvdG90eXBlLnNrdSxcclxuICAgICAgICAgICAgICAgIHN0b2NrOiBleGlzdGluZ1ZhcmlhbnQ/LnN0b2NrT25IYW5kID8/IHByb3RvdHlwZVZhcmlhbnQ/LnN0b2NrT25IYW5kID8/IHByb3RvdHlwZS5zdG9jayxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzID0gZ3JvdXBzLmxlbmd0aFxyXG4gICAgICAgICAgICA/IGdlbmVyYXRlQWxsQ29tYmluYXRpb25zKGdyb3VwcykubWFwKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1ZhcmlhbnQgPSB0aGlzLnByb2R1Y3QudmFyaWFudHMuZmluZCh2ID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNBcmVFcXVhbCh2Lm9wdGlvbnMsIG9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm90b3R5cGVWYXJpYW50ID0gdGhpcy5wcm9kdWN0LnZhcmlhbnRzLmZpbmQodiA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQXJlU3Vic2V0KHYub3B0aW9ucywgb3B0aW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRWYXJpYW50RmFjdG9yeShmYWxzZSwgb3B0aW9ucywgZXhpc3RpbmdWYXJpYW50LCBwcm90b3R5cGVWYXJpYW50KTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICA6IFtnZW5lcmF0ZWRWYXJpYW50RmFjdG9yeSh0cnVlLCBbXSwgdGhpcy5wcm9kdWN0LnZhcmlhbnRzWzBdKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG9uZSBvZiB0aGUgZXhpc3RpbmcgdmFyaWFudHMgdG8gYmFzZSB0aGUgbmV3bHktZ2VuZXJhdGVkIHZhcmlhbnQnc1xyXG4gICAgICogZGV0YWlscyBvZmYuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0VmFyaWFudFByb3RvdHlwZShcclxuICAgICAgICBvcHRpb25zOiBHZW5lcmF0ZWRWYXJpYW50WydvcHRpb25zJ10sXHJcbiAgICAgICAgcHJldmlvdXNWYXJpYW50czogR2VuZXJhdGVkVmFyaWFudFtdLFxyXG4gICAgKTogUGljazxHZW5lcmF0ZWRWYXJpYW50LCAnc2t1JyB8ICdwcmljZScgfCAnc3RvY2snPiB7XHJcbiAgICAgICAgY29uc3QgdmFyaWFudHNXaXRoU2ltaWxhck9wdGlvbnMgPSBwcmV2aW91c1ZhcmlhbnRzLmZpbHRlcih2ID0+XHJcbiAgICAgICAgICAgIG9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5maWx0ZXIobmFtZSA9PiB2Lm9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5pbmNsdWRlcyhuYW1lKSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAodmFyaWFudHNXaXRoU2ltaWxhck9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwaWNrKHByZXZpb3VzVmFyaWFudHNbMF0sIFsnc2t1JywgJ3ByaWNlJywgJ3N0b2NrJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBza3U6ICcnLFxyXG4gICAgICAgICAgICBwcmljZTogMCxcclxuICAgICAgICAgICAgc3RvY2s6IDAsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVWYXJpYW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEdlbmVyYXRlZFZhcmlhbnRbJ29wdGlvbnMnXSkge1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC12YXJpYW50JyksXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvblZhcnM6IHsgbmFtZTogb3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmpvaW4oJyAnKSB9LFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3NlY29uZGFyeScsIGxhYmVsOiBfKCdjb21tb24uY2FuY2VsJykgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdkYW5nZXInLCBsYWJlbDogXygnY29tbW9uLmRlbGV0ZScpLCByZXR1cm5WYWx1ZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAocmVzcG9uc2UgPT5cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA/IHRoaXMucHJvZHVjdERldGFpbFNlcnZpY2UuZGVsZXRlUHJvZHVjdFZhcmlhbnQoaWQsIHRoaXMucHJvZHVjdC5pZCkgOiBFTVBUWSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5yZUZldGNoUHJvZHVjdChudWxsKSksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhfKCdjb21tb24ubm90aWZ5LWRlbGV0ZS1zdWNjZXNzJyksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiAnUHJvZHVjdFZhcmlhbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLWVycm9yJyksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiAnUHJvZHVjdFZhcmlhbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlKCkge1xyXG4gICAgICAgIHRoaXMub3B0aW9uR3JvdXBzID0gdGhpcy5vcHRpb25Hcm91cHMuZmlsdGVyKGcgPT4gZy52YWx1ZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBuZXdPcHRpb25Hcm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwc1xyXG4gICAgICAgICAgICAuZmlsdGVyKG9nID0+IG9nLmlzTmV3KVxyXG4gICAgICAgICAgICAubWFwKG9nID0+ICh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBvZy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXSxcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrVW5pcXVlU2t1cygpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5jb25maXJtRGVsZXRpb25PZk9ic29sZXRlVmFyaWFudHMoKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdERldGFpbFNlcnZpY2UuY3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwcyhuZXdPcHRpb25Hcm91cHMsIHRoaXMubGFuZ3VhZ2VDb2RlKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChjcmVhdGVkT3B0aW9uR3JvdXBzID0+IHRoaXMuYWRkT3B0aW9uR3JvdXBzVG9Qcm9kdWN0KGNyZWF0ZWRPcHRpb25Hcm91cHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKGNyZWF0ZWRPcHRpb25Hcm91cHMgPT4gdGhpcy5hZGROZXdPcHRpb25zVG9Hcm91cHMoY3JlYXRlZE9wdGlvbkdyb3VwcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoZ3JvdXBzSWRzID0+IHRoaXMuZmV0Y2hPcHRpb25Hcm91cHMoZ3JvdXBzSWRzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChncm91cHMgPT4gdGhpcy5jcmVhdGVOZXdQcm9kdWN0VmFyaWFudHMoZ3JvdXBzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChyZXMgPT4gdGhpcy5kZWxldGVPYnNvbGV0ZVZhcmlhbnRzKHJlcy5jcmVhdGVQcm9kdWN0VmFyaWFudHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKHZhcmlhbnRzID0+IHRoaXMucmVGZXRjaFByb2R1Y3QodmFyaWFudHMpKSxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IHZhcmlhbnRzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhfKCdjYXRhbG9nLmNyZWF0ZWQtbmV3LXZhcmlhbnRzLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogdmFyaWFudHMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tVbmlxdWVTa3VzKCkge1xyXG4gICAgICAgIGNvbnN0IHdpdGhEdXBsaWNhdGVTa3VzID0gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIoKHZhcmlhbnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50LmVuYWJsZWQgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkVmFyaWFudHMuZmluZChndiA9PiBndi5za3UudHJpbSgpID09PSB2YXJpYW50LnNrdS50cmltKCkgJiYgZ3YgIT09IHZhcmlhbnQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHdpdGhEdXBsaWNhdGVTa3VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfKCdjYXRhbG9nLmR1cGxpY2F0ZS1za3Utd2FybmluZycpLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHVuaXF1ZSh3aXRoRHVwbGljYXRlU2t1cy5tYXAodiA9PiBgJHt2LnNrdX1gKSkuam9pbignLCAnKSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25zOiBbeyBsYWJlbDogXygnY29tbW9uLmNsb3NlJyksIHJldHVyblZhbHVlOiBmYWxzZSwgdHlwZTogJ3ByaW1hcnknIH1dLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5waXBlKG1lcmdlTWFwKHJlcyA9PiBFTVBUWSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maXJtRGVsZXRpb25PZk9ic29sZXRlVmFyaWFudHMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3Qgb2Jzb2xldGVWYXJpYW50cyA9IHRoaXMuZ2V0T2Jzb2xldGVWYXJpYW50cygpO1xyXG4gICAgICAgIGlmIChvYnNvbGV0ZVZhcmlhbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5mcm9tQ29tcG9uZW50KENvbmZpcm1WYXJpYW50RGVsZXRpb25EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHM6IG9ic29sZXRlVmFyaWFudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBtZXJnZU1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzID09PSB0cnVlID8gb2YodHJ1ZSkgOiBFTVBUWTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE9ic29sZXRlVmFyaWFudHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdC52YXJpYW50cy5maWx0ZXIoXHJcbiAgICAgICAgICAgIHZhcmlhbnQgPT4gIXRoaXMuZ2VuZXJhdGVkVmFyaWFudHMuZmluZChndiA9PiBndi5wcm9kdWN0VmFyaWFudElkID09PSB2YXJpYW50LmlkKSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzT25seURlZmF1bHRWYXJpYW50KHByb2R1Y3Q6IE5vbk51bGxhYmxlPEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5Wydwcm9kdWN0J10+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3QudmFyaWFudHMubGVuZ3RoID09PSAxICYmIHByb2R1Y3Qub3B0aW9uR3JvdXBzLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZE9wdGlvbkdyb3Vwc1RvUHJvZHVjdChcclxuICAgICAgICBjcmVhdGVkT3B0aW9uR3JvdXBzOiBBcnJheTxDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBNdXRhdGlvblsnY3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwJ10+LFxyXG4gICAgKTogT2JzZXJ2YWJsZTxBcnJheTxDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBNdXRhdGlvblsnY3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwJ10+PiB7XHJcbiAgICAgICAgaWYgKGNyZWF0ZWRPcHRpb25Hcm91cHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWRPcHRpb25Hcm91cHMubWFwKG9wdGlvbkdyb3VwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmFkZE9wdGlvbkdyb3VwVG9Qcm9kdWN0KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkOiB0aGlzLnByb2R1Y3QuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkdyb3VwSWQ6IG9wdGlvbkdyb3VwLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICkucGlwZShtYXAoKCkgPT4gY3JlYXRlZE9wdGlvbkdyb3VwcykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTmV3T3B0aW9uc1RvR3JvdXBzKFxyXG4gICAgICAgIGNyZWF0ZWRPcHRpb25Hcm91cHM6IEFycmF5PENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cE11dGF0aW9uWydjcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAnXT4sXHJcbiAgICApOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uczogQ3JlYXRlUHJvZHVjdE9wdGlvbklucHV0W10gPSB0aGlzLm9wdGlvbkdyb3Vwc1xyXG4gICAgICAgICAgICAubWFwKG9nID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRHcm91cCA9IGNyZWF0ZWRPcHRpb25Hcm91cHMuZmluZChjb2cgPT4gY29nLm5hbWUgPT09IG9nLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjdE9wdGlvbkdyb3VwSWQgPSBjcmVhdGVkR3JvdXAgPyBjcmVhdGVkR3JvdXAuaWQgOiBvZy5pZDtcclxuICAgICAgICAgICAgICAgIGlmICghcHJvZHVjdE9wdGlvbkdyb3VwSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgYSBwcm9kdWN0T3B0aW9uR3JvdXBJZCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9nLnZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodiA9PiAhdi5sb2NrZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcCh2ID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RPcHRpb25Hcm91cElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBub3JtYWxpemVTdHJpbmcodi5uYW1lLCAnLScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFt7IG5hbWU6IHYubmFtZSwgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5yZWR1Y2UoKGZsYXQsIG9wdGlvbnMpID0+IFsuLi5mbGF0LCAuLi5vcHRpb25zXSwgW10pO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxHcm91cElkcyA9IFtcclxuICAgICAgICAgICAgLi4uY3JlYXRlZE9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLmlkKSxcclxuICAgICAgICAgICAgLi4udGhpcy5vcHRpb25Hcm91cHMubWFwKGcgPT4gZy5pZCkuZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCksXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKG5ld09wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihuZXdPcHRpb25zLm1hcChpbnB1dCA9PiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuYWRkT3B0aW9uVG9Hcm91cChpbnB1dCkpKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IGFsbEdyb3VwSWRzKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoYWxsR3JvdXBJZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZldGNoT3B0aW9uR3JvdXBzKGdyb3Vwc0lkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnRbXT4ge1xyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgZ3JvdXBzSWRzLm1hcChpZCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0XHJcbiAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RPcHRpb25Hcm91cChpZClcclxuICAgICAgICAgICAgICAgICAgICAubWFwU2luZ2xlKGRhdGEgPT4gZGF0YS5wcm9kdWN0T3B0aW9uR3JvdXApXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCkpLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICkucGlwZShkZWZhdWx0SWZFbXB0eShbXSBhcyBQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50W10pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZU5ld1Byb2R1Y3RWYXJpYW50cyhncm91cHM6IFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnRbXSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBncm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpXHJcbiAgICAgICAgICAgIC5tYXAob2cgPT4gb2cub3B0aW9ucylcclxuICAgICAgICAgICAgLnJlZHVjZSgoZmxhdCwgbykgPT4gWy4uLmZsYXQsIC4uLm9dLCBbXSk7XHJcbiAgICAgICAgY29uc3QgdmFyaWFudHMgPSB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzXHJcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2LmVuYWJsZWQgJiYgIXYuZXhpc3RpbmcpXHJcbiAgICAgICAgICAgIC5tYXAodiA9PiAoe1xyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHYucHJpY2UsXHJcbiAgICAgICAgICAgICAgICBza3U6IHYuc2t1LFxyXG4gICAgICAgICAgICAgICAgc3RvY2s6IHYuc3RvY2ssXHJcbiAgICAgICAgICAgICAgICBvcHRpb25JZHM6IHYub3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobmFtZSA9PiBvcHRpb25zLmZpbmQobyA9PiBvLm5hbWUgPT09IG5hbWUubmFtZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChvID0+IG8uaWQpLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdERldGFpbFNlcnZpY2UuY3JlYXRlUHJvZHVjdFZhcmlhbnRzKFxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3QsXHJcbiAgICAgICAgICAgIHZhcmlhbnRzLFxyXG4gICAgICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVsZXRlT2Jzb2xldGVWYXJpYW50czxUPihpbnB1dDogVCk6IE9ic2VydmFibGU8VCB8IFRbXT4ge1xyXG4gICAgICAgIGNvbnN0IG9ic29sZXRlVmFyaWFudHMgPSB0aGlzLmdldE9ic29sZXRlVmFyaWFudHMoKTtcclxuICAgICAgICBpZiAob2Jzb2xldGVWYXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsZXRlT3BlcmF0aW9ucyA9IG9ic29sZXRlVmFyaWFudHMubWFwKHYgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5kZWxldGVQcm9kdWN0VmFyaWFudCh2LmlkKS5waXBlKG1hcCgoKSA9PiBpbnB1dCkpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oLi4uZGVsZXRlT3BlcmF0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZUZldGNoUHJvZHVjdDxUPihpbnB1dDogVCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIC8vIFJlLWZldGNoIHRoZSBQcm9kdWN0IHRvIGZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgdmlldy5cclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpO1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmdldFByb2R1Y3QoaWQpLnNpbmdsZSQucGlwZShtYXAoKCkgPT4gaW5wdXQpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0T3B0aW9uc0FuZFZhcmlhbnRzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdFxyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgIC5nZXRQcm9kdWN0VmFyaWFudHNPcHRpb25zKHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpISlcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAubWFwU2luZ2xlKCh7IHByb2R1Y3QgfSkgPT4gcHJvZHVjdCEpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3QgPSBwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWxsVXNlZE9wdGlvbklkcyA9IHAudmFyaWFudHMubWFwKHYgPT4gdi5vcHRpb25zLm1hcChvcHRpb24gPT4gb3B0aW9uLmlkKSkuZmxhdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWxsVXNlZE9wdGlvbkdyb3VwSWRzID0gcC52YXJpYW50c1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAodiA9PiB2Lm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24uZ3JvdXBJZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZsYXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uR3JvdXBzID0gcC5vcHRpb25Hcm91cHMubWFwKG9nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogb2cuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmV3OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogb2cubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkOiBhbGxVc2VkT3B0aW9uR3JvdXBJZHMuaW5jbHVkZXMob2cuaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG9nLm9wdGlvbnMubWFwKG8gPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogby5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkOiBhbGxVc2VkT3B0aW9uSWRzLmluY2x1ZGVzKG8uaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb3B0aW9uc0FyZUVxdWFsKGE6IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+LCBiOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvT3B0aW9uU3RyaW5nKGEpID09PSB0aGlzLnRvT3B0aW9uU3RyaW5nKGIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb3B0aW9uc0FyZVN1YnNldChhOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9PiwgYjogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b09wdGlvblN0cmluZyhiKS5pbmNsdWRlcyh0aGlzLnRvT3B0aW9uU3RyaW5nKGEpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvT3B0aW9uU3RyaW5nKG86IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gb1xyXG4gICAgICAgICAgICAubWFwKHggPT4geC5uYW1lKVxyXG4gICAgICAgICAgICAuc29ydCgpXHJcbiAgICAgICAgICAgIC5qb2luKCd8Jyk7XHJcbiAgICB9XHJcbn1cclxuIiwiPHZkci1hY3Rpb24tYmFyPlxyXG4gICAgPHZkci1hYi1yaWdodD5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoIWZvcm1WYWx1ZUNoYW5nZWQgJiYgIW9wdGlvbnNDaGFuZ2VkKSB8fCBnZXRWYXJpYW50c1RvQWRkKCkubGVuZ3RoID09PSAwXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7ICdjb21tb24uYWRkLW5ldy12YXJpYW50cycgfCB0cmFuc2xhdGU6IHsgY291bnQ6IGdldFZhcmlhbnRzVG9BZGQoKS5sZW5ndGggfSB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC92ZHItYWItcmlnaHQ+XHJcbjwvdmRyLWFjdGlvbi1iYXI+XHJcblxyXG48ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBvcHRpb25Hcm91cHNcIiBjbGFzcz1cIm9wdGlvbi1ncm91cHNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgPGxhYmVsPnt7ICdjYXRhbG9nLm9wdGlvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBjbHJJbnB1dCBbKG5nTW9kZWwpXT1cImdyb3VwLm5hbWVcIiBuYW1lPVwibmFtZVwiIFtyZWFkb25seV09XCIhZ3JvdXAuaXNOZXdcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidmFsdWVzXCI+XHJcbiAgICAgICAgPGxhYmVsPnt7ICdjYXRhbG9nLm9wdGlvbi12YWx1ZXMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICA8dmRyLW9wdGlvbi12YWx1ZS1pbnB1dFxyXG4gICAgICAgICAgICAjb3B0aW9uVmFsdWVJbnB1dENvbXBvbmVudFxyXG4gICAgICAgICAgICBbb3B0aW9uc109XCJncm91cC52YWx1ZXNcIlxyXG4gICAgICAgICAgICBbZ3JvdXBOYW1lXT1cImdyb3VwLm5hbWVcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAubmFtZSA9PT0gJydcIlxyXG4gICAgICAgICAgICAoYWRkKT1cImFkZE9wdGlvbihncm91cC5pZCwgJGV2ZW50Lm5hbWUpXCJcclxuICAgICAgICAgICAgKHJlbW92ZSk9XCJyZW1vdmVPcHRpb24oZ3JvdXAuaWQsICRldmVudClcIlxyXG4gICAgICAgID48L3Zkci1vcHRpb24tdmFsdWUtaW5wdXQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAubG9ja2VkXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWljb24gYnRuLWRhbmdlci1vdXRsaW5lIG10NVwiIChjbGljayk9XCJyZW1vdmVPcHRpb25Hcm91cChncm91cClcIj5cclxuICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwidHJhc2hcIj48L2Nsci1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5LW91dGxpbmUgYnRuLXNtXCIgKGNsaWNrKT1cImFkZE9wdGlvbkdyb3VwKClcIj5cclxuICAgIDxjbHItaWNvbiBzaGFwZT1cInBsdXNcIj48L2Nsci1pY29uPlxyXG4gICAge3sgJ2NhdGFsb2cuYWRkLW9wdGlvbicgfCB0cmFuc2xhdGUgfX1cclxuPC9idXR0b24+XHJcblxyXG48ZGl2IGNsYXNzPVwidmFyaWFudHMtcHJldmlld1wiPlxyXG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGVcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdjYXRhbG9nLnZhcmlhbnQnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD57eyAnY2F0YWxvZy5za3UnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD57eyAnY2F0YWxvZy5wcmljZScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdjYXRhbG9nLnN0b2NrLW9uLWhhbmQnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB2YXJpYW50IG9mIGdlbmVyYXRlZFZhcmlhbnRzXCIgW2NsYXNzLmRpc2FibGVkXT1cIiF2YXJpYW50LmVuYWJsZWQgfHwgdmFyaWFudC5leGlzdGluZ1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICA8Y2xyLWNoZWNrYm94LXdyYXBwZXIgKm5nSWY9XCIhdmFyaWFudC5leGlzdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhcmlhbnQuZW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJlbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xyQ2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZm9ybVZhbHVlQ2hhbmdlZCA9IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdjb21tb24uY3JlYXRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Nsci1jaGVja2JveC13cmFwcGVyPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICB7eyBnZXRWYXJpYW50TmFtZSh2YXJpYW50KSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2xyLWlucHV0LWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpYW50LmV4aXN0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xySW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5za3VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidjYXRhbG9nLnNrdScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInNrdVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlZCh2YXJpYW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jbHItaW5wdXQtY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidmFyaWFudC5leGlzdGluZ1wiPnt7IHZhcmlhbnQuc2t1IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjbHItaW5wdXQtY29udGFpbmVyICpuZ0lmPVwiIXZhcmlhbnQuZXhpc3RpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHZkci1jdXJyZW5jeS1pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xySW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5wcmljZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicHJpY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5Q29kZV09XCJjdXJyZW5jeUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlZCh2YXJpYW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3Zkci1jdXJyZW5jeS1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Nsci1pbnB1dC1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50LmV4aXN0aW5nXCI+e3sgdmFyaWFudC5wcmljZSB8IGxvY2FsZUN1cnJlbmN5OiBjdXJyZW5jeUNvZGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNsci1pbnB1dC1jb250YWluZXIgKm5nSWY9XCIhdmFyaWFudC5leGlzdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscklucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5zdG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic3RvY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZvcm1DaGFuZ2VkKHZhcmlhbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Nsci1pbnB1dC1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50LmV4aXN0aW5nXCI+e3sgdmFyaWFudC5zdG9jayB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8dmRyLWRyb3Bkb3duICpuZ0lmPVwidmFyaWFudC5wcm9kdWN0VmFyaWFudElkIGFzIHByb2R1Y3RWYXJpYW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idXR0b25cIiB2ZHJEcm9wZG93blRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImVsbGlwc2lzLXZlcnRpY2FsXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8dmRyLWRyb3Bkb3duLW1lbnUgdmRyUG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZhcmlhbnQocHJvZHVjdFZhcmlhbnRJZCwgdmFyaWFudC5vcHRpb25zKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZHJEcm9wZG93bkl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwidHJhc2hcIiBjbGFzcz1cImlzLWRhbmdlclwiPjwvY2xyLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnY29tbW9uLmRlbGV0ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC92ZHItZHJvcGRvd24tbWVudT5cclxuICAgICAgICAgICAgICAgIDwvdmRyLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L3RhYmxlPlxyXG48L2Rpdj5cclxuIl19