@1money/component-ui 0.0.75 → 0.0.77

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 (153) hide show
  1. package/es/components/ProForm/ProForm.d.ts +1 -1
  2. package/es/components/ProForm/ProForm.js +46 -34
  3. package/es/components/ProForm/ProFormDependency.d.ts +2 -1
  4. package/es/components/ProForm/ProFormDependency.js +6 -16
  5. package/es/components/ProForm/ProFormItem.d.ts +7 -2
  6. package/es/components/ProForm/ProFormItem.js +5 -7
  7. package/es/components/ProForm/ProFormList.d.ts +6 -1
  8. package/es/components/ProForm/ProFormList.js +122 -42
  9. package/es/components/ProForm/SchemaForm.d.ts +1 -1
  10. package/es/components/ProForm/SchemaForm.js +8 -5
  11. package/es/components/ProForm/context.d.ts +8 -7
  12. package/es/components/ProForm/context.js +1 -1
  13. package/es/components/ProForm/core/constants.d.ts +3 -1
  14. package/es/components/ProForm/core/constants.js +8 -2
  15. package/es/components/ProForm/core/devWarning.d.ts +3 -0
  16. package/es/components/ProForm/core/devWarning.js +22 -0
  17. package/es/components/ProForm/core/formStore.d.ts +14 -6
  18. package/es/components/ProForm/core/formStore.js +21 -2
  19. package/es/components/ProForm/core/hooks/useForm.d.ts +1 -1
  20. package/es/components/ProForm/core/hooks/useForm.js +275 -107
  21. package/es/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
  22. package/es/components/ProForm/core/hooks/useFormCore.js +121 -121
  23. package/es/components/ProForm/core/interface.d.ts +157 -103
  24. package/es/components/ProForm/core/namePathType.d.ts +25 -0
  25. package/es/components/ProForm/core/namePathType.js +2 -0
  26. package/es/components/ProForm/core/pathUtils.d.ts +5 -3
  27. package/es/components/ProForm/core/pathUtils.js +19 -1
  28. package/es/components/ProForm/core/runRules.d.ts +40 -17
  29. package/es/components/ProForm/core/runRules.js +480 -136
  30. package/es/components/ProForm/core/useFormItem.d.ts +7 -8
  31. package/es/components/ProForm/core/useFormItem.js +52 -82
  32. package/es/components/ProForm/core/validationError.d.ts +13 -0
  33. package/es/components/ProForm/core/validationError.js +29 -0
  34. package/es/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
  35. package/es/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
  36. package/es/components/ProForm/fields/ProFormCheckboxGroup.js +19 -5
  37. package/es/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
  38. package/es/components/ProForm/fields/ProFormDatePicker.js +1 -1
  39. package/es/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
  40. package/es/components/ProForm/fields/ProFormFieldSet.js +49 -12
  41. package/es/components/ProForm/fields/ProFormPassword.d.ts +1 -1
  42. package/es/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
  43. package/es/components/ProForm/fields/ProFormRadioGroup.js +8 -3
  44. package/es/components/ProForm/fields/ProFormSelect.d.ts +1 -1
  45. package/es/components/ProForm/fields/ProFormSelect.js +13 -7
  46. package/es/components/ProForm/fields/ProFormSlider.d.ts +1 -1
  47. package/es/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
  48. package/es/components/ProForm/fields/ProFormText.d.ts +1 -1
  49. package/es/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
  50. package/es/components/ProForm/fields/ProFormUpload.d.ts +1 -1
  51. package/es/components/ProForm/fields/ProFormUpload.js +1 -1
  52. package/es/components/ProForm/fields/createProFormField.d.ts +8 -2
  53. package/es/components/ProForm/fields/createProFormField.js +20 -27
  54. package/es/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
  55. package/es/components/ProForm/hooks/useFieldRequest.js +10 -8
  56. package/es/components/ProForm/hooks/useUrlSync.d.ts +8 -7
  57. package/es/components/ProForm/hooks/useUrlSync.js +1 -1
  58. package/es/components/ProForm/index.d.ts +37 -27
  59. package/es/components/ProForm/index.js +4 -1
  60. package/es/components/ProForm/interface.d.ts +115 -119
  61. package/es/components/ProForm/layouts/DialogForm.d.ts +1 -1
  62. package/es/components/ProForm/layouts/DialogForm.js +1 -1
  63. package/es/components/ProForm/layouts/DrawerForm.d.ts +1 -1
  64. package/es/components/ProForm/layouts/DrawerForm.js +1 -1
  65. package/es/components/ProForm/layouts/QueryFilter.d.ts +1 -1
  66. package/es/components/ProForm/layouts/QueryFilter.js +24 -16
  67. package/es/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  68. package/es/components/ProForm/layouts/useOverlayForm.js +1 -1
  69. package/es/components/ProForm/utils.d.ts +15 -7
  70. package/es/components/ProForm/utils.js +51 -3
  71. package/es/components/Table/core/useTableSetup.js +2 -2
  72. package/es/components/Table/interface.d.ts +1 -1
  73. package/es/index.css +1 -1
  74. package/es/index.d.ts +1 -1
  75. package/es/index.js +1 -1
  76. package/lib/components/ProForm/ProForm.d.ts +1 -1
  77. package/lib/components/ProForm/ProForm.js +45 -33
  78. package/lib/components/ProForm/ProFormDependency.d.ts +2 -1
  79. package/lib/components/ProForm/ProFormDependency.js +5 -15
  80. package/lib/components/ProForm/ProFormItem.d.ts +7 -2
  81. package/lib/components/ProForm/ProFormItem.js +5 -7
  82. package/lib/components/ProForm/ProFormList.d.ts +6 -1
  83. package/lib/components/ProForm/ProFormList.js +120 -40
  84. package/lib/components/ProForm/SchemaForm.d.ts +1 -1
  85. package/lib/components/ProForm/SchemaForm.js +8 -5
  86. package/lib/components/ProForm/context.d.ts +8 -7
  87. package/lib/components/ProForm/context.js +1 -1
  88. package/lib/components/ProForm/core/constants.d.ts +3 -1
  89. package/lib/components/ProForm/core/constants.js +9 -3
  90. package/lib/components/ProForm/core/devWarning.d.ts +3 -0
  91. package/lib/components/ProForm/core/devWarning.js +29 -0
  92. package/lib/components/ProForm/core/formStore.d.ts +14 -6
  93. package/lib/components/ProForm/core/formStore.js +23 -2
  94. package/lib/components/ProForm/core/hooks/useForm.d.ts +1 -1
  95. package/lib/components/ProForm/core/hooks/useForm.js +271 -103
  96. package/lib/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
  97. package/lib/components/ProForm/core/hooks/useFormCore.js +119 -119
  98. package/lib/components/ProForm/core/interface.d.ts +157 -103
  99. package/lib/components/ProForm/core/namePathType.d.ts +25 -0
  100. package/lib/components/ProForm/core/namePathType.js +6 -0
  101. package/lib/components/ProForm/core/pathUtils.d.ts +5 -3
  102. package/lib/components/ProForm/core/pathUtils.js +20 -1
  103. package/lib/components/ProForm/core/runRules.d.ts +40 -17
  104. package/lib/components/ProForm/core/runRules.js +483 -137
  105. package/lib/components/ProForm/core/useFormItem.d.ts +7 -8
  106. package/lib/components/ProForm/core/useFormItem.js +54 -84
  107. package/lib/components/ProForm/core/validationError.d.ts +13 -0
  108. package/lib/components/ProForm/core/validationError.js +36 -0
  109. package/lib/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
  110. package/lib/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
  111. package/lib/components/ProForm/fields/ProFormCheckboxGroup.js +18 -4
  112. package/lib/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
  113. package/lib/components/ProForm/fields/ProFormDatePicker.js +1 -1
  114. package/lib/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
  115. package/lib/components/ProForm/fields/ProFormFieldSet.js +49 -12
  116. package/lib/components/ProForm/fields/ProFormPassword.d.ts +1 -1
  117. package/lib/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
  118. package/lib/components/ProForm/fields/ProFormRadioGroup.js +7 -2
  119. package/lib/components/ProForm/fields/ProFormSelect.d.ts +1 -1
  120. package/lib/components/ProForm/fields/ProFormSelect.js +13 -7
  121. package/lib/components/ProForm/fields/ProFormSlider.d.ts +1 -1
  122. package/lib/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
  123. package/lib/components/ProForm/fields/ProFormText.d.ts +1 -1
  124. package/lib/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
  125. package/lib/components/ProForm/fields/ProFormUpload.d.ts +1 -1
  126. package/lib/components/ProForm/fields/ProFormUpload.js +1 -1
  127. package/lib/components/ProForm/fields/createProFormField.d.ts +8 -2
  128. package/lib/components/ProForm/fields/createProFormField.js +20 -27
  129. package/lib/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
  130. package/lib/components/ProForm/hooks/useFieldRequest.js +10 -8
  131. package/lib/components/ProForm/hooks/useUrlSync.d.ts +8 -7
  132. package/lib/components/ProForm/hooks/useUrlSync.js +1 -1
  133. package/lib/components/ProForm/index.d.ts +37 -27
  134. package/lib/components/ProForm/index.js +10 -1
  135. package/lib/components/ProForm/interface.d.ts +115 -119
  136. package/lib/components/ProForm/layouts/DialogForm.d.ts +1 -1
  137. package/lib/components/ProForm/layouts/DialogForm.js +1 -1
  138. package/lib/components/ProForm/layouts/DrawerForm.d.ts +1 -1
  139. package/lib/components/ProForm/layouts/DrawerForm.js +1 -1
  140. package/lib/components/ProForm/layouts/QueryFilter.d.ts +1 -1
  141. package/lib/components/ProForm/layouts/QueryFilter.js +24 -16
  142. package/lib/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  143. package/lib/components/ProForm/layouts/useOverlayForm.js +1 -1
  144. package/lib/components/ProForm/utils.d.ts +15 -7
  145. package/lib/components/ProForm/utils.js +52 -3
  146. package/lib/components/Table/core/useTableSetup.js +2 -2
  147. package/lib/components/Table/interface.d.ts +1 -1
  148. package/lib/index.css +1 -1
  149. package/lib/index.d.ts +1 -1
  150. package/lib/index.js +1 -1
  151. package/package.json +1 -1
  152. package/scripts/mcp-server/examples.generated.json +95 -53
  153. package/scripts/mcp-server/index.generated.json +1715 -185
@@ -1,7 +1,7 @@
1
1
  import type { FormStore } from '../formStore';
2
2
  import type { UseFormCoreConfig, UseFormCoreReturn } from '../interface';
3
- export declare const useFormCore: (config?: UseFormCoreConfig) => UseFormCoreReturn & {
3
+ export declare const useFormCore: <Values = Record<string, any>>(config?: UseFormCoreConfig<Values>) => UseFormCoreReturn<Values> & {
4
4
  store: FormStore;
5
- getInitialValues: () => Record<string, unknown>;
5
+ getInitialValues: () => Record<string, any>;
6
6
  };
7
7
  export default useFormCore;
@@ -1,16 +1,14 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
1
2
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
3
  import { useMemo, useRef } from 'react';
3
4
  import useEventCallback from '@1money/hooks/useEventCallback';
4
5
  import useMemoizedFn from '@1money/hooks/useMemoizedFn';
5
- import { resolveValue, setNestedValue } from '../pathUtils';
6
- import { runRulesSync } from '../runRules';
7
- import { createFormStore } from '../formStore';
6
+ import { mergeValuesPatch, resolveValue, setNestedValue } from '../pathUtils';
7
+ import { createFormStore, sameValidationNode } from '../formStore';
8
8
  export var useFormCore = function useFormCore() {
9
9
  var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10
10
  var _config$initialValues = config.initialValues,
11
11
  initialValues = _config$initialValues === void 0 ? {} : _config$initialValues,
12
- onFinish = config.onFinish,
13
- onFinishFailed = config.onFinishFailed,
14
12
  onValuesChange = config.onValuesChange,
15
13
  onReset = config.onReset,
16
14
  _config$size = config.size,
@@ -19,10 +17,6 @@ export var useFormCore = function useFormCore() {
19
17
  labelAlign = _config$labelAlign === void 0 ? 'left' : _config$labelAlign,
20
18
  _config$disabled = config.disabled,
21
19
  disabled = _config$disabled === void 0 ? false : _config$disabled,
22
- _config$colon = config.colon,
23
- colon = _config$colon === void 0 ? true : _config$colon,
24
- _config$requiredMark = config.requiredMark,
25
- requiredMark = _config$requiredMark === void 0 ? true : _config$requiredMark,
26
20
  _config$validateTrigg = config.validateTrigger,
27
21
  validateTrigger = _config$validateTrigg === void 0 ? 'onChange' : _config$validateTrigg;
28
22
  // initialValues is MOUNT-ONLY (the documented contract): freeze the first
@@ -48,26 +42,57 @@ export var useFormCore = function useFormCore() {
48
42
  // not trigger renders, and submit-time validation must always read the latest
49
43
  // rules (they can change between renders, e.g. a conditional `required`).
50
44
  var fieldRulesRef = useRef({});
45
+ // Per-field validation run epochs. EVERY validation run (sync or async)
46
+ // bumps its field's epoch; an async run re-checks its captured epoch at
47
+ // settle time and discards a STALE outcome — the same protection as
48
+ // rc-field-form's validatePromise identity check. Without it, a slow async
49
+ // validator (e.g. a server-side uniqueness check started on blur) could
50
+ // settle after the user already fixed the value and stamp a stale error
51
+ // over a newer, passing result.
52
+ var validationEpochRef = useRef({});
53
+ var beginValidationRun = useMemoizedFn(function (name) {
54
+ var next = (validationEpochRef.current[name] || 0) + 1;
55
+ validationEpochRef.current[name] = next;
56
+ return next;
57
+ });
58
+ var isValidationRunCurrent = useMemoizedFn(function (name, epoch) {
59
+ return validationEpochRef.current[name] === epoch;
60
+ });
61
+ // Bump (never delete — deletion would let a new run re-issue an old epoch
62
+ // number and collide with a still-in-flight pre-reset run).
63
+ var invalidateValidationRuns = useMemoizedFn(function (names) {
64
+ var keys = names !== null && names !== void 0 ? names : Object.keys(validationEpochRef.current);
65
+ keys.forEach(function (key) {
66
+ if (validationEpochRef.current[key] !== undefined) {
67
+ validationEpochRef.current[key] += 1;
68
+ }
69
+ });
70
+ });
71
+ // Instance handed to function-form rules. Defaults to the core methods
72
+ // (assigned at the end of this hook body); useForm upgrades it to the FULL
73
+ // form instance once it has built one, so rules see the same context on
74
+ // every path (interactive, blur, submit).
75
+ var ruleContextInstanceRef = useRef({});
76
+ var setRuleContextInstance = useMemoizedFn(function (instance) {
77
+ ruleContextInstanceRef.current = instance;
78
+ });
79
+ var getRuleContextInstance = useMemoizedFn(function () {
80
+ return ruleContextInstanceRef.current;
81
+ });
51
82
  var commitValues = useMemoizedFn(function (newValues) {
52
83
  store.setState({
53
84
  values: newValues
54
85
  });
55
86
  });
87
+ // NOTE: setting a value does NOT touch the field's error — errors are
88
+ // cleared exclusively by validation runs (whose timing follows the
89
+ // validateTrigger config), so an onBlur-only field keeps its error while
90
+ // the user is still typing.
56
91
  var setFieldValue = useMemoizedFn(function (name, value) {
57
92
  var prev = store.getState().values;
58
93
  var newValues = name.includes('.') ? setNestedValue(prev, name, value) : Object.assign(Object.assign({}, prev), _defineProperty({}, name, value));
59
94
  commitValues(newValues);
60
95
  onValuesChange === null || onValuesChange === void 0 ? void 0 : onValuesChange(_defineProperty({}, name, value), newValues);
61
- if (value !== '' && value !== null && value !== undefined) {
62
- var errors = store.getState().errors;
63
- if (errors[name]) {
64
- var newErrors = Object.assign({}, errors);
65
- delete newErrors[name];
66
- store.setState({
67
- errors: newErrors
68
- });
69
- }
70
- }
71
96
  });
72
97
  var setFieldError = useMemoizedFn(function (name, error) {
73
98
  var errors = store.getState().errors;
@@ -80,7 +105,7 @@ export var useFormCore = function useFormCore() {
80
105
  });
81
106
  return;
82
107
  }
83
- if (errors[name] === error) return;
108
+ if (sameValidationNode(errors[name], error)) return;
84
109
  store.setState({
85
110
  errors: Object.assign(Object.assign({}, errors), _defineProperty({}, name, error))
86
111
  });
@@ -96,97 +121,56 @@ export var useFormCore = function useFormCore() {
96
121
  });
97
122
  return;
98
123
  }
99
- if (warnings[name] === warning) return;
124
+ if (sameValidationNode(warnings[name], warning)) return;
100
125
  store.setState({
101
126
  warnings: Object.assign(Object.assign({}, warnings), _defineProperty({}, name, warning))
102
127
  });
103
128
  });
129
+ // Mounted-instance counts per field name, plus whether the CURRENT rules
130
+ // registration was made by a counted instance. Rules are removed only when
131
+ // the LAST mounted instance for a name releases: with two same-name fields
132
+ // mounted, the first unmount must not wipe the registration while the
133
+ // survivor (possibly memo-bailed, so not re-rendering to re-register) still
134
+ // relies on it for submit-time validation. A MANUAL registerField (no
135
+ // mounted holder, owned=false) survives the unmount of piggybacking
136
+ // instances that never registered rules themselves.
137
+ // NOTE: callers must retain BEFORE registering (retain effect declared
138
+ // first), or the registration is misclassified as manual and leaks.
139
+ var fieldMountCountsRef = useRef({});
140
+ var fieldRegistrationOwnedRef = useRef({});
104
141
  var registerField = useMemoizedFn(function (name, rules) {
105
142
  fieldRulesRef.current[name] = rules;
143
+ fieldRegistrationOwnedRef.current[name] = (fieldMountCountsRef.current[name] || 0) > 0;
106
144
  });
107
145
  var getFieldRules = useMemoizedFn(function (name) {
108
146
  return fieldRulesRef.current[name];
109
147
  });
110
148
  var unregisterField = useMemoizedFn(function (name) {
111
149
  delete fieldRulesRef.current[name];
150
+ delete fieldRegistrationOwnedRef.current[name];
112
151
  });
113
- var validateField = useMemoizedFn(function (name) {
114
- var rules = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
115
- var providedValue = arguments.length > 2 ? arguments[2] : undefined;
116
- var currentValues = store.getState().values;
117
- var value = providedValue !== undefined ? providedValue : resolveValue(currentValues, name);
118
- var _runRulesSync = runRulesSync(name, value, currentValues, rules),
119
- error = _runRulesSync.error,
120
- warning = _runRulesSync.warning;
121
- setFieldWarning(name, warning);
122
- if (error !== null) {
123
- setFieldError(name, error);
124
- return false;
125
- }
126
- if (store.getState().errors[name]) {
127
- setFieldError(name, null);
128
- }
129
- return true;
152
+ var retainField = useMemoizedFn(function (name) {
153
+ fieldMountCountsRef.current[name] = (fieldMountCountsRef.current[name] || 0) + 1;
130
154
  });
131
- var validateFields = useMemoizedFn(function () {
132
- var fieldsRulesToValidate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : fieldRulesRef.current;
133
- var isValid = true;
134
- Object.keys(fieldsRulesToValidate).forEach(function (name) {
135
- var rules = fieldsRulesToValidate[name];
136
- if (!validateField(name, rules)) {
137
- isValid = false;
155
+ var releaseField = useMemoizedFn(function (name) {
156
+ var count = (fieldMountCountsRef.current[name] || 0) - 1;
157
+ if (count <= 0) {
158
+ delete fieldMountCountsRef.current[name];
159
+ if (fieldRegistrationOwnedRef.current[name]) {
160
+ delete fieldRulesRef.current[name];
161
+ delete fieldRegistrationOwnedRef.current[name];
138
162
  }
139
- });
140
- return isValid;
141
- });
142
- var handleSubmitInternal = useMemoizedFn(function () {
143
- var currentValues = store.getState().values;
144
- var currentRules = fieldRulesRef.current;
145
- var hasErrors = false;
146
- var newErrors = {};
147
- var newWarnings = {};
148
- Object.keys(currentRules).forEach(function (fieldName) {
149
- var value = resolveValue(currentValues, fieldName);
150
- var _runRulesSync2 = runRulesSync(fieldName, value, currentValues, currentRules[fieldName]),
151
- error = _runRulesSync2.error,
152
- warning = _runRulesSync2.warning;
153
- if (error !== null) {
154
- newErrors[fieldName] = error;
155
- hasErrors = true;
156
- }
157
- if (warning !== null) {
158
- newWarnings[fieldName] = warning;
159
- }
160
- });
161
- store.setState({
162
- errors: newErrors,
163
- warnings: newWarnings
164
- });
165
- if (!hasErrors) {
166
- onFinish === null || onFinish === void 0 ? void 0 : onFinish(currentValues);
167
- return {
168
- success: true,
169
- values: currentValues
170
- };
171
163
  } else {
172
- onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed({
173
- values: currentValues,
174
- errors: newErrors
175
- });
176
- return {
177
- success: false,
178
- errors: newErrors
179
- };
164
+ fieldMountCountsRef.current[name] = count;
180
165
  }
181
166
  });
182
- var handleSubmit = useEventCallback(function (e) {
183
- e === null || e === void 0 ? void 0 : e.preventDefault();
184
- return handleSubmitInternal();
185
- });
186
167
  // Pure state API: the imperative resetFields()
187
168
  // never fires onReset. The callback belongs to the reset ACTION layer
188
169
  // (submitter button / native reset event), which fires it exactly once.
189
170
  var resetFields = useMemoizedFn(function () {
171
+ // Invalidate in-flight async validation runs — their results belong to
172
+ // pre-reset values and must not stamp errors onto the reset form.
173
+ invalidateValidationRuns();
190
174
  store.setState({
191
175
  values: mountInitialValues,
192
176
  errors: {},
@@ -203,47 +187,60 @@ export var useFormCore = function useFormCore() {
203
187
  var getFieldValue = useMemoizedFn(function (name) {
204
188
  return resolveValue(store.getState().values, name);
205
189
  });
206
- var getFieldsValue = useMemoizedFn(function () {
207
- return store.getState().values;
190
+ var getFieldsValue = useMemoizedFn(function (nameList) {
191
+ var values = store.getState().values;
192
+ if (!nameList) return values;
193
+ return nameList.reduce(function (acc, name) {
194
+ acc[name] = resolveValue(values, name);
195
+ return acc;
196
+ }, {});
208
197
  });
209
198
  var setFieldsValue = useMemoizedFn(function (newValues) {
210
- var updatedValues = Object.assign(Object.assign({}, store.getState().values), newValues);
199
+ var valuesPatch = newValues;
200
+ var prev = store.getState().values;
201
+ var updatedValues;
202
+ if (Object.keys(valuesPatch).some(function (key) {
203
+ return key.includes('.');
204
+ })) {
205
+ // Dot-path keys write into the NESTED structure (the setFieldValue
206
+ // contract) — a shallow merge would land them as literal top-level
207
+ // keys that the nested-aware readers never find.
208
+ updatedValues = prev;
209
+ for (var _i = 0, _Object$entries = Object.entries(valuesPatch); _i < _Object$entries.length; _i++) {
210
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
211
+ key = _Object$entries$_i[0],
212
+ value = _Object$entries$_i[1];
213
+ updatedValues = key.includes('.') ? setNestedValue(updatedValues, key, value) : mergeValuesPatch(updatedValues, _defineProperty({}, key, value));
214
+ }
215
+ } else {
216
+ updatedValues = mergeValuesPatch(prev, valuesPatch);
217
+ }
211
218
  commitValues(updatedValues);
212
- onValuesChange === null || onValuesChange === void 0 ? void 0 : onValuesChange(newValues, updatedValues);
219
+ onValuesChange === null || onValuesChange === void 0 ? void 0 : onValuesChange(valuesPatch, updatedValues);
213
220
  });
221
+ // Seed the rule-context instance with the core methods exactly once —
222
+ // useForm's richer instance must not be downgraded on later renders.
223
+ if (Object.keys(ruleContextInstanceRef.current).length === 0) {
224
+ ruleContextInstanceRef.current = {
225
+ getFieldValue: getFieldValue,
226
+ getFieldsValue: getFieldsValue,
227
+ setFieldValue: setFieldValue,
228
+ setFieldsValue: setFieldsValue,
229
+ resetFields: resetFields
230
+ };
231
+ }
214
232
  var formInstance = useMemo(function () {
215
233
  return {
216
- submit: handleSubmitInternal,
217
234
  resetFields: resetFields,
218
235
  getFieldValue: getFieldValue,
219
236
  getFieldsValue: getFieldsValue,
220
237
  setFieldsValue: setFieldsValue,
221
- setFieldValue: setFieldValue,
222
- validateFields: validateFields
238
+ setFieldValue: setFieldValue
223
239
  };
224
- }, [handleSubmitInternal, resetFields, getFieldValue, getFieldsValue, setFieldsValue, setFieldValue, validateFields]);
240
+ }, [resetFields, getFieldValue, getFieldsValue, setFieldsValue, setFieldValue]);
225
241
  // Render-time snapshot — kept for the UseFormCoreReturn contract. Reactive
226
242
  // consumers must go through the store, never through these fields.
227
243
  var state = store.getState();
228
- var coreContextShape = {
229
- values: state.values,
230
- errors: state.errors,
231
- warnings: state.warnings,
232
- touched: state.touched,
233
- formInstance: formInstance,
234
- setFieldValue: setFieldValue,
235
- setFieldError: setFieldError,
236
- setFieldWarning: setFieldWarning,
237
- validateField: validateField,
238
- registerField: registerField,
239
- unregisterField: unregisterField,
240
- size: size,
241
- labelAlign: labelAlign,
242
- disabled: disabled,
243
- colon: colon,
244
- requiredMark: requiredMark,
245
- validateTrigger: validateTrigger
246
- };
247
244
  return {
248
245
  values: state.values,
249
246
  errors: state.errors,
@@ -252,21 +249,24 @@ export var useFormCore = function useFormCore() {
252
249
  // Live registry — stable identity, mutated in place by register/unregister.
253
250
  fieldRules: fieldRulesRef.current,
254
251
  getFieldRules: getFieldRules,
252
+ getRuleContextInstance: getRuleContextInstance,
253
+ setRuleContextInstance: setRuleContextInstance,
254
+ beginValidationRun: beginValidationRun,
255
+ isValidationRunCurrent: isValidationRunCurrent,
256
+ invalidateValidationRuns: invalidateValidationRuns,
255
257
  setFieldValue: setFieldValue,
256
258
  setFieldError: setFieldError,
257
259
  setFieldWarning: setFieldWarning,
258
260
  setFieldsValue: setFieldsValue,
259
261
  getFieldValue: getFieldValue,
260
262
  getFieldsValue: getFieldsValue,
261
- validateField: validateField,
262
- validateFields: validateFields,
263
263
  registerField: registerField,
264
264
  unregisterField: unregisterField,
265
- handleSubmit: handleSubmit,
265
+ retainField: retainField,
266
+ releaseField: releaseField,
266
267
  handleReset: handleReset,
267
268
  resetFields: resetFields,
268
269
  formInstance: formInstance,
269
- coreContextShape: coreContextShape,
270
270
  store: store,
271
271
  getInitialValues: function getInitialValues() {
272
272
  return mountInitialValues;
@@ -274,4 +274,4 @@ export var useFormCore = function useFormCore() {
274
274
  };
275
275
  };
276
276
  export default useFormCore;
277
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtQ29yZS50cyIsImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm1Db3JlLmpzIl0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VFdmVudENhbGxiYWNrIiwidXNlTWVtb2l6ZWRGbiIsInJlc29sdmVWYWx1ZSIsInNldE5lc3RlZFZhbHVlIiwicnVuUnVsZXNTeW5jIiwiY3JlYXRlRm9ybVN0b3JlIiwidXNlRm9ybUNvcmUiLCJjb25maWciLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJfY29uZmlnJGluaXRpYWxWYWx1ZXMiLCJpbml0aWFsVmFsdWVzIiwib25GaW5pc2giLCJvbkZpbmlzaEZhaWxlZCIsIm9uVmFsdWVzQ2hhbmdlIiwib25SZXNldCIsIl9jb25maWckc2l6ZSIsInNpemUiLCJfY29uZmlnJGxhYmVsQWxpZ24iLCJsYWJlbEFsaWduIiwiX2NvbmZpZyRkaXNhYmxlZCIsImRpc2FibGVkIiwiX2NvbmZpZyRjb2xvbiIsImNvbG9uIiwiX2NvbmZpZyRyZXF1aXJlZE1hcmsiLCJyZXF1aXJlZE1hcmsiLCJfY29uZmlnJHZhbGlkYXRlVHJpZ2ciLCJ2YWxpZGF0ZVRyaWdnZXIiLCJpbml0aWFsVmFsdWVzUmVmIiwiY3VycmVudCIsIm1vdW50SW5pdGlhbFZhbHVlcyIsInN0b3JlUmVmIiwic3RvcmUiLCJmaWVsZFJ1bGVzUmVmIiwiY29tbWl0VmFsdWVzIiwibmV3VmFsdWVzIiwic2V0U3RhdGUiLCJ2YWx1ZXMiLCJzZXRGaWVsZFZhbHVlIiwibmFtZSIsInZhbHVlIiwicHJldiIsImdldFN0YXRlIiwiaW5jbHVkZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmaW5lUHJvcGVydHkiLCJlcnJvcnMiLCJuZXdFcnJvcnMiLCJzZXRGaWVsZEVycm9yIiwiZXJyb3IiLCJzZXRGaWVsZFdhcm5pbmciLCJ3YXJuaW5nIiwid2FybmluZ3MiLCJuZXdXYXJuaW5ncyIsInJlZ2lzdGVyRmllbGQiLCJydWxlcyIsImdldEZpZWxkUnVsZXMiLCJ1bnJlZ2lzdGVyRmllbGQiLCJ2YWxpZGF0ZUZpZWxkIiwicHJvdmlkZWRWYWx1ZSIsImN1cnJlbnRWYWx1ZXMiLCJfcnVuUnVsZXNTeW5jIiwidmFsaWRhdGVGaWVsZHMiLCJmaWVsZHNSdWxlc1RvVmFsaWRhdGUiLCJpc1ZhbGlkIiwia2V5cyIsImZvckVhY2giLCJoYW5kbGVTdWJtaXRJbnRlcm5hbCIsImN1cnJlbnRSdWxlcyIsImhhc0Vycm9ycyIsImZpZWxkTmFtZSIsIl9ydW5SdWxlc1N5bmMyIiwic3VjY2VzcyIsImhhbmRsZVN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInJlc2V0RmllbGRzIiwidG91Y2hlZCIsInZhbGlkYXRpbmciLCJoYW5kbGVSZXNldCIsImdldEZpZWxkVmFsdWUiLCJnZXRGaWVsZHNWYWx1ZSIsInNldEZpZWxkc1ZhbHVlIiwidXBkYXRlZFZhbHVlcyIsImZvcm1JbnN0YW5jZSIsInN1Ym1pdCIsInN0YXRlIiwiY29yZUNvbnRleHRTaGFwZSIsImZpZWxkUnVsZXMiLCJnZXRJbml0aWFsVmFsdWVzIl0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBU0EsT0FBTyxFQUFFQyxNQUFNLFFBQVEsT0FBTztBQUV2QyxPQUFPQyxnQkFBZ0IsTUFBTSxnQ0FBZ0M7QUFDN0QsT0FBT0MsYUFBYSxNQUFNLDZCQUE2QjtBQUN2RCxTQUFTQyxZQUFZLEVBQUVDLGNBQWMsUUFBUSxjQUFjO0FBQzNELFNBQVNDLFlBQVksUUFBUSxhQUFhO0FBQzFDLFNBQVNDLGVBQWUsUUFBUSxjQUFjO0FBUzlDLE9BQU8sSUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUEsRUFFdUU7RUFBQSxJQUQ3RkMsTUFBQSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBNEIsQ0FBQSxDQUFFO0VB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dHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm1Db3JlLmpzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCJpbXBvcnQgeyB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHVzZU1lbW9pemVkRm4gZnJvbSAnQDFtb25leS9ob29rcy91c2VNZW1vaXplZEZuJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSwgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuLi9wYXRoVXRpbHMnO1xuaW1wb3J0IHsgcnVuUnVsZXNTeW5jIH0gZnJvbSAnLi4vcnVuUnVsZXMnO1xuaW1wb3J0IHsgY3JlYXRlRm9ybVN0b3JlIH0gZnJvbSAnLi4vZm9ybVN0b3JlJztcbmV4cG9ydCBjb25zdCB1c2VGb3JtQ29yZSA9IChjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgaW5pdGlhbFZhbHVlcyA9IHt9LCBvbkZpbmlzaCwgb25GaW5pc2hGYWlsZWQsIG9uVmFsdWVzQ2hhbmdlLCBvblJlc2V0LCBzaXplID0gJ2xhcmdlJywgbGFiZWxBbGlnbiA9ICdsZWZ0JywgZGlzYWJsZWQgPSBmYWxzZSwgY29sb24gPSB0cnVlLCByZXF1aXJlZE1hcmsgPSB0cnVlLCB2YWxpZGF0ZVRyaWdnZXIgPSAnb25DaGFuZ2UnLCB9ID0gY29uZmlnO1xuICAgIC8vIGluaXRpYWxWYWx1ZXMgaXMgTU9VTlQtT05MWSAodGhlIGRvY3VtZW50ZWQgY29udHJhY3QpOiBmcmVlemUgdGhlIGZpcnN0XG4gICAgLy8gcmVuZGVyJ3MgdmFsdWUgc28gcmVzZXRGaWVsZHMgYWx3YXlzIHJlc3RvcmVzIHRoZSBtb3VudC10aW1lIGRlZmF1bHRzLFxuICAgIC8vIGV2ZW4gd2hlbiB0aGUgY29uc3VtZXIgcmUtcmVuZGVycyB3aXRoIGEgZGlmZmVyZW50IChlLmcuIGNvbnRyb2xsZWQpXG4gICAgLy8gaW5pdGlhbFZhbHVlcyBvYmplY3QuXG4gICAgY29uc3QgaW5pdGlhbFZhbHVlc1JlZiA9IHVzZVJlZihudWxsKTtcbiAgICBpZiAoaW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZXNSZWYuY3VycmVudCA9IGluaXRpYWxWYWx1ZXM7XG4gICAgfVxuICAgIGNvbnN0IG1vdW50SW5pdGlhbFZhbHVlcyA9IGluaXRpYWxWYWx1ZXNSZWYuY3VycmVudDtcbiAgICAvLyBBbGwgdm9sYXRpbGUgZm9ybSBzdGF0ZSBsaXZlcyBpbiBhbiBleHRlcm5hbCBzdG9yZSwgTk9UIFJlYWN0IHN0YXRlIOKAlCBhXG4gICAgLy8ga2V5c3Ryb2tlIG11c3QgbmV2ZXIgcmUtcmVuZGVyIHRoZSBjb21wb25lbnQgdGhhdCBvd25zIHRoZSBmb3JtLiBGaWVsZHNcbiAgICAvLyBhbmQgd2F0Y2hlcnMgc3Vic2NyaWJlIHdpdGggcGVyLWZpZWxkIHNlbGVjdG9ycyAodXNlU3RvcmVTZWxlY3Rvcik7IGV2ZXJ5XG4gICAgLy8gbXV0YXRvciBiZWxvdyByZWFkcyB0aGUgTEFURVNUIHN0YXRlIHZpYSBzdG9yZS5nZXRTdGF0ZSgpLCB3aGljaCBhbHNvXG4gICAgLy8ga2VlcHMgbXVsdGlwbGUgd3JpdGVzIGluIHRoZSBzYW1lIHRpY2sgdmlzaWJsZSB0byBlYWNoIG90aGVyLlxuICAgIGNvbnN0IHN0b3JlUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGlmIChzdG9yZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHN0b3JlUmVmLmN1cnJlbnQgPSBjcmVhdGVGb3JtU3RvcmUobW91bnRJbml0aWFsVmFsdWVzKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBzdG9yZVJlZi5jdXJyZW50O1xuICAgIC8vIExpdmUgcnVsZSByZWdpc3RyeSDigJQgT05FIHN0YWJsZSBvYmplY3QgbXV0YXRlZCBpbiBwbGFjZS4gUmVnaXN0cmF0aW9uIG11c3RcbiAgICAvLyBub3QgdHJpZ2dlciByZW5kZXJzLCBhbmQgc3VibWl0LXRpbWUgdmFsaWRhdGlvbiBtdXN0IGFsd2F5cyByZWFkIHRoZSBsYXRlc3RcbiAgICAvLyBydWxlcyAodGhleSBjYW4gY2hhbmdlIGJldHdlZW4gcmVuZGVycywgZS5nLiBhIGNvbmRpdGlvbmFsIGByZXF1aXJlZGApLlxuICAgIGNvbnN0IGZpZWxkUnVsZXNSZWYgPSB1c2VSZWYoe30pO1xuICAgIGNvbnN0IGNvbW1pdFZhbHVlcyA9IHVzZU1lbW9pemVkRm4oKG5ld1ZhbHVlcykgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHZhbHVlczogbmV3VmFsdWVzIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkVmFsdWUgPSB1c2VNZW1vaXplZEZuKChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gc3RvcmUuZ2V0U3RhdGUoKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5hbWUuaW5jbHVkZXMoJy4nKVxuICAgICAgICAgICAgPyBzZXROZXN0ZWRWYWx1ZShwcmV2LCBuYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICBjb21taXRWYWx1ZXMobmV3VmFsdWVzKTtcbiAgICAgICAgb25WYWx1ZXNDaGFuZ2UgPT09IG51bGwgfHwgb25WYWx1ZXNDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uVmFsdWVzQ2hhbmdlKHsgW25hbWVdOiB2YWx1ZSB9LCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAodmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzO1xuICAgICAgICAgICAgaWYgKGVycm9yc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIGVycm9ycyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld0Vycm9yc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IGVycm9yczogbmV3RXJyb3JzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRFcnJvciA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzO1xuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghZXJyb3JzW25hbWVdKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIGVycm9ycyk7XG4gICAgICAgICAgICBkZWxldGUgbmV3RXJyb3JzW25hbWVdO1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBlcnJvcnM6IG5ld0Vycm9ycyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3JzW25hbWVdID09PSBlcnJvcilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBlcnJvcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXJyb3JzKSwgeyBbbmFtZV06IGVycm9yIH0pIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkV2FybmluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBzdG9yZS5nZXRTdGF0ZSgpLndhcm5pbmdzO1xuICAgICAgICBpZiAod2FybmluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF3YXJuaW5nc1tuYW1lXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBuZXdXYXJuaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHdhcm5pbmdzKTtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdXYXJuaW5nc1tuYW1lXTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgd2FybmluZ3M6IG5ld1dhcm5pbmdzIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3YXJuaW5nc1tuYW1lXSA9PT0gd2FybmluZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB3YXJuaW5nczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB3YXJuaW5ncyksIHsgW25hbWVdOiB3YXJuaW5nIH0pIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlZ2lzdGVyRmllbGQgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBydWxlcykgPT4ge1xuICAgICAgICBmaWVsZFJ1bGVzUmVmLmN1cnJlbnRbbmFtZV0gPSBydWxlcztcbiAgICB9KTtcbiAgICBjb25zdCBnZXRGaWVsZFJ1bGVzID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGRSdWxlc1JlZi5jdXJyZW50W25hbWVdO1xuICAgIH0pO1xuICAgIGNvbnN0IHVucmVnaXN0ZXJGaWVsZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHtcbiAgICAgICAgZGVsZXRlIGZpZWxkUnVsZXNSZWYuY3VycmVudFtuYW1lXTtcbiAgICB9KTtcbiAgICBjb25zdCB2YWxpZGF0ZUZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgcnVsZXMgPSBbXSwgcHJvdmlkZWRWYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gc3RvcmUuZ2V0U3RhdGUoKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJvdmlkZWRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gcHJvdmlkZWRWYWx1ZSA6IHJlc29sdmVWYWx1ZShjdXJyZW50VmFsdWVzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgeyBlcnJvciwgd2FybmluZyB9ID0gcnVuUnVsZXNTeW5jKG5hbWUsIHZhbHVlLCBjdXJyZW50VmFsdWVzLCBydWxlcyk7XG4gICAgICAgIHNldEZpZWxkV2FybmluZyhuYW1lLCB3YXJuaW5nKTtcbiAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRGaWVsZEVycm9yKG5hbWUsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHNldEZpZWxkRXJyb3IobmFtZSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgY29uc3QgdmFsaWRhdGVGaWVsZHMgPSB1c2VNZW1vaXplZEZuKChmaWVsZHNSdWxlc1RvVmFsaWRhdGUgPSBmaWVsZFJ1bGVzUmVmLmN1cnJlbnQpID0+IHtcbiAgICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICBPYmplY3Qua2V5cyhmaWVsZHNSdWxlc1RvVmFsaWRhdGUpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVzID0gZmllbGRzUnVsZXNUb1ZhbGlkYXRlW25hbWVdO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUZpZWxkKG5hbWUsIHJ1bGVzKSkge1xuICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH0pO1xuICAgIGNvbnN0IGhhbmRsZVN1Ym1pdEludGVybmFsID0gdXNlTWVtb2l6ZWRGbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgY29uc3QgY3VycmVudFJ1bGVzID0gZmllbGRSdWxlc1JlZi5jdXJyZW50O1xuICAgICAgICBsZXQgaGFzRXJyb3JzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IHt9O1xuICAgICAgICBjb25zdCBuZXdXYXJuaW5ncyA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50UnVsZXMpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXNvbHZlVmFsdWUoY3VycmVudFZhbHVlcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IsIHdhcm5pbmcgfSA9IHJ1blJ1bGVzU3luYyhmaWVsZE5hbWUsIHZhbHVlLCBjdXJyZW50VmFsdWVzLCBjdXJyZW50UnVsZXNbZmllbGROYW1lXSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZXdFcnJvcnNbZmllbGROYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FybmluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld1dhcm5pbmdzW2ZpZWxkTmFtZV0gPSB3YXJuaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBlcnJvcnM6IG5ld0Vycm9ycywgd2FybmluZ3M6IG5ld1dhcm5pbmdzIH0pO1xuICAgICAgICBpZiAoIWhhc0Vycm9ycykge1xuICAgICAgICAgICAgb25GaW5pc2ggPT09IG51bGwgfHwgb25GaW5pc2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRmluaXNoKGN1cnJlbnRWYWx1ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdmFsdWVzOiBjdXJyZW50VmFsdWVzIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvbkZpbmlzaEZhaWxlZCA9PT0gbnVsbCB8fCBvbkZpbmlzaEZhaWxlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2hGYWlsZWQoeyB2YWx1ZXM6IGN1cnJlbnRWYWx1ZXMsIGVycm9yczogbmV3RXJyb3JzIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yczogbmV3RXJyb3JzIH07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBoYW5kbGVTdWJtaXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gaGFuZGxlU3VibWl0SW50ZXJuYWwoKTtcbiAgICB9KTtcbiAgICAvLyBQdXJlIHN0YXRlIEFQSTogdGhlIGltcGVyYXRpdmUgcmVzZXRGaWVsZHMoKVxuICAgIC8vIG5ldmVyIGZpcmVzIG9uUmVzZXQuIFRoZSBjYWxsYmFjayBiZWxvbmdzIHRvIHRoZSByZXNldCBBQ1RJT04gbGF5ZXJcbiAgICAvLyAoc3VibWl0dGVyIGJ1dHRvbiAvIG5hdGl2ZSByZXNldCBldmVudCksIHdoaWNoIGZpcmVzIGl0IGV4YWN0bHkgb25jZS5cbiAgICBjb25zdCByZXNldEZpZWxkcyA9IHVzZU1lbW9pemVkRm4oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB2YWx1ZXM6IG1vdW50SW5pdGlhbFZhbHVlcyxcbiAgICAgICAgICAgIGVycm9yczoge30sXG4gICAgICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgICAgICB0b3VjaGVkOiB7fSxcbiAgICAgICAgICAgIHZhbGlkYXRpbmc6IHt9LFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBoYW5kbGVSZXNldCA9IHVzZUV2ZW50Q2FsbGJhY2soKGUpID0+IHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJlc2V0RmllbGRzKCk7XG4gICAgICAgIG9uUmVzZXQgPT09IG51bGwgfHwgb25SZXNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZXNldCgpO1xuICAgIH0pO1xuICAgIGNvbnN0IGdldEZpZWxkVmFsdWUgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVmFsdWUoc3RvcmUuZ2V0U3RhdGUoKS52YWx1ZXMsIG5hbWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IGdldEZpZWxkc1ZhbHVlID0gdXNlTWVtb2l6ZWRGbigoKSA9PiB7XG4gICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICB9KTtcbiAgICBjb25zdCBzZXRGaWVsZHNWYWx1ZSA9IHVzZU1lbW9pemVkRm4oKG5ld1ZhbHVlcykgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkVmFsdWVzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcyksIG5ld1ZhbHVlcyk7XG4gICAgICAgIGNvbW1pdFZhbHVlcyh1cGRhdGVkVmFsdWVzKTtcbiAgICAgICAgb25WYWx1ZXNDaGFuZ2UgPT09IG51bGwgfHwgb25WYWx1ZXNDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uVmFsdWVzQ2hhbmdlKG5ld1ZhbHVlcywgdXBkYXRlZFZhbHVlcyk7XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUluc3RhbmNlID0gdXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBzdWJtaXQ6IGhhbmRsZVN1Ym1pdEludGVybmFsLFxuICAgICAgICByZXNldEZpZWxkcyxcbiAgICAgICAgZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZ2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHNldEZpZWxkc1ZhbHVlLFxuICAgICAgICBzZXRGaWVsZFZhbHVlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkcyxcbiAgICB9KSwgW1xuICAgICAgICBoYW5kbGVTdWJtaXRJbnRlcm5hbCxcbiAgICAgICAgcmVzZXRGaWVsZHMsXG4gICAgICAgIGdldEZpZWxkVmFsdWUsXG4gICAgICAgIGdldEZpZWxkc1ZhbHVlLFxuICAgICAgICBzZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgdmFsaWRhdGVGaWVsZHMsXG4gICAgXSk7XG4gICAgLy8gUmVuZGVyLXRpbWUgc25hcHNob3Qg4oCUIGtlcHQgZm9yIHRoZSBVc2VGb3JtQ29yZVJldHVybiBjb250cmFjdC4gUmVhY3RpdmVcbiAgICAvLyBjb25zdW1lcnMgbXVzdCBnbyB0aHJvdWdoIHRoZSBzdG9yZSwgbmV2ZXIgdGhyb3VnaCB0aGVzZSBmaWVsZHMuXG4gICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvcmVDb250ZXh0U2hhcGUgPSB7XG4gICAgICAgIHZhbHVlczogc3RhdGUudmFsdWVzLFxuICAgICAgICBlcnJvcnM6IHN0YXRlLmVycm9ycyxcbiAgICAgICAgd2FybmluZ3M6IHN0YXRlLndhcm5pbmdzLFxuICAgICAgICB0b3VjaGVkOiBzdGF0ZS50b3VjaGVkLFxuICAgICAgICBmb3JtSW5zdGFuY2UsXG4gICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldEZpZWxkRXJyb3IsXG4gICAgICAgIHNldEZpZWxkV2FybmluZyxcbiAgICAgICAgdmFsaWRhdGVGaWVsZCxcbiAgICAgICAgcmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgdW5yZWdpc3RlckZpZWxkLFxuICAgICAgICBzaXplLFxuICAgICAgICBsYWJlbEFsaWduLFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgY29sb24sXG4gICAgICAgIHJlcXVpcmVkTWFyayxcbiAgICAgICAgdmFsaWRhdGVUcmlnZ2VyLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWVzOiBzdGF0ZS52YWx1ZXMsXG4gICAgICAgIGVycm9yczogc3RhdGUuZXJyb3JzLFxuICAgICAgICB3YXJuaW5nczogc3RhdGUud2FybmluZ3MsXG4gICAgICAgIHRvdWNoZWQ6IHN0YXRlLnRvdWNoZWQsXG4gICAgICAgIC8vIExpdmUgcmVnaXN0cnkg4oCUIHN0YWJsZSBpZGVudGl0eSwgbXV0YXRlZCBpbiBwbGFjZSBieSByZWdpc3Rlci91bnJlZ2lzdGVyLlxuICAgICAgICBmaWVsZFJ1bGVzOiBmaWVsZFJ1bGVzUmVmLmN1cnJlbnQsXG4gICAgICAgIGdldEZpZWxkUnVsZXMsXG4gICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldEZpZWxkRXJyb3IsXG4gICAgICAgIHNldEZpZWxkV2FybmluZyxcbiAgICAgICAgc2V0RmllbGRzVmFsdWUsXG4gICAgICAgIGdldEZpZWxkVmFsdWUsXG4gICAgICAgIGdldEZpZWxkc1ZhbHVlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkcyxcbiAgICAgICAgcmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgdW5yZWdpc3RlckZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgICAgICByZXNldEZpZWxkcyxcbiAgICAgICAgZm9ybUluc3RhbmNlLFxuICAgICAgICBjb3JlQ29udGV4dFNoYXBlLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgZ2V0SW5pdGlhbFZhbHVlczogKCkgPT4gbW91bnRJbml0aWFsVmFsdWVzLFxuICAgIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlRm9ybUNvcmU7Il0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==
277
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtQ29yZS50cyIsImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm1Db3JlLmpzIl0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VFdmVudENhbGxiYWNrIiwidXNlTWVtb2l6ZWRGbiIsIm1lcmdlVmFsdWVzUGF0Y2giLCJyZXNvbHZlVmFsdWUiLCJzZXROZXN0ZWRWYWx1ZSIsImNyZWF0ZUZvcm1TdG9yZSIsInNhbWVWYWxpZGF0aW9uTm9kZSIsInVzZUZvcm1Db3JlIiwiY29uZmlnIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX2NvbmZpZyRpbml0aWFsVmFsdWVzIiwiaW5pdGlhbFZhbHVlcyIsIm9uVmFsdWVzQ2hhbmdlIiwib25SZXNldCIsIl9jb25maWckc2l6ZSIsInNpemUiLCJfY29uZmlnJGxhYmVsQWxpZ24iLCJsYWJlbEFsaWduIiwiX2NvbmZpZyRkaXNhYmxlZCIsImRpc2FibGVkIiwiX2NvbmZpZyR2YWxpZGF0ZVRyaWdnIiwidmFsaWRhdGVUcmlnZ2VyIiwiaW5pdGlhbFZhbHVlc1JlZiIsImN1cnJlbnQiLCJtb3VudEluaXRpYWxWYWx1ZXMiLCJzdG9yZVJlZiIsInN0b3JlIiwiZmllbGRSdWxlc1JlZiIsInZhbGlkYXRpb25FcG9jaFJlZiIsImJlZ2luVmFsaWRhdGlvblJ1biIsIm5hbWUiLCJuZXh0IiwiaXNWYWxpZGF0aW9uUnVuQ3VycmVudCIsImVwb2NoIiwiaW52YWxpZGF0ZVZhbGlkYXRpb25SdW5zIiwibmFtZXMiLCJrZXlzIiwiT2JqZWN0IiwiZm9yRWFjaCIsImtleSIsInJ1bGVDb250ZXh0SW5zdGFuY2VSZWYiLCJzZXRSdWxlQ29udGV4dEluc3RhbmNlIiwiaW5zdGFuY2UiLCJnZXRSdWxlQ29udGV4dEluc3RhbmNlIiwiY29tbWl0VmFsdWVzIiwibmV3VmFsdWVzIiwic2V0U3RhdGUiLCJ2YWx1ZXMiLCJzZXRGaWVsZFZhbHVlIiwidmFsdWUiLCJwcmV2IiwiZ2V0U3RhdGUiLCJpbmNsdWRlcyIsImFzc2lnbiIsIl9kZWZpbmVQcm9wZXJ0eSIsInNldEZpZWxkRXJyb3IiLCJlcnJvciIsImVycm9ycyIsIm5ld0Vycm9ycyIsInNldEZpZWxkV2FybmluZyIsIndhcm5pbmciLCJ3YXJuaW5ncyIsIm5ld1dhcm5pbmdzIiwiZmllbGRNb3VudENvdW50c1JlZiIsImZpZWxkUmVnaXN0cmF0aW9uT3duZWRSZWYiLCJyZWdpc3RlckZpZWxkIiwicnVsZXMiLCJnZXRGaWVsZFJ1bGVzIiwidW5yZWdpc3RlckZpZWxkIiwicmV0YWluRmllbGQiLCJyZWxlYXNlRmllbGQiLCJjb3VudCIsInJlc2V0RmllbGRzIiwidG91Y2hlZCIsInZhbGlkYXRpbmciLCJoYW5kbGVSZXNldCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsImdldEZpZWxkVmFsdWUiLCJnZXRGaWVsZHNWYWx1ZSIsIm5hbWVMaXN0IiwicmVkdWNlIiwiYWNjIiwic2V0RmllbGRzVmFsdWUiLCJ2YWx1ZXNQYXRjaCIsInVwZGF0ZWRWYWx1ZXMiLCJzb21lIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJlbnRyaWVzIiwiX09iamVjdCRlbnRyaWVzJF9pIiwiX3NsaWNlZFRvQXJyYXkiLCJmb3JtSW5zdGFuY2UiLCJzdGF0ZSIsImZpZWxkUnVsZXMiLCJnZXRJbml0aWFsVmFsdWVzIl0sIm1hcHBpbmdzIjoiOztBQUFBLFNBQVNBLE9BQU8sRUFBRUMsTUFBTSxRQUFRLE9BQU87QUFFdkMsT0FBT0MsZ0JBQWdCLE1BQU0sZ0NBQWdDO0FBQzdELE9BQU9DLGFBQWEsTUFBTSw2QkFBNkI7QUFDdkQsU0FBU0MsZ0JBQWdCLEVBQUVDLFlBQVksRUFBRUMsY0FBYyxRQUFRLGNBQWM7QUFDN0UsU0FBU0MsZUFBZSxFQUFFQyxrQkFBa0IsUUFBUSxjQUFjO0FBV2xFLE9BQU8sSUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUEsRUFFMkU7RUFBQSxJQURqR0MsTUFBQSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBb0MsQ0FBQSxDQUFFO0VBRXRDLElBQUFHLHFCQUFBLEdBUUlKLE1BQU0sQ0FQUkssYUFBYTtJQUFiQSxhQUFhLEdBQUFELHFCQUFBLGNBQUcsQ0FBQSxDQUFFLEdBQUFBLHFCQUFBO0lBQ2xCRSxjQUFjLEdBTVpOLE1BQU0sQ0FOUk0sY0FBYztJQUNkQyxPQUFPLEdBS0xQLE1BQU0sQ0FMUk8sT0FBTztJQUFBQyxZQUFBLEdBS0xSLE1BQU0sQ0FKUlMsSUFBSTtJQUFKQSxJQUFJLEdBQUFELFlBQUEsY0FBRyxPQUFPLEdBQUFBLFlBQUE7SUFBQUUsa0JBQUEsR0FJWlYsTUFBTSxDQUhSVyxVQUFVO0lBQVZBLFVBQVUsR0FBQUQsa0JBQUEsY0FBRyxNQUFNLEdBQUFBLGtCQUFBO0lBQUFFLGdCQUFBLEdBR2pCWixNQUFNLENBRlJhLFFBQVE7SUFBUkEsUUFBUSxHQUFBRCxnQkFBQSxjQUFHLEtBQUssR0FBQUEsZ0JBQUE7SUFBQUUscUJBQUEsR0FFZGQsTUFBTSxDQURSZSxlQUFlO0lBQWZBLGVBQWUsR0FBQUQscUJBQUEsY0FBRyxVQUFVLEdBQUFBLHFCQUFBO0VBRzlCO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsSUFBTUUsZ0JBQWdCLEdBQUd6QixNQUFNLENBQTZCLElBQUksQ0FBQztFQUNqRSxJQUFJeUIsZ0JBQWdCLENBQUNDLE9BQU8sS0FBSyxJQUFJLEVBQUU7SUFDckNELGdCQUFnQixDQUFDQyxPQUFPLEdBQUdaLGFBQW9DO0VBQ2pFO0VBQ0EsSUFBTWEsa0JBQWtCLEdBQUdGLGdCQUFnQixDQUFDQyxPQUFPO0VBRW5EO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFNRSxRQUFRLEdBQUc1QixNQUFNLENBQW1CLElBQUksQ0FBQztFQUMvQyxJQUFJNEIsUUFBUSxDQUFDRixPQUFPLEtBQUssSUFBSSxFQUFFO0lBQzdCRSxRQUFRLENBQUNGLE9BQU8sR0FBR3BCLGVBQWUsQ0FBQ3FCLGtCQUFrQixDQUFDO0VBQ3hEO0VBQ0EsSUFBTUUsS0FBSyxHQUFHRCxRQUFRLENBQUNGLE9BQU87RUFFOUI7RUFDQTtFQUNBO0VBQ0EsSUFBTUksYUFBYSxHQUFHOUIsTUFBTSxDQUFxQyxDQUFBLENBQUUsQ0FBQztFQUVwRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLElBQU0rQixrQkFBa0IsR0FBRy9CLE1BQU0sQ0FBeUIsQ0FBQSxDQUFFLENBQUM7RUFDN0QsSUFBTWdDLGtCQUFrQixHQUFHOUIsYUFBYSxDQUFDLFVBQUMrQixJQUFZLEVBQVk7SUFDaEUsSUFBTUMsSUFBSSxHQUFHLENBQUNILGtCQUFrQixDQUFDTCxPQUFPLENBQUNPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hERixrQkFBa0IsQ0FBQ0wsT0FBTyxDQUFDTyxJQUFJLENBQUMsR0FBR0MsSUFBSTtJQUN2QyxPQUFPQSxJQUFJO0VBQ2IsQ0FBQyxDQUFDO0VBQ0YsSUFBTUMsc0JBQXNCLEdBQUdqQyxhQUFhLENBQzFDLFVBQUMrQixJQUFZLEVBQUVHLEtBQWE7SUFBQSxPQUFjTCxrQkFBa0IsQ0FBQ0wsT0FBTyxDQUFDTyxJQUFJLENBQUMsS0FBS0csS0FBSztFQUFBLEVBQ3JGO0VBQ0Q7RUFDQTtFQUNBLElBQU1DLHdCQUF3QixHQUFHbkMsYUFBYSxDQUFDLFVBQUNvQyxLQUFnQixFQUFJO0lBQ2xFLElBQU1DLElBQUksR0FBR0QsS0FBSyxLQUFBLElBQUEsSUFBTEEsS0FBSyxLQUFBLEtBQUEsQ0FBQSxHQUFMQSxLQUFLLEdBQUlFLE1BQU0sQ0FBQ0QsSUFBSSxDQUFDUixrQkFBa0IsQ0FBQ0wsT0FBTyxDQUFDO0lBQzdEYSxJQUFJLENBQUNFLE9BQU8sQ0FBQyxVQUFDQyxHQUFHLEVBQUk7TUFDbkIsSUFBSVgsa0JBQWtCLENBQUNMLE9BQU8sQ0FBQ2dCLEdBQUcsQ0FBQyxLQUFLOUIsU0FBUyxFQUFFO1FBQ2pEbUIsa0JBQWtCLENBQUNMLE9BQU8sQ0FBQ2dCLEdBQUcsQ0FBQyxJQUFJLENBQUM7TUFDdEM7SUFDRixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRjtFQUNBO0VBQ0E7RUFDQTtFQUNBLElBQU1DLHNCQUFzQixHQUFHM0MsTUFBTSxDQUErQixDQUFBLENBQUUsQ0FBQztFQUN2RSxJQUFNNEMsc0JBQXNCLEdBQUcxQyxhQUFhLENBQUMsVUFBQzJDLFFBQXNDLEVBQUk7SUFDdEZGLHNCQUFzQixDQUFDakIsT0FBTyxHQUFHbUIsUUFBUTtFQUMzQyxDQUFDLENBQUM7RUFDRixJQUFNQyxzQkFBc0IsR0FBRzVDLGFBQWEsQ0FBQztJQUFBLE9BQU15QyxzQkFBc0IsQ0FBQ2pCLE9BQU87RUFBQSxFQUFDO0VBRWxGLElBQU1xQixZQUFZLEdBQUc3QyxhQUFhLENBQUMsVUFBQzhDLFNBQThCLEVBQUk7SUFDcEVuQixLQUFLLENBQUNvQixRQUFRLENBQUM7TUFBRUMsTUFBTSxFQUFFRjtJQUFTLENBQUUsQ0FBQztFQUN2QyxDQUFDLENBQUM7RUFFRjtFQUNBO0VBQ0E7RUFDQTtFQUNBLElBQU1HLGFBQWEsR0FBR2pELGFBQWEsQ0FBQyxVQUFDK0IsSUFBWSxFQUFFbUIsS0FBVSxFQUFJO0lBQy9ELElBQU1DLElBQUksR0FBR3hCLEtBQUssQ0FBQ3lCLFFBQVEsQ0FBQSxDQUFFLENBQUNKLE1BQU07SUFDcEMsSUFBTUYsU0FBUyxHQUFHZixJQUFJLENBQUNzQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQ2hDbEQsY0FBYyxDQUFDZ0QsSUFBSSxFQUFFcEIsSUFBSSxFQUFFbUIsS0FBSyxDQUFDLEdBQ2xDWixNQUFBLENBQUFnQixNQUFBLENBQUFoQixNQUFBLENBQUFnQixNQUFBLENBQUEsQ0FBQSxDQUFBLEVBQU1ILElBQUksQ0FBQSxFQUFBSSxlQUFBLEtBQUd4QixJQUFJLEVBQUdtQixLQUFLLENBQUEsQ0FBRTtJQUM5QkwsWUFBWSxDQUFDQyxTQUFTLENBQUM7SUFDdkJqQyxjQUFjLEtBQUEsSUFBQSxJQUFkQSxjQUFjLEtBQUEsS0FBQSxDQUFBLEdBQUEsS0FBQSxDQUFBLEdBQWRBLGNBQWMsQ0FBQTBDLGVBQUEsS0FBTXhCLElBQUksRUFBR21CLEtBQUssR0FBa0NKLFNBQW1CLENBQUM7RUFDeEYsQ0FBQyxDQUFDO0VBRUYsSUFBTVUsYUFBYSxHQUFHeEQsYUFBYSxDQUFDLFVBQUMrQixJQUFZLEVBQUUwQixLQUF1QixFQUFJO0lBQzVFLElBQU1DLE1BQU0sR0FBRy9CLEtBQUssQ0FBQ3lCLFFBQVEsQ0FBQSxDQUFFLENBQUNNLE1BQU07SUFDdEMsSUFBSUQsS0FBSyxLQUFLLElBQUksRUFBRTtNQUNsQixJQUFJLENBQUNDLE1BQU0sQ0FBQzNCLElBQUksQ0FBQyxFQUFFO01BQ25CLElBQU00QixTQUFTLEdBQUFyQixNQUFBLENBQUFnQixNQUFBLENBQUEsQ0FBQSxDQUFBLEVBQVFJLE1BQU0sQ0FBRTtNQUMvQixPQUFPQyxTQUFTLENBQUM1QixJQUFJLENBQUM7TUFDdEJKLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQztRQUFFVyxNQUFNLEVBQUVDO01BQVMsQ0FBRSxDQUFDO01BQ3JDO0lBQ0Y7SUFDQSxJQUFJdEQsa0JBQWtCLENBQUNxRCxNQUFNLENBQUMzQixJQUFJLENBQUMsRUFBRTBCLEtBQUssQ0FBQyxFQUFFO0lBQzdDOUIsS0FBSyxDQUFDb0IsUUFBUSxDQUFDO01BQUVXLE1BQU0sRUFBQXBCLE1BQUEsQ0FBQWdCLE1BQUEsQ0FBQWhCLE1BQUEsQ0FBQWdCLE1BQUEsQ0FBQSxDQUFBLENBQUEsRUFBT0ksTUFBTSxDQUFBLEVBQUFILGVBQUEsS0FBR3hCLElBQUksRUFBRzBCLEtBQUssQ0FBQTtJQUFFLENBQUUsQ0FBQztFQUMxRCxDQUFDLENBQUM7RUFFRixJQUFNRyxlQUFlLEdBQUc1RCxhQUFhLENBQUMsVUFBQytCLElBQVksRUFBRThCLE9BQXlCLEVBQUk7SUFDaEYsSUFBTUMsUUFBUSxHQUFHbkMsS0FBSyxDQUFDeUIsUUFBUSxDQUFBLENBQUUsQ0FBQ1UsUUFBUTtJQUMxQyxJQUFJRCxPQUFPLEtBQUssSUFBSSxFQUFFO01BQ3BCLElBQUksQ0FBQ0MsUUFBUSxDQUFDL0IsSUFBSSxDQUFDLEVBQUU7TUFDckIsSUFBTWdDLFdBQVcsR0FBQXpCLE1BQUEsQ0FBQWdCLE1BQUEsQ0FBQSxDQUFBLENBQUEsRUFBUVEsUUFBUSxDQUFFO01BQ25DLE9BQU9DLFdBQVcsQ0FBQ2hDLElBQUksQ0FBQztNQUN4QkosS0FBSyxDQUFDb0IsUUFBUSxDQUFDO1FBQUVlLFFBQVEsRUFBRUM7TUFBVyxDQUFFLENBQUM7TUFDekM7SUFDRjtJQUNBLElBQUkxRCxrQkFBa0IsQ0FBQ3lELFFBQVEsQ0FBQy9CLElBQUksQ0FBQyxFQUFFOEIsT0FBTyxDQUFDLEVBQUU7SUFDakRsQyxLQUFLLENBQUNvQixRQUFRLENBQUM7TUFBRWUsUUFBUSxFQUFBeEIsTUFBQSxDQUFBZ0IsTUFBQSxDQUFBaEIsTUFBQSxDQUFBZ0IsTUFBQSxDQUFBLENBQUEsQ0FBQSxFQUFPUSxRQUFRLENBQUEsRUFBQVAsZUFBQSxLQUFHeEIsSUFBSSxFQUFHOEIsT0FBTyxDQUFBO0lBQUUsQ0FBRSxDQUFDO0VBQ2hFLENBQUMsQ0FBQztFQUVGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsSUFBTUcsbUJBQW1CLEdBQUdsRSxNQUFNLENBQXlCLENBQUEsQ0FBRSxDQUFDO0VBQzlELElBQU1tRSx5QkFBeUIsR0FBR25FLE1BQU0sQ0FBMEIsQ0FBQSxDQUFFLENBQUM7RUFFckUsSUFBTW9FLGFBQWEsR0FBR2xFLGFBQWEsQ0FBQyxVQUFDK0IsSUFBWSxFQUFFb0MsS0FBeUIsRUFBSTtJQUM5RXZDLGFBQWEsQ0FBQ0osT0FBTyxDQUFDTyxJQUFJLENBQUMsR0FBR29DLEtBQUs7SUFDbkNGLHlCQUF5QixDQUFDekMsT0FBTyxDQUFDTyxJQUFJLENBQUMsR0FBRyxDQUFDaUMsbUJBQW1CLENBQUN4QyxPQUFPLENBQUNPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3hGLENBQUMsQ0FBQztFQUVGLElBQU1xQyxhQUFhLEdBQUdwRSxhQUFhLENBQUMsVUFBQytCLElBQVksRUFBb0M7SUFDbkYsT0FBT0gsYUFBYSxDQUFDSixPQUFPLENBQUNPLElBQUksQ0FBQztFQUNwQyxDQUFDLENBQUM7RUFFRixJQUFNc0MsZUFBZSxHQUFHckUsYUFBYSxDQUFDLFVBQUMrQixJQUFZLEVBQUk7SUFDckQsT0FBT0gsYUFBYSxDQUFDSixPQUFPLENBQUNPLElBQUksQ0FBQztJQUNsQyxPQUFPa0MseUJBQXlCLENBQUN6QyxPQUFPLENBQUNPLElBQUksQ0FBQztFQUNoRCxDQUFDLENBQUM7RUFFRixJQUFNdUMsV0FBVyxHQUFHdEUsYUFBYSxDQUFDLFVBQUMrQixJQUFZLEVBQUk7SUFDakRpQyxtQkFBbUIsQ0FBQ3hDLE9BQU8sQ0FBQ08sSUFBSSxDQUFDLEdBQUcsQ0FBQ2lDLG1CQUFtQixDQUFDeEMsT0FBTyxDQUFDTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNsRixDQUFDLENBQUM7RUFDRixJQUFNd0MsWUFBWSxHQUFHdkUsYUFBYSxDQUFDLFVBQUMrQixJQUFZLEVBQUk7SUFDbEQsSUFBTXlDLEtBQUssR0FBRyxDQUFDUixtQkFBbUIsQ0FBQ3hDLE9BQU8sQ0FBQ08sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDMUQsSUFBSXlDLEtBQUssSUFBSSxDQUFDLEVBQUU7TUFDZCxPQUFPUixtQkFBbUIsQ0FBQ3hDLE9BQU8sQ0FBQ08sSUFBSSxDQUFDO01BQ3hDLElBQUlrQyx5QkFBeUIsQ0FBQ3pDLE9BQU8sQ0FBQ08sSUFBSSxDQUFDLEVBQUU7UUFDM0MsT0FBT0gsYUFBYSxDQUFDSixPQUFPLENBQUNPLElBQUksQ0FBQztRQUNsQyxPQUFPa0MseUJBQXlCLENBQUN6QyxPQUFPLENBQUNPLElBQUksQ0FBQztNQUNoRDtJQUNGLENBQUMsTUFBTTtNQUNMaUMsbUJBQW1CLENBQUN4QyxPQUFPLENBQUNPLElBQUksQ0FBQyxHQUFHeUMsS0FBSztJQUMzQztFQUNGLENBQUMsQ0FBQztFQUVGO0VBQ0E7RUFDQTtFQUNBLElBQU1DLFdBQVcsR0FBR3pFLGFBQWEsQ0FBQyxZQUFLO0lBQ3JDO0lBQ0E7SUFDQW1DLHdCQUF3QixDQUFBLENBQUU7SUFDMUJSLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQztNQUNiQyxNQUFNLEVBQUV2QixrQkFBa0I7TUFDMUJpQyxNQUFNLEVBQUUsQ0FBQSxDQUFFO01BQ1ZJLFFBQVEsRUFBRSxDQUFBLENBQUU7TUFDWlksT0FBTyxFQUFFLENBQUEsQ0FBRTtNQUNYQyxVQUFVLEVBQUUsQ0FBQTtJQ2hDVixDRGlDSCxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUYsSUFBTUMsV0FBVyxHQUFHN0UsZ0JBQWdCLENBQUMsVUFBQzhFLENBQWEsRUFBSTtJQUNyREEsQ0FBQyxLQUFBLElBQUEsSUFBREEsQ0FBQyxLQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQUEsQ0FBQSxHQUFEQSxDQUFDLENBQUVDLGNBQWMsQ0FBQSxDQUFFO0lBQ25CTCxXQUFXLENBQUEsQ0FBRTtJQUNiM0QsT0FBTyxLQUFBLElBQUEsSUFBUEEsT0FBTyxLQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQUEsQ0FBQSxHQUFQQSxPQUFPLENBQUEsQ0FBSTtFQUNiLENBQUMsQ0FBQztFQUVGLElBQU1pRSxhQUFhLEdBQUcvRSxhQUFhLENBQUMsVUFBQytCLElBQVksRUFBUztJQUN4RCxPQUFPN0IsWUFBWSxDQUFDeUIsS0FBSyxDQUFDeUIsUUFBUSxDQUFBLENBQUUsQ0FBQ0osTUFBTSxFQUFFakIsSUFBSSxDQUFDO0VBQ3BELENBQUMsQ0FBQztFQUVGLElBQU1pRCxjQUFjLEdBQUdoRixhQUFhLENBQUMsVUFBQ2lGLFFBQW1CLEVBQXlCO0lBQ2hGLElBQU1qQyxNQUFNLEdBQUdyQixLQUFLLENBQUN5QixRQUFRLENBQUEsQ0FBRSxDQUFDSixNQUFNO0lBQ3RDLElBQUksQ0FBQ2lDLFFBQVEsRUFBRSxPQUFPakMsTUFBTTtJQUM1QixPQUFPaUMsUUFBUSxDQUFDQyxNQUFNLENBQXNCLFVBQUNDLEdBQUcsRUFBRXBELElBQUksRUFBSTtNQUN4RG9ELEdBQUcsQ0FBQ3BELElBQUksQ0FBQyxHQUFHN0IsWUFBWSxDQUFDOEMsTUFBTSxFQUFFakIsSUFBSSxDQUFDO01BQ3RDLE9BQU9vRCxHQUFHO0lBQ1osQ0FBQyxFQUFFLENBQUEsQ0FBRSxDQUFDO0VBQ1IsQ0FBQyxDQUFDO0VBRUYsSUFBTUMsY0FBYyxHQUFHcEYsYUFBYSxDQUFDLFVBQUM4QyxTQUFxQyxFQUFJO0lBQzdFLElBQU11QyxXQUFXLEdBQUd2QyxTQUFnQztJQUNwRCxJQUFNSyxJQUFJLEdBQUd4QixLQUFLLENBQUN5QixRQUFRLENBQUEsQ0FBRSxDQUFDSixNQUFNO0lBQ3BDLElBQUlzQyxhQUFrQztJQUN0QyxJQUFJaEQsTUFBTSxDQUFDRCxJQUFJLENBQUNnRCxXQUFXLENBQUMsQ0FBQ0UsSUFBSSxDQUFDLFVBQUMvQyxHQUFHO01BQUEsT0FBS0EsR0FBRyxDQUFDYSxRQUFRLENBQUMsR0FBRyxDQUFDO0lBQUEsRUFBQyxFQUFFO01BQzdEO01BQ0E7TUFDQTtNQUNBaUMsYUFBYSxHQUFHbkMsSUFBSTtNQUNwQixTQUFBcUMsRUFBQSxNQUFBQyxlQUFBLEdBQTJCbkQsTUFBTSxDQUFDb0QsT0FBTyxDQUFDTCxXQUFXLENBQUMsRUFBQUcsRUFBQSxHQUFBQyxlQUFBLENBQUFoRixNQUFBLEVBQUErRSxFQUFBLElBQUU7UUFBbkQsSUFBQUcsa0JBQUEsR0FBQUMsY0FBQSxDQUFBSCxlQUFBLENBQUFELEVBQUE7VUFBT2hELEdBQUcsR0FBQW1ELGtCQUFBO1VBQUV6QyxLQUFLLEdBQUF5QyxrQkFBQTtRQUNwQkwsYUFBYSxHQUFHOUMsR0FBRyxDQUFDYSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQzdCbEQsY0FBYyxDQUFDbUYsYUFBYSxFQUFFOUMsR0FBRyxFQUFFVSxLQUFLLENBQUMsR0FDekNqRCxnQkFBZ0IsQ0FBQ3FGLGFBQWEsRUFBQS9CLGVBQUEsS0FBS2YsR0FBRyxFQUFHVSxLQUFLLENBQUUsQ0FBQztNQUN2RDtJQUNGLENBQUMsTUFBTTtNQUNMb0MsYUFBYSxHQUFHckYsZ0JBQWdCLENBQUNrRCxJQUFJLEVBQUVrQyxXQUFXLENBQUM7SUFDckQ7SUFDQXhDLFlBQVksQ0FBQ3lDLGFBQWEsQ0FBQztJQUMzQnpFLGNBQWMsS0FBQSxJQUFBLElBQWRBLGNBQWMsS0FBQSxLQUFBLENBQUEsR0FBQSxLQUFBLENBQUEsR0FBZEEsY0FBYyxDQUFHd0UsV0FBeUMsRUFBRUMsYUFBdUIsQ0FBQztFQUN0RixDQUFDLENBQUM7RUFFRjtFQUNBO0VBQ0EsSUFBSWhELE1BQU0sQ0FBQ0QsSUFBSSxDQUFDSSxzQkFBc0IsQ0FBQ2pCLE9BQU8sQ0FBQyxDQUFDZixNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQzVEZ0Msc0JBQXNCLENBQUNqQixPQUFPLEdBQUc7TUFDL0J1RCxhQUFhLEVBQUVBLGFBQTBEO01BQ3pFQyxjQUFjLEVBQUVBLGNBQTREO01BQzVFL0IsYUFBYSxFQUFFQSxhQUEwRDtNQUN6RW1DLGNBQWMsRUFBRUEsY0FBNEQ7TUFDNUVYLFdBQVcsRUFBWEE7SUNuQ0UsQ0RvQ0g7RUFDSDtFQUVBLElBQU1vQixZQUFZLEdBQUdoRyxPQUFPLENBQzFCO0lBQUEsT0FBTztNQUNMNEUsV0FBVyxFQUFYQSxXQUFXO01BQ1hNLGFBQWEsRUFBRUEsYUFBMEQ7TUFDekVDLGNBQWMsRUFBRUEsY0FBNEQ7TUFDNUVJLGNBQWMsRUFBRUEsY0FBNEQ7TUFDNUVuQyxhQUFhLEVBQUVBO0lDckNqQixDRHNDQztFQUFBLENBQUMsRUFDRixDQUNFd0IsV0FBVyxFQUNYTSxhQUFhLEVBQ2JDLGNBQWMsRUFDZEksY0FBYyxFQUNkbkMsYUFBYSxDQUNkLENBQ0Y7RUFFRDtFQUNBO0VBQ0EsSUFBTTZDLEtBQUssR0FBR25FLEtBQUssQ0FBQ3lCLFFBQVEsQ0FBQSxDQUFFO0VBRTlCLE9BQU87SUFDTEosTUFBTSxFQUFFOEMsS0FBSyxDQUFDOUMsTUFBTTtJQUNwQlUsTUFBTSxFQUFFb0MsS0FBSyxDQUFDcEMsTUFBTTtJQUNwQkksUUFBUSxFQUFFZ0MsS0FBSyxDQUFDaEMsUUFBUTtJQUN4QlksT0FBTyxFQUFFb0IsS0FBSyxDQUFDcEIsT0FBTztJQUN0QjtJQUNBcUIsVUFBVSxFQUFFbkUsYUFBYSxDQUFDSixPQUFPO0lBQ2pDNEMsYUFBYSxFQUFiQSxhQUFhO0lBQ2J4QixzQkFBc0IsRUFBdEJBLHNCQUFzQjtJQUN0QkYsc0JBQXNCLEVBQXRCQSxzQkFBc0I7SUFDdEJaLGtCQUFrQixFQUFsQkEsa0JBQWtCO0lBQ2xCRyxzQkFBc0IsRUFBdEJBLHNCQUFzQjtJQUN0QkUsd0JBQXdCLEVBQXhCQSx3QkFBd0I7SUFDeEJjLGFBQWEsRUFBYkEsYUFBYTtJQUNiTyxhQUFhLEVBQWJBLGFBQWE7SUFDYkksZUFBZSxFQUFmQSxlQUFlO0lBQ2Z3QixjQUFjLEVBQWRBLGNBQWM7SUFDZEwsYUFBYSxFQUFiQSxhQUFhO0lBQ2JDLGNBQWMsRUFBRUEsY0FBNEQ7SUFDNUVkLGFBQWEsRUFBYkEsYUFBYTtJQUNiRyxlQUFlLEVBQWZBLGVBQWU7SUFDZkMsV0FBVyxFQUFYQSxXQUFXO0lBQ1hDLFlBQVksRUFBWkEsWUFBWTtJQUNaSyxXQUFXLEVBQVhBLFdBQVc7SUFDWEgsV0FBVyxFQUFYQSxXQUFXO0lBQ1hvQixZQUFZLEVBQVpBLFlBQVk7SUFDWmxFLEtBQUssRUFBTEEsS0FBSztJQUNMcUUsZ0JBQWdCLEVBQUUsU0FBbEJBLGdCQUFnQkEsQ0FBQTtNQUFBLE9BQVF2RSxrQkFBa0I7SUFBQTtFQ3pDMUMsQ0QwQ0Q7QUFDSCxDQUFDO0FBRUQsZUFBZW5CLFdBQVciLCJmaWxlIjoiY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybUNvcmUuanMiLCJzb3VyY2VzQ29udGVudCI6W251bGwsImltcG9ydCB7IHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlTWVtb2l6ZWRGbiBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZU1lbW9pemVkRm4nO1xuaW1wb3J0IHsgbWVyZ2VWYWx1ZXNQYXRjaCwgcmVzb2x2ZVZhbHVlLCBzZXROZXN0ZWRWYWx1ZSB9IGZyb20gJy4uL3BhdGhVdGlscyc7XG5pbXBvcnQgeyBjcmVhdGVGb3JtU3RvcmUsIHNhbWVWYWxpZGF0aW9uTm9kZSB9IGZyb20gJy4uL2Zvcm1TdG9yZSc7XG5leHBvcnQgY29uc3QgdXNlRm9ybUNvcmUgPSAoY29uZmlnID0ge30pID0+IHtcbiAgICBjb25zdCB7IGluaXRpYWxWYWx1ZXMgPSB7fSwgb25WYWx1ZXNDaGFuZ2UsIG9uUmVzZXQsIHNpemUgPSAnbGFyZ2UnLCBsYWJlbEFsaWduID0gJ2xlZnQnLCBkaXNhYmxlZCA9IGZhbHNlLCB2YWxpZGF0ZVRyaWdnZXIgPSAnb25DaGFuZ2UnLCB9ID0gY29uZmlnO1xuICAgIC8vIGluaXRpYWxWYWx1ZXMgaXMgTU9VTlQtT05MWSAodGhlIGRvY3VtZW50ZWQgY29udHJhY3QpOiBmcmVlemUgdGhlIGZpcnN0XG4gICAgLy8gcmVuZGVyJ3MgdmFsdWUgc28gcmVzZXRGaWVsZHMgYWx3YXlzIHJlc3RvcmVzIHRoZSBtb3VudC10aW1lIGRlZmF1bHRzLFxuICAgIC8vIGV2ZW4gd2hlbiB0aGUgY29uc3VtZXIgcmUtcmVuZGVycyB3aXRoIGEgZGlmZmVyZW50IChlLmcuIGNvbnRyb2xsZWQpXG4gICAgLy8gaW5pdGlhbFZhbHVlcyBvYmplY3QuXG4gICAgY29uc3QgaW5pdGlhbFZhbHVlc1JlZiA9IHVzZVJlZihudWxsKTtcbiAgICBpZiAoaW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZXNSZWYuY3VycmVudCA9IGluaXRpYWxWYWx1ZXM7XG4gICAgfVxuICAgIGNvbnN0IG1vdW50SW5pdGlhbFZhbHVlcyA9IGluaXRpYWxWYWx1ZXNSZWYuY3VycmVudDtcbiAgICAvLyBBbGwgdm9sYXRpbGUgZm9ybSBzdGF0ZSBsaXZlcyBpbiBhbiBleHRlcm5hbCBzdG9yZSwgTk9UIFJlYWN0IHN0YXRlIOKAlCBhXG4gICAgLy8ga2V5c3Ryb2tlIG11c3QgbmV2ZXIgcmUtcmVuZGVyIHRoZSBjb21wb25lbnQgdGhhdCBvd25zIHRoZSBmb3JtLiBGaWVsZHNcbiAgICAvLyBhbmQgd2F0Y2hlcnMgc3Vic2NyaWJlIHdpdGggcGVyLWZpZWxkIHNlbGVjdG9ycyAodXNlU3RvcmVTZWxlY3Rvcik7IGV2ZXJ5XG4gICAgLy8gbXV0YXRvciBiZWxvdyByZWFkcyB0aGUgTEFURVNUIHN0YXRlIHZpYSBzdG9yZS5nZXRTdGF0ZSgpLCB3aGljaCBhbHNvXG4gICAgLy8ga2VlcHMgbXVsdGlwbGUgd3JpdGVzIGluIHRoZSBzYW1lIHRpY2sgdmlzaWJsZSB0byBlYWNoIG90aGVyLlxuICAgIGNvbnN0IHN0b3JlUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGlmIChzdG9yZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHN0b3JlUmVmLmN1cnJlbnQgPSBjcmVhdGVGb3JtU3RvcmUobW91bnRJbml0aWFsVmFsdWVzKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBzdG9yZVJlZi5jdXJyZW50O1xuICAgIC8vIExpdmUgcnVsZSByZWdpc3RyeSDigJQgT05FIHN0YWJsZSBvYmplY3QgbXV0YXRlZCBpbiBwbGFjZS4gUmVnaXN0cmF0aW9uIG11c3RcbiAgICAvLyBub3QgdHJpZ2dlciByZW5kZXJzLCBhbmQgc3VibWl0LXRpbWUgdmFsaWRhdGlvbiBtdXN0IGFsd2F5cyByZWFkIHRoZSBsYXRlc3RcbiAgICAvLyBydWxlcyAodGhleSBjYW4gY2hhbmdlIGJldHdlZW4gcmVuZGVycywgZS5nLiBhIGNvbmRpdGlvbmFsIGByZXF1aXJlZGApLlxuICAgIGNvbnN0IGZpZWxkUnVsZXNSZWYgPSB1c2VSZWYoe30pO1xuICAgIC8vIFBlci1maWVsZCB2YWxpZGF0aW9uIHJ1biBlcG9jaHMuIEVWRVJZIHZhbGlkYXRpb24gcnVuIChzeW5jIG9yIGFzeW5jKVxuICAgIC8vIGJ1bXBzIGl0cyBmaWVsZCdzIGVwb2NoOyBhbiBhc3luYyBydW4gcmUtY2hlY2tzIGl0cyBjYXB0dXJlZCBlcG9jaCBhdFxuICAgIC8vIHNldHRsZSB0aW1lIGFuZCBkaXNjYXJkcyBhIFNUQUxFIG91dGNvbWUg4oCUIHRoZSBzYW1lIHByb3RlY3Rpb24gYXNcbiAgICAvLyByYy1maWVsZC1mb3JtJ3MgdmFsaWRhdGVQcm9taXNlIGlkZW50aXR5IGNoZWNrLiBXaXRob3V0IGl0LCBhIHNsb3cgYXN5bmNcbiAgICAvLyB2YWxpZGF0b3IgKGUuZy4gYSBzZXJ2ZXItc2lkZSB1bmlxdWVuZXNzIGNoZWNrIHN0YXJ0ZWQgb24gYmx1cikgY291bGRcbiAgICAvLyBzZXR0bGUgYWZ0ZXIgdGhlIHVzZXIgYWxyZWFkeSBmaXhlZCB0aGUgdmFsdWUgYW5kIHN0YW1wIGEgc3RhbGUgZXJyb3JcbiAgICAvLyBvdmVyIGEgbmV3ZXIsIHBhc3NpbmcgcmVzdWx0LlxuICAgIGNvbnN0IHZhbGlkYXRpb25FcG9jaFJlZiA9IHVzZVJlZih7fSk7XG4gICAgY29uc3QgYmVnaW5WYWxpZGF0aW9uUnVuID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0gKHZhbGlkYXRpb25FcG9jaFJlZi5jdXJyZW50W25hbWVdIHx8IDApICsgMTtcbiAgICAgICAgdmFsaWRhdGlvbkVwb2NoUmVmLmN1cnJlbnRbbmFtZV0gPSBuZXh0O1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgICBjb25zdCBpc1ZhbGlkYXRpb25SdW5DdXJyZW50ID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgZXBvY2gpID0+IHZhbGlkYXRpb25FcG9jaFJlZi5jdXJyZW50W25hbWVdID09PSBlcG9jaCk7XG4gICAgLy8gQnVtcCAobmV2ZXIgZGVsZXRlIOKAlCBkZWxldGlvbiB3b3VsZCBsZXQgYSBuZXcgcnVuIHJlLWlzc3VlIGFuIG9sZCBlcG9jaFxuICAgIC8vIG51bWJlciBhbmQgY29sbGlkZSB3aXRoIGEgc3RpbGwtaW4tZmxpZ2h0IHByZS1yZXNldCBydW4pLlxuICAgIGNvbnN0IGludmFsaWRhdGVWYWxpZGF0aW9uUnVucyA9IHVzZU1lbW9pemVkRm4oKG5hbWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBuYW1lcyAhPT0gbnVsbCAmJiBuYW1lcyAhPT0gdm9pZCAwID8gbmFtZXMgOiBPYmplY3Qua2V5cyh2YWxpZGF0aW9uRXBvY2hSZWYuY3VycmVudCk7XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbkVwb2NoUmVmLmN1cnJlbnRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVwb2NoUmVmLmN1cnJlbnRba2V5XSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBJbnN0YW5jZSBoYW5kZWQgdG8gZnVuY3Rpb24tZm9ybSBydWxlcy4gRGVmYXVsdHMgdG8gdGhlIGNvcmUgbWV0aG9kc1xuICAgIC8vIChhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIHRoaXMgaG9vayBib2R5KTsgdXNlRm9ybSB1cGdyYWRlcyBpdCB0byB0aGUgRlVMTFxuICAgIC8vIGZvcm0gaW5zdGFuY2Ugb25jZSBpdCBoYXMgYnVpbHQgb25lLCBzbyBydWxlcyBzZWUgdGhlIHNhbWUgY29udGV4dCBvblxuICAgIC8vIGV2ZXJ5IHBhdGggKGludGVyYWN0aXZlLCBibHVyLCBzdWJtaXQpLlxuICAgIGNvbnN0IHJ1bGVDb250ZXh0SW5zdGFuY2VSZWYgPSB1c2VSZWYoe30pO1xuICAgIGNvbnN0IHNldFJ1bGVDb250ZXh0SW5zdGFuY2UgPSB1c2VNZW1vaXplZEZuKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICBydWxlQ29udGV4dEluc3RhbmNlUmVmLmN1cnJlbnQgPSBpbnN0YW5jZTtcbiAgICB9KTtcbiAgICBjb25zdCBnZXRSdWxlQ29udGV4dEluc3RhbmNlID0gdXNlTWVtb2l6ZWRGbigoKSA9PiBydWxlQ29udGV4dEluc3RhbmNlUmVmLmN1cnJlbnQpO1xuICAgIGNvbnN0IGNvbW1pdFZhbHVlcyA9IHVzZU1lbW9pemVkRm4oKG5ld1ZhbHVlcykgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHZhbHVlczogbmV3VmFsdWVzIH0pO1xuICAgIH0pO1xuICAgIC8vIE5PVEU6IHNldHRpbmcgYSB2YWx1ZSBkb2VzIE5PVCB0b3VjaCB0aGUgZmllbGQncyBlcnJvciDigJQgZXJyb3JzIGFyZVxuICAgIC8vIGNsZWFyZWQgZXhjbHVzaXZlbHkgYnkgdmFsaWRhdGlvbiBydW5zICh3aG9zZSB0aW1pbmcgZm9sbG93cyB0aGVcbiAgICAvLyB2YWxpZGF0ZVRyaWdnZXIgY29uZmlnKSwgc28gYW4gb25CbHVyLW9ubHkgZmllbGQga2VlcHMgaXRzIGVycm9yIHdoaWxlXG4gICAgLy8gdGhlIHVzZXIgaXMgc3RpbGwgdHlwaW5nLlxuICAgIGNvbnN0IHNldEZpZWxkVmFsdWUgPSB1c2VNZW1vaXplZEZuKChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gc3RvcmUuZ2V0U3RhdGUoKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5hbWUuaW5jbHVkZXMoJy4nKVxuICAgICAgICAgICAgPyBzZXROZXN0ZWRWYWx1ZShwcmV2LCBuYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICBjb21taXRWYWx1ZXMobmV3VmFsdWVzKTtcbiAgICAgICAgb25WYWx1ZXNDaGFuZ2UgPT09IG51bGwgfHwgb25WYWx1ZXNDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uVmFsdWVzQ2hhbmdlKHsgW25hbWVdOiB2YWx1ZSB9LCBuZXdWYWx1ZXMpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBzdG9yZS5nZXRTdGF0ZSgpLmVycm9ycztcbiAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yc1tuYW1lXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBuZXdFcnJvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBlcnJvcnMpO1xuICAgICAgICAgICAgZGVsZXRlIG5ld0Vycm9yc1tuYW1lXTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgZXJyb3JzOiBuZXdFcnJvcnMgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhbWVWYWxpZGF0aW9uTm9kZShlcnJvcnNbbmFtZV0sIGVycm9yKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBlcnJvcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXJyb3JzKSwgeyBbbmFtZV06IGVycm9yIH0pIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkV2FybmluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBzdG9yZS5nZXRTdGF0ZSgpLndhcm5pbmdzO1xuICAgICAgICBpZiAod2FybmluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF3YXJuaW5nc1tuYW1lXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBuZXdXYXJuaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHdhcm5pbmdzKTtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdXYXJuaW5nc1tuYW1lXTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgd2FybmluZ3M6IG5ld1dhcm5pbmdzIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1lVmFsaWRhdGlvbk5vZGUod2FybmluZ3NbbmFtZV0sIHdhcm5pbmcpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHdhcm5pbmdzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHdhcm5pbmdzKSwgeyBbbmFtZV06IHdhcm5pbmcgfSkgfSk7XG4gICAgfSk7XG4gICAgLy8gTW91bnRlZC1pbnN0YW5jZSBjb3VudHMgcGVyIGZpZWxkIG5hbWUsIHBsdXMgd2hldGhlciB0aGUgQ1VSUkVOVCBydWxlc1xuICAgIC8vIHJlZ2lzdHJhdGlvbiB3YXMgbWFkZSBieSBhIGNvdW50ZWQgaW5zdGFuY2UuIFJ1bGVzIGFyZSByZW1vdmVkIG9ubHkgd2hlblxuICAgIC8vIHRoZSBMQVNUIG1vdW50ZWQgaW5zdGFuY2UgZm9yIGEgbmFtZSByZWxlYXNlczogd2l0aCB0d28gc2FtZS1uYW1lIGZpZWxkc1xuICAgIC8vIG1vdW50ZWQsIHRoZSBmaXJzdCB1bm1vdW50IG11c3Qgbm90IHdpcGUgdGhlIHJlZ2lzdHJhdGlvbiB3aGlsZSB0aGVcbiAgICAvLyBzdXJ2aXZvciAocG9zc2libHkgbWVtby1iYWlsZWQsIHNvIG5vdCByZS1yZW5kZXJpbmcgdG8gcmUtcmVnaXN0ZXIpIHN0aWxsXG4gICAgLy8gcmVsaWVzIG9uIGl0IGZvciBzdWJtaXQtdGltZSB2YWxpZGF0aW9uLiBBIE1BTlVBTCByZWdpc3RlckZpZWxkIChub1xuICAgIC8vIG1vdW50ZWQgaG9sZGVyLCBvd25lZD1mYWxzZSkgc3Vydml2ZXMgdGhlIHVubW91bnQgb2YgcGlnZ3liYWNraW5nXG4gICAgLy8gaW5zdGFuY2VzIHRoYXQgbmV2ZXIgcmVnaXN0ZXJlZCBydWxlcyB0aGVtc2VsdmVzLlxuICAgIC8vIE5PVEU6IGNhbGxlcnMgbXVzdCByZXRhaW4gQkVGT1JFIHJlZ2lzdGVyaW5nIChyZXRhaW4gZWZmZWN0IGRlY2xhcmVkXG4gICAgLy8gZmlyc3QpLCBvciB0aGUgcmVnaXN0cmF0aW9uIGlzIG1pc2NsYXNzaWZpZWQgYXMgbWFudWFsIGFuZCBsZWFrcy5cbiAgICBjb25zdCBmaWVsZE1vdW50Q291bnRzUmVmID0gdXNlUmVmKHt9KTtcbiAgICBjb25zdCBmaWVsZFJlZ2lzdHJhdGlvbk93bmVkUmVmID0gdXNlUmVmKHt9KTtcbiAgICBjb25zdCByZWdpc3RlckZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgcnVsZXMpID0+IHtcbiAgICAgICAgZmllbGRSdWxlc1JlZi5jdXJyZW50W25hbWVdID0gcnVsZXM7XG4gICAgICAgIGZpZWxkUmVnaXN0cmF0aW9uT3duZWRSZWYuY3VycmVudFtuYW1lXSA9IChmaWVsZE1vdW50Q291bnRzUmVmLmN1cnJlbnRbbmFtZV0gfHwgMCkgPiAwO1xuICAgIH0pO1xuICAgIGNvbnN0IGdldEZpZWxkUnVsZXMgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWVsZFJ1bGVzUmVmLmN1cnJlbnRbbmFtZV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5yZWdpc3RlckZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICBkZWxldGUgZmllbGRSdWxlc1JlZi5jdXJyZW50W25hbWVdO1xuICAgICAgICBkZWxldGUgZmllbGRSZWdpc3RyYXRpb25Pd25lZFJlZi5jdXJyZW50W25hbWVdO1xuICAgIH0pO1xuICAgIGNvbnN0IHJldGFpbkZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4ge1xuICAgICAgICBmaWVsZE1vdW50Q291bnRzUmVmLmN1cnJlbnRbbmFtZV0gPSAoZmllbGRNb3VudENvdW50c1JlZi5jdXJyZW50W25hbWVdIHx8IDApICsgMTtcbiAgICB9KTtcbiAgICBjb25zdCByZWxlYXNlRmllbGQgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gKGZpZWxkTW91bnRDb3VudHNSZWYuY3VycmVudFtuYW1lXSB8fCAwKSAtIDE7XG4gICAgICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgZmllbGRNb3VudENvdW50c1JlZi5jdXJyZW50W25hbWVdO1xuICAgICAgICAgICAgaWYgKGZpZWxkUmVnaXN0cmF0aW9uT3duZWRSZWYuY3VycmVudFtuYW1lXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZFJ1bGVzUmVmLmN1cnJlbnRbbmFtZV07XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZpZWxkUmVnaXN0cmF0aW9uT3duZWRSZWYuY3VycmVudFtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkTW91bnRDb3VudHNSZWYuY3VycmVudFtuYW1lXSA9IGNvdW50O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gUHVyZSBzdGF0ZSBBUEk6IHRoZSBpbXBlcmF0aXZlIHJlc2V0RmllbGRzKClcbiAgICAvLyBuZXZlciBmaXJlcyBvblJlc2V0LiBUaGUgY2FsbGJhY2sgYmVsb25ncyB0byB0aGUgcmVzZXQgQUNUSU9OIGxheWVyXG4gICAgLy8gKHN1Ym1pdHRlciBidXR0b24gLyBuYXRpdmUgcmVzZXQgZXZlbnQpLCB3aGljaCBmaXJlcyBpdCBleGFjdGx5IG9uY2UuXG4gICAgY29uc3QgcmVzZXRGaWVsZHMgPSB1c2VNZW1vaXplZEZuKCgpID0+IHtcbiAgICAgICAgLy8gSW52YWxpZGF0ZSBpbi1mbGlnaHQgYXN5bmMgdmFsaWRhdGlvbiBydW5zIOKAlCB0aGVpciByZXN1bHRzIGJlbG9uZyB0b1xuICAgICAgICAvLyBwcmUtcmVzZXQgdmFsdWVzIGFuZCBtdXN0IG5vdCBzdGFtcCBlcnJvcnMgb250byB0aGUgcmVzZXQgZm9ybS5cbiAgICAgICAgaW52YWxpZGF0ZVZhbGlkYXRpb25SdW5zKCk7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHZhbHVlczogbW91bnRJbml0aWFsVmFsdWVzLFxuICAgICAgICAgICAgZXJyb3JzOiB7fSxcbiAgICAgICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgICAgIHRvdWNoZWQ6IHt9LFxuICAgICAgICAgICAgdmFsaWRhdGluZzoge30sXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGhhbmRsZVJlc2V0ID0gdXNlRXZlbnRDYWxsYmFjaygoZSkgPT4ge1xuICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmVzZXRGaWVsZHMoKTtcbiAgICAgICAgb25SZXNldCA9PT0gbnVsbCB8fCBvblJlc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJlc2V0KCk7XG4gICAgfSk7XG4gICAgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVWYWx1ZShzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcywgbmFtZSk7XG4gICAgfSk7XG4gICAgY29uc3QgZ2V0RmllbGRzVmFsdWUgPSB1c2VNZW1vaXplZEZuKChuYW1lTGlzdCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgaWYgKCFuYW1lTGlzdClcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIHJldHVybiBuYW1lTGlzdC5yZWR1Y2UoKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICAgICAgYWNjW25hbWVdID0gcmVzb2x2ZVZhbHVlKHZhbHVlcywgbmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRzVmFsdWUgPSB1c2VNZW1vaXplZEZuKChuZXdWYWx1ZXMpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzUGF0Y2ggPSBuZXdWYWx1ZXM7XG4gICAgICAgIGNvbnN0IHByZXYgPSBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgbGV0IHVwZGF0ZWRWYWx1ZXM7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZXNQYXRjaCkuc29tZSgoa2V5KSA9PiBrZXkuaW5jbHVkZXMoJy4nKSkpIHtcbiAgICAgICAgICAgIC8vIERvdC1wYXRoIGtleXMgd3JpdGUgaW50byB0aGUgTkVTVEVEIHN0cnVjdHVyZSAodGhlIHNldEZpZWxkVmFsdWVcbiAgICAgICAgICAgIC8vIGNvbnRyYWN0KSDigJQgYSBzaGFsbG93IG1lcmdlIHdvdWxkIGxhbmQgdGhlbSBhcyBsaXRlcmFsIHRvcC1sZXZlbFxuICAgICAgICAgICAgLy8ga2V5cyB0aGF0IHRoZSBuZXN0ZWQtYXdhcmUgcmVhZGVycyBuZXZlciBmaW5kLlxuICAgICAgICAgICAgdXBkYXRlZFZhbHVlcyA9IHByZXY7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZXNQYXRjaCkpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzID0ga2V5LmluY2x1ZGVzKCcuJylcbiAgICAgICAgICAgICAgICAgICAgPyBzZXROZXN0ZWRWYWx1ZSh1cGRhdGVkVmFsdWVzLCBrZXksIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IG1lcmdlVmFsdWVzUGF0Y2godXBkYXRlZFZhbHVlcywgeyBba2V5XTogdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cGRhdGVkVmFsdWVzID0gbWVyZ2VWYWx1ZXNQYXRjaChwcmV2LCB2YWx1ZXNQYXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0VmFsdWVzKHVwZGF0ZWRWYWx1ZXMpO1xuICAgICAgICBvblZhbHVlc0NoYW5nZSA9PT0gbnVsbCB8fCBvblZhbHVlc0NoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25WYWx1ZXNDaGFuZ2UodmFsdWVzUGF0Y2gsIHVwZGF0ZWRWYWx1ZXMpO1xuICAgIH0pO1xuICAgIC8vIFNlZWQgdGhlIHJ1bGUtY29udGV4dCBpbnN0YW5jZSB3aXRoIHRoZSBjb3JlIG1ldGhvZHMgZXhhY3RseSBvbmNlIOKAlFxuICAgIC8vIHVzZUZvcm0ncyByaWNoZXIgaW5zdGFuY2UgbXVzdCBub3QgYmUgZG93bmdyYWRlZCBvbiBsYXRlciByZW5kZXJzLlxuICAgIGlmIChPYmplY3Qua2V5cyhydWxlQ29udGV4dEluc3RhbmNlUmVmLmN1cnJlbnQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBydWxlQ29udGV4dEluc3RhbmNlUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgICAgICBnZXRGaWVsZFZhbHVlOiBnZXRGaWVsZFZhbHVlLFxuICAgICAgICAgICAgZ2V0RmllbGRzVmFsdWU6IGdldEZpZWxkc1ZhbHVlLFxuICAgICAgICAgICAgc2V0RmllbGRWYWx1ZTogc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgICAgIHNldEZpZWxkc1ZhbHVlOiBzZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgICAgIHJlc2V0RmllbGRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIHJlc2V0RmllbGRzLFxuICAgICAgICBnZXRGaWVsZFZhbHVlOiBnZXRGaWVsZFZhbHVlLFxuICAgICAgICBnZXRGaWVsZHNWYWx1ZTogZ2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHNldEZpZWxkc1ZhbHVlOiBzZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRWYWx1ZTogc2V0RmllbGRWYWx1ZSxcbiAgICB9KSwgW1xuICAgICAgICByZXNldEZpZWxkcyxcbiAgICAgICAgZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZ2V0RmllbGRzVmFsdWUsXG4gICAgICAgIHNldEZpZWxkc1ZhbHVlLFxuICAgICAgICBzZXRGaWVsZFZhbHVlLFxuICAgIF0pO1xuICAgIC8vIFJlbmRlci10aW1lIHNuYXBzaG90IOKAlCBrZXB0IGZvciB0aGUgVXNlRm9ybUNvcmVSZXR1cm4gY29udHJhY3QuIFJlYWN0aXZlXG4gICAgLy8gY29uc3VtZXJzIG11c3QgZ28gdGhyb3VnaCB0aGUgc3RvcmUsIG5ldmVyIHRocm91Z2ggdGhlc2UgZmllbGRzLlxuICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZXM6IHN0YXRlLnZhbHVlcyxcbiAgICAgICAgZXJyb3JzOiBzdGF0ZS5lcnJvcnMsXG4gICAgICAgIHdhcm5pbmdzOiBzdGF0ZS53YXJuaW5ncyxcbiAgICAgICAgdG91Y2hlZDogc3RhdGUudG91Y2hlZCxcbiAgICAgICAgLy8gTGl2ZSByZWdpc3RyeSDigJQgc3RhYmxlIGlkZW50aXR5LCBtdXRhdGVkIGluIHBsYWNlIGJ5IHJlZ2lzdGVyL3VucmVnaXN0ZXIuXG4gICAgICAgIGZpZWxkUnVsZXM6IGZpZWxkUnVsZXNSZWYuY3VycmVudCxcbiAgICAgICAgZ2V0RmllbGRSdWxlcyxcbiAgICAgICAgZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSxcbiAgICAgICAgc2V0UnVsZUNvbnRleHRJbnN0YW5jZSxcbiAgICAgICAgYmVnaW5WYWxpZGF0aW9uUnVuLFxuICAgICAgICBpc1ZhbGlkYXRpb25SdW5DdXJyZW50LFxuICAgICAgICBpbnZhbGlkYXRlVmFsaWRhdGlvblJ1bnMsXG4gICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldEZpZWxkRXJyb3IsXG4gICAgICAgIHNldEZpZWxkV2FybmluZyxcbiAgICAgICAgc2V0RmllbGRzVmFsdWUsXG4gICAgICAgIGdldEZpZWxkVmFsdWUsXG4gICAgICAgIGdldEZpZWxkc1ZhbHVlOiBnZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgcmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgdW5yZWdpc3RlckZpZWxkLFxuICAgICAgICByZXRhaW5GaWVsZCxcbiAgICAgICAgcmVsZWFzZUZpZWxkLFxuICAgICAgICBoYW5kbGVSZXNldCxcbiAgICAgICAgcmVzZXRGaWVsZHMsXG4gICAgICAgIGZvcm1JbnN0YW5jZSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIGdldEluaXRpYWxWYWx1ZXM6ICgpID0+IG1vdW50SW5pdGlhbFZhbHVlcyxcbiAgICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUZvcm1Db3JlOyJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=