"use strict"; /* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ exports.id = "vendor-chunks/react-hook-form"; exports.ids = ["vendor-chunks/react-hook-form"]; exports.modules = { /***/ "(ssr)/./node_modules/react-hook-form/dist/index.esm.mjs": /*!*********************************************************!*\ !*** ./node_modules/react-hook-form/dist/index.esm.mjs ***! \*********************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Controller: () => (/* binding */ Controller),\n/* harmony export */ Form: () => (/* binding */ Form),\n/* harmony export */ FormProvider: () => (/* binding */ FormProvider),\n/* harmony export */ appendErrors: () => (/* binding */ appendErrors),\n/* harmony export */ get: () => (/* binding */ get),\n/* harmony export */ set: () => (/* binding */ set),\n/* harmony export */ useController: () => (/* binding */ useController),\n/* harmony export */ useFieldArray: () => (/* binding */ useFieldArray),\n/* harmony export */ useForm: () => (/* binding */ useForm),\n/* harmony export */ useFormContext: () => (/* binding */ useFormContext),\n/* harmony export */ useFormState: () => (/* binding */ useFormState),\n/* harmony export */ useWatch: () => (/* binding */ useWatch)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n\nvar isCheckBoxInput = (element)=>element.type === \"checkbox\";\nvar isDateObject = (value1)=>value1 instanceof Date;\nvar isNullOrUndefined = (value1)=>value1 == null;\nconst isObjectType = (value1)=>typeof value1 === \"object\";\nvar isObject = (value1)=>!isNullOrUndefined(value1) && !Array.isArray(value1) && isObjectType(value1) && !isDateObject(value1);\nvar getEventValue = (event)=>isObject(event) && event.target ? isCheckBoxInput(event.target) ? event.target.checked : event.target.value : event;\nvar getNodeParentName = (name)=>name.substring(0, name.search(/\\.\\d+(\\.|$)/)) || name;\nvar isNameInFieldArray = (names, name)=>names.has(getNodeParentName(name));\nvar isPlainObject = (tempObject)=>{\n const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;\n return isObject(prototypeCopy) && prototypeCopy.hasOwnProperty(\"isPrototypeOf\");\n};\nvar isWeb = false && 0;\nfunction cloneObject(data) {\n let copy;\n const isArray = Array.isArray(data);\n if (data instanceof Date) {\n copy = new Date(data);\n } else if (data instanceof Set) {\n copy = new Set(data);\n } else if (!(isWeb && (data instanceof Blob || data instanceof FileList)) && (isArray || isObject(data))) {\n copy = isArray ? [] : {};\n if (!isArray && !isPlainObject(data)) {\n copy = data;\n } else {\n for(const key in data){\n if (data.hasOwnProperty(key)) {\n copy[key] = cloneObject(data[key]);\n }\n }\n }\n } else {\n return data;\n }\n return copy;\n}\nvar compact = (value1)=>Array.isArray(value1) ? value1.filter(Boolean) : [];\nvar isUndefined = (val)=>val === undefined;\nvar get = (object, path, defaultValue)=>{\n if (!path || !isObject(object)) {\n return defaultValue;\n }\n const result = compact(path.split(/[,[\\].]+?/)).reduce((result, key)=>isNullOrUndefined(result) ? result : result[key], object);\n return isUndefined(result) || result === object ? isUndefined(object[path]) ? defaultValue : object[path] : result;\n};\nvar isBoolean = (value1)=>typeof value1 === \"boolean\";\nconst EVENTS = {\n BLUR: \"blur\",\n FOCUS_OUT: \"focusout\",\n CHANGE: \"change\"\n};\nconst VALIDATION_MODE = {\n onBlur: \"onBlur\",\n onChange: \"onChange\",\n onSubmit: \"onSubmit\",\n onTouched: \"onTouched\",\n all: \"all\"\n};\nconst INPUT_VALIDATION_RULES = {\n max: \"max\",\n min: \"min\",\n maxLength: \"maxLength\",\n minLength: \"minLength\",\n pattern: \"pattern\",\n required: \"required\",\n validate: \"validate\"\n};\nconst HookFormContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\n/**\n * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @returns return all useForm methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * \n *
\n * \n * \n * \n *
\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return ;\n * }\n * ```\n */ const useFormContext = ()=>react__WEBPACK_IMPORTED_MODULE_0__.useContext(HookFormContext);\n/**\n * A provider component that propagates the `useForm` methods to all children components via [React Context](https://reactjs.org/docs/context.html) API. To be used with {@link useFormContext}.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @param props - all useForm methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * \n *
\n * \n * \n * \n *
\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return ;\n * }\n * ```\n */ const FormProvider = (props)=>{\n const { children, ...data } = props;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(HookFormContext.Provider, {\n value: data\n }, children);\n};\nvar getProxyFormState = (formState, control, localProxyFormState, isRoot = true)=>{\n const result = {\n defaultValues: control._defaultValues\n };\n for(const key in formState){\n Object.defineProperty(result, key, {\n get: ()=>{\n const _key = key;\n if (control._proxyFormState[_key] !== VALIDATION_MODE.all) {\n control._proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;\n }\n localProxyFormState && (localProxyFormState[_key] = true);\n return formState[_key];\n }\n });\n }\n return result;\n};\nvar isEmptyObject = (value1)=>isObject(value1) && !Object.keys(value1).length;\nvar shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot)=>{\n updateFormState(formStateData);\n const { name, ...formState } = formStateData;\n return isEmptyObject(formState) || Object.keys(formState).length >= Object.keys(_proxyFormState).length || Object.keys(formState).find((key)=>_proxyFormState[key] === (!isRoot || VALIDATION_MODE.all));\n};\nvar convertToArrayPayload = (value1)=>Array.isArray(value1) ? value1 : [\n value1\n ];\nvar shouldSubscribeByName = (name, signalName, exact)=>!name || !signalName || name === signalName || convertToArrayPayload(name).some((currentName)=>currentName && (exact ? currentName === signalName : currentName.startsWith(signalName) || signalName.startsWith(currentName)));\nfunction useSubscribe(props) {\n const _props = react__WEBPACK_IMPORTED_MODULE_0__.useRef(props);\n _props.current = props;\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n const subscription = !props.disabled && _props.current.subject && _props.current.subject.subscribe({\n next: _props.current.next\n });\n return ()=>{\n subscription && subscription.unsubscribe();\n };\n }, [\n props.disabled\n ]);\n}\n/**\n * This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformstate) • [Demo](https://codesandbox.io/s/useformstate-75xly)\n *\n * @param props - include options on specify fields to subscribe. {@link UseFormStateReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, control } = useForm({\n * defaultValues: {\n * firstName: \"firstName\"\n * }});\n * const { dirtyFields } = useFormState({\n * control\n * });\n * const onSubmit = (data) => console.log(data);\n *\n * return (\n *
\n * \n * {dirtyFields.firstName &&

Field is dirty.

}\n * \n *
\n * );\n * }\n * ```\n */ function useFormState(props) {\n const methods = useFormContext();\n const { control = methods.control, disabled, name, exact } = props || {};\n const [formState, updateFormState] = react__WEBPACK_IMPORTED_MODULE_0__.useState(control._formState);\n const _mounted = react__WEBPACK_IMPORTED_MODULE_0__.useRef(true);\n const _localProxyFormState = react__WEBPACK_IMPORTED_MODULE_0__.useRef({\n isDirty: false,\n isLoading: false,\n dirtyFields: false,\n touchedFields: false,\n isValidating: false,\n isValid: false,\n errors: false\n });\n const _name = react__WEBPACK_IMPORTED_MODULE_0__.useRef(name);\n _name.current = name;\n useSubscribe({\n disabled,\n next: (value1)=>_mounted.current && shouldSubscribeByName(_name.current, value1.name, exact) && shouldRenderFormState(value1, _localProxyFormState.current, control._updateFormState) && updateFormState({\n ...control._formState,\n ...value1\n }),\n subject: control._subjects.state\n });\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n _mounted.current = true;\n _localProxyFormState.current.isValid && control._updateValid(true);\n return ()=>{\n _mounted.current = false;\n };\n }, [\n control\n ]);\n return getProxyFormState(formState, control, _localProxyFormState.current, false);\n}\nvar isString = (value1)=>typeof value1 === \"string\";\nvar generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue)=>{\n if (isString(names)) {\n isGlobal && _names.watch.add(names);\n return get(formValues, names, defaultValue);\n }\n if (Array.isArray(names)) {\n return names.map((fieldName)=>(isGlobal && _names.watch.add(fieldName), get(formValues, fieldName)));\n }\n isGlobal && (_names.watchAll = true);\n return formValues;\n};\n/**\n * Custom hook to subscribe to field change and isolate re-rendering at the component level.\n *\n * @remarks\n *\n * [API](https://react-hook-form.com/docs/usewatch) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-usewatch-h9i5e)\n *\n * @example\n * ```tsx\n * const { control } = useForm();\n * const values = useWatch({\n * name: \"fieldName\"\n * control,\n * })\n * ```\n */ function useWatch(props) {\n const methods = useFormContext();\n const { control = methods.control, name, defaultValue, disabled, exact } = props || {};\n const _name = react__WEBPACK_IMPORTED_MODULE_0__.useRef(name);\n _name.current = name;\n useSubscribe({\n disabled,\n subject: control._subjects.values,\n next: (formState)=>{\n if (shouldSubscribeByName(_name.current, formState.name, exact)) {\n updateValue(cloneObject(generateWatchOutput(_name.current, control._names, formState.values || control._formValues, false, defaultValue)));\n }\n }\n });\n const [value1, updateValue] = react__WEBPACK_IMPORTED_MODULE_0__.useState(control._getWatch(name, defaultValue));\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>control._removeUnmounted());\n return value1;\n}\nvar isKey = (value1)=>/^\\w*$/.test(value1);\nvar stringToPath = (input)=>compact(input.replace(/[\"|']|\\]/g, \"\").split(/\\.|\\[/));\nvar set = (object, path, value1)=>{\n let index = -1;\n const tempPath = isKey(path) ? [\n path\n ] : stringToPath(path);\n const length = tempPath.length;\n const lastIndex = length - 1;\n while(++index < length){\n const key = tempPath[index];\n let newValue = value1;\n if (index !== lastIndex) {\n const objValue = object[key];\n newValue = isObject(objValue) || Array.isArray(objValue) ? objValue : !isNaN(+tempPath[index + 1]) ? [] : {};\n }\n object[key] = newValue;\n object = object[key];\n }\n return object;\n};\n/**\n * Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usecontroller) • [Demo](https://codesandbox.io/s/usecontroller-0o8px)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns field properties, field and form state. {@link UseControllerReturn}\n *\n * @example\n * ```tsx\n * function Input(props) {\n * const { field, fieldState, formState } = useController(props);\n * return (\n *
\n * \n *

{fieldState.isTouched && \"Touched\"}

\n *

{formState.isSubmitted ? \"submitted\" : \"\"}

\n *
\n * );\n * }\n * ```\n */ function useController(props) {\n const methods = useFormContext();\n const { name, disabled, control = methods.control, shouldUnregister } = props;\n const isArrayField = isNameInFieldArray(control._names.array, name);\n const value1 = useWatch({\n control,\n name,\n defaultValue: get(control._formValues, name, get(control._defaultValues, name, props.defaultValue)),\n exact: true\n });\n const formState = useFormState({\n control,\n name\n });\n const _registerProps = react__WEBPACK_IMPORTED_MODULE_0__.useRef(control.register(name, {\n ...props.rules,\n value: value1,\n ...isBoolean(props.disabled) ? {\n disabled: props.disabled\n } : {}\n }));\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;\n const updateMounted = (name, value1)=>{\n const field = get(control._fields, name);\n if (field) {\n field._f.mount = value1;\n }\n };\n updateMounted(name, true);\n if (_shouldUnregisterField) {\n const value1 = cloneObject(get(control._options.defaultValues, name));\n set(control._defaultValues, name, value1);\n if (isUndefined(get(control._formValues, name))) {\n set(control._formValues, name, value1);\n }\n }\n return ()=>{\n (isArrayField ? _shouldUnregisterField && !control._state.action : _shouldUnregisterField) ? control.unregister(name) : updateMounted(name, false);\n };\n }, [\n name,\n control,\n isArrayField,\n shouldUnregister\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (get(control._fields, name)) {\n control._updateDisabledField({\n disabled,\n fields: control._fields,\n name,\n value: get(control._fields, name)._f.value\n });\n }\n }, [\n disabled,\n name,\n control\n ]);\n return {\n field: {\n name,\n value: value1,\n ...isBoolean(disabled) || formState.disabled ? {\n disabled: formState.disabled || disabled\n } : {},\n onChange: react__WEBPACK_IMPORTED_MODULE_0__.useCallback((event)=>_registerProps.current.onChange({\n target: {\n value: getEventValue(event),\n name: name\n },\n type: EVENTS.CHANGE\n }), [\n name\n ]),\n onBlur: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(()=>_registerProps.current.onBlur({\n target: {\n value: get(control._formValues, name),\n name: name\n },\n type: EVENTS.BLUR\n }), [\n name,\n control\n ]),\n ref: (elm)=>{\n const field = get(control._fields, name);\n if (field && elm) {\n field._f.ref = {\n focus: ()=>elm.focus(),\n select: ()=>elm.select(),\n setCustomValidity: (message)=>elm.setCustomValidity(message),\n reportValidity: ()=>elm.reportValidity()\n };\n }\n }\n },\n formState,\n fieldState: Object.defineProperties({}, {\n invalid: {\n enumerable: true,\n get: ()=>!!get(formState.errors, name)\n },\n isDirty: {\n enumerable: true,\n get: ()=>!!get(formState.dirtyFields, name)\n },\n isTouched: {\n enumerable: true,\n get: ()=>!!get(formState.touchedFields, name)\n },\n error: {\n enumerable: true,\n get: ()=>get(formState.errors, name)\n }\n })\n };\n}\n/**\n * Component based on `useController` hook to work with controlled component.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns provide field handler functions, field and form state.\n *\n * @example\n * ```tsx\n * function App() {\n * const { control } = useForm({\n * defaultValues: {\n * test: \"\"\n * }\n * });\n *\n * return (\n *
\n * (\n * <>\n * \n *

{formState.isSubmitted ? \"submitted\" : \"\"}

\n *

{fieldState.isTouched ? \"touched\" : \"\"}

\n * \n * )}\n * />\n * \n * );\n * }\n * ```\n */ const Controller = (props)=>props.render(useController(props));\nconst POST_REQUEST = \"post\";\n/**\n * Form component to manage submission.\n *\n * @param props - to setup submission detail. {@link FormProps}\n *\n * @returns form component or headless render prop.\n *\n * @example\n * ```tsx\n * function App() {\n * const { control, formState: { errors } } = useForm();\n *\n * return (\n *
\n * \n *

{errors?.root?.server && 'Server error'}

\n * \n *
\n * );\n * }\n * ```\n */ function Form(props) {\n const methods = useFormContext();\n const [mounted, setMounted] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const { control = methods.control, onSubmit, children, action, method = POST_REQUEST, headers, encType, onError, render, onSuccess, validateStatus, ...rest } = props;\n const submit = async (event)=>{\n let hasError = false;\n let type = \"\";\n await control.handleSubmit(async (data)=>{\n const formData = new FormData();\n let formDataJson = \"\";\n try {\n formDataJson = JSON.stringify(data);\n } catch (_a) {}\n for (const name of control._names.mount){\n formData.append(name, get(data, name));\n }\n if (onSubmit) {\n await onSubmit({\n data,\n event,\n method,\n formData,\n formDataJson\n });\n }\n if (action) {\n try {\n const shouldStringifySubmissionData = [\n headers && headers[\"Content-Type\"],\n encType\n ].some((value1)=>value1 && value1.includes(\"json\"));\n const response = await fetch(action, {\n method,\n headers: {\n ...headers,\n ...encType ? {\n \"Content-Type\": encType\n } : {}\n },\n body: shouldStringifySubmissionData ? formDataJson : formData\n });\n if (response && (validateStatus ? !validateStatus(response.status) : response.status < 200 || response.status >= 300)) {\n hasError = true;\n onError && onError({\n response\n });\n type = String(response.status);\n } else {\n onSuccess && onSuccess({\n response\n });\n }\n } catch (error) {\n hasError = true;\n onError && onError({\n error\n });\n }\n }\n })(event);\n if (hasError && props.control) {\n props.control._subjects.state.next({\n isSubmitSuccessful: false\n });\n props.control.setError(\"root.server\", {\n type\n });\n }\n };\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n setMounted(true);\n }, []);\n return render ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, render({\n submit\n })) : /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"form\", {\n noValidate: mounted,\n action: action,\n method: method,\n encType: encType,\n onSubmit: submit,\n ...rest\n }, children);\n}\nvar appendErrors = (name, validateAllFieldCriteria, errors, type, message)=>validateAllFieldCriteria ? {\n ...errors[name],\n types: {\n ...errors[name] && errors[name].types ? errors[name].types : {},\n [type]: message || true\n }\n } : {};\nvar generateId = ()=>{\n const d = typeof performance === \"undefined\" ? Date.now() : performance.now() * 1000;\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c)=>{\n const r = (Math.random() * 16 + d) % 16 | 0;\n return (c == \"x\" ? r : r & 0x3 | 0x8).toString(16);\n });\n};\nvar getFocusFieldName = (name, index, options = {})=>options.shouldFocus || isUndefined(options.shouldFocus) ? options.focusName || `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.` : \"\";\nvar getValidationModes = (mode)=>({\n isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,\n isOnBlur: mode === VALIDATION_MODE.onBlur,\n isOnChange: mode === VALIDATION_MODE.onChange,\n isOnAll: mode === VALIDATION_MODE.all,\n isOnTouch: mode === VALIDATION_MODE.onTouched\n });\nvar isWatched = (name, _names, isBlurEvent)=>!isBlurEvent && (_names.watchAll || _names.watch.has(name) || [\n ..._names.watch\n ].some((watchName)=>name.startsWith(watchName) && /^\\.\\w+/.test(name.slice(watchName.length))));\nconst iterateFieldsByAction = (fields, action, fieldsNames, abortEarly)=>{\n for (const key of fieldsNames || Object.keys(fields)){\n const field = get(fields, key);\n if (field) {\n const { _f, ...currentField } = field;\n if (_f) {\n if (_f.refs && _f.refs[0] && action(_f.refs[0], key) && !abortEarly) {\n break;\n } else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) {\n break;\n } else {\n iterateFieldsByAction(currentField, action);\n }\n } else if (isObject(currentField)) {\n iterateFieldsByAction(currentField, action);\n }\n }\n }\n};\nvar updateFieldArrayRootError = (errors, error, name)=>{\n const fieldArrayErrors = compact(get(errors, name));\n set(fieldArrayErrors, \"root\", error[name]);\n set(errors, name, fieldArrayErrors);\n return errors;\n};\nvar isFileInput = (element)=>element.type === \"file\";\nvar isFunction = (value1)=>typeof value1 === \"function\";\nvar isHTMLElement = (value1)=>{\n if (!isWeb) {\n return false;\n }\n const owner = value1 ? value1.ownerDocument : 0;\n return value1 instanceof (owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement);\n};\nvar isMessage = (value1)=>isString(value1);\nvar isRadioInput = (element)=>element.type === \"radio\";\nvar isRegex = (value1)=>value1 instanceof RegExp;\nconst defaultResult = {\n value: false,\n isValid: false\n};\nconst validResult = {\n value: true,\n isValid: true\n};\nvar getCheckboxValue = (options)=>{\n if (Array.isArray(options)) {\n if (options.length > 1) {\n const values = options.filter((option)=>option && option.checked && !option.disabled).map((option)=>option.value);\n return {\n value: values,\n isValid: !!values.length\n };\n }\n return options[0].checked && !options[0].disabled ? options[0].attributes && !isUndefined(options[0].attributes.value) ? isUndefined(options[0].value) || options[0].value === \"\" ? validResult : {\n value: options[0].value,\n isValid: true\n } : validResult : defaultResult;\n }\n return defaultResult;\n};\nconst defaultReturn = {\n isValid: false,\n value: null\n};\nvar getRadioValue = (options)=>Array.isArray(options) ? options.reduce((previous, option)=>option && option.checked && !option.disabled ? {\n isValid: true,\n value: option.value\n } : previous, defaultReturn) : defaultReturn;\nfunction getValidateError(result, ref, type = \"validate\") {\n if (isMessage(result) || Array.isArray(result) && result.every(isMessage) || isBoolean(result) && !result) {\n return {\n type,\n message: isMessage(result) ? result : \"\",\n ref\n };\n }\n}\nvar getValueAndMessage = (validationData)=>isObject(validationData) && !isRegex(validationData) ? validationData : {\n value: validationData,\n message: \"\"\n };\nvar validateField = async (field, formValues, validateAllFieldCriteria, shouldUseNativeValidation, isFieldArray)=>{\n const { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount, disabled } = field._f;\n const inputValue = get(formValues, name);\n if (!mount || disabled) {\n return {};\n }\n const inputRef = refs ? refs[0] : ref;\n const setCustomValidity = (message)=>{\n if (shouldUseNativeValidation && inputRef.reportValidity) {\n inputRef.setCustomValidity(isBoolean(message) ? \"\" : message || \"\");\n inputRef.reportValidity();\n }\n };\n const error = {};\n const isRadio = isRadioInput(ref);\n const isCheckBox = isCheckBoxInput(ref);\n const isRadioOrCheckbox = isRadio || isCheckBox;\n const isEmpty = (valueAsNumber || isFileInput(ref)) && isUndefined(ref.value) && isUndefined(inputValue) || isHTMLElement(ref) && ref.value === \"\" || inputValue === \"\" || Array.isArray(inputValue) && !inputValue.length;\n const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);\n const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength)=>{\n const message = exceedMax ? maxLengthMessage : minLengthMessage;\n error[name] = {\n type: exceedMax ? maxType : minType,\n message,\n ref,\n ...appendErrorsCurry(exceedMax ? maxType : minType, message)\n };\n };\n if (isFieldArray ? !Array.isArray(inputValue) || !inputValue.length : required && (!isRadioOrCheckbox && (isEmpty || isNullOrUndefined(inputValue)) || isBoolean(inputValue) && !inputValue || isCheckBox && !getCheckboxValue(refs).isValid || isRadio && !getRadioValue(refs).isValid)) {\n const { value: value1, message } = isMessage(required) ? {\n value: !!required,\n message: required\n } : getValueAndMessage(required);\n if (value1) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.required,\n message,\n ref: inputRef,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.required, message)\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (!isEmpty && (!isNullOrUndefined(min) || !isNullOrUndefined(max))) {\n let exceedMax;\n let exceedMin;\n const maxOutput = getValueAndMessage(max);\n const minOutput = getValueAndMessage(min);\n if (!isNullOrUndefined(inputValue) && !isNaN(inputValue)) {\n const valueNumber = ref.valueAsNumber || (inputValue ? +inputValue : inputValue);\n if (!isNullOrUndefined(maxOutput.value)) {\n exceedMax = valueNumber > maxOutput.value;\n }\n if (!isNullOrUndefined(minOutput.value)) {\n exceedMin = valueNumber < minOutput.value;\n }\n } else {\n const valueDate = ref.valueAsDate || new Date(inputValue);\n const convertTimeToDate = (time)=>new Date(new Date().toDateString() + \" \" + time);\n const isTime = ref.type == \"time\";\n const isWeek = ref.type == \"week\";\n if (isString(maxOutput.value) && inputValue) {\n exceedMax = isTime ? convertTimeToDate(inputValue) > convertTimeToDate(maxOutput.value) : isWeek ? inputValue > maxOutput.value : valueDate > new Date(maxOutput.value);\n }\n if (isString(minOutput.value) && inputValue) {\n exceedMin = isTime ? convertTimeToDate(inputValue) < convertTimeToDate(minOutput.value) : isWeek ? inputValue < minOutput.value : valueDate < new Date(minOutput.value);\n }\n }\n if (exceedMax || exceedMin) {\n getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if ((maxLength || minLength) && !isEmpty && (isString(inputValue) || isFieldArray && Array.isArray(inputValue))) {\n const maxLengthOutput = getValueAndMessage(maxLength);\n const minLengthOutput = getValueAndMessage(minLength);\n const exceedMax = !isNullOrUndefined(maxLengthOutput.value) && inputValue.length > +maxLengthOutput.value;\n const exceedMin = !isNullOrUndefined(minLengthOutput.value) && inputValue.length < +minLengthOutput.value;\n if (exceedMax || exceedMin) {\n getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if (pattern && !isEmpty && isString(inputValue)) {\n const { value: patternValue, message } = getValueAndMessage(pattern);\n if (isRegex(patternValue) && !inputValue.match(patternValue)) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.pattern,\n message,\n ref,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message)\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (validate) {\n if (isFunction(validate)) {\n const result = await validate(inputValue, formValues);\n const validateError = getValidateError(result, inputRef);\n if (validateError) {\n error[name] = {\n ...validateError,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message)\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(validateError.message);\n return error;\n }\n }\n } else if (isObject(validate)) {\n let validationResult = {};\n for(const key in validate){\n if (!isEmptyObject(validationResult) && !validateAllFieldCriteria) {\n break;\n }\n const validateError = getValidateError(await validate[key](inputValue, formValues), inputRef, key);\n if (validateError) {\n validationResult = {\n ...validateError,\n ...appendErrorsCurry(key, validateError.message)\n };\n setCustomValidity(validateError.message);\n if (validateAllFieldCriteria) {\n error[name] = validationResult;\n }\n }\n }\n if (!isEmptyObject(validationResult)) {\n error[name] = {\n ref: inputRef,\n ...validationResult\n };\n if (!validateAllFieldCriteria) {\n return error;\n }\n }\n }\n }\n setCustomValidity(true);\n return error;\n};\nvar appendAt = (data, value1)=>[\n ...data,\n ...convertToArrayPayload(value1)\n ];\nvar fillEmptyArray = (value1)=>Array.isArray(value1) ? value1.map(()=>undefined) : undefined;\nfunction insert(data, index, value1) {\n return [\n ...data.slice(0, index),\n ...convertToArrayPayload(value1),\n ...data.slice(index)\n ];\n}\nvar moveArrayAt = (data, from, to)=>{\n if (!Array.isArray(data)) {\n return [];\n }\n if (isUndefined(data[to])) {\n data[to] = undefined;\n }\n data.splice(to, 0, data.splice(from, 1)[0]);\n return data;\n};\nvar prependAt = (data, value1)=>[\n ...convertToArrayPayload(value1),\n ...convertToArrayPayload(data)\n ];\nfunction removeAtIndexes(data, indexes) {\n let i = 0;\n const temp = [\n ...data\n ];\n for (const index of indexes){\n temp.splice(index - i, 1);\n i++;\n }\n return compact(temp).length ? temp : [];\n}\nvar removeArrayAt = (data, index)=>isUndefined(index) ? [] : removeAtIndexes(data, convertToArrayPayload(index).sort((a, b)=>a - b));\nvar swapArrayAt = (data, indexA, indexB)=>{\n [data[indexA], data[indexB]] = [\n data[indexB],\n data[indexA]\n ];\n};\nfunction baseGet(object, updatePath) {\n const length = updatePath.slice(0, -1).length;\n let index = 0;\n while(index < length){\n object = isUndefined(object) ? index++ : object[updatePath[index++]];\n }\n return object;\n}\nfunction isEmptyArray(obj) {\n for(const key in obj){\n if (obj.hasOwnProperty(key) && !isUndefined(obj[key])) {\n return false;\n }\n }\n return true;\n}\nfunction unset(object, path) {\n const paths = Array.isArray(path) ? path : isKey(path) ? [\n path\n ] : stringToPath(path);\n const childObject = paths.length === 1 ? object : baseGet(object, paths);\n const index = paths.length - 1;\n const key = paths[index];\n if (childObject) {\n delete childObject[key];\n }\n if (index !== 0 && (isObject(childObject) && isEmptyObject(childObject) || Array.isArray(childObject) && isEmptyArray(childObject))) {\n unset(object, paths.slice(0, -1));\n }\n return object;\n}\nvar updateAt = (fieldValues, index, value1)=>{\n fieldValues[index] = value1;\n return fieldValues;\n};\n/**\n * A custom hook that exposes convenient methods to perform operations with a list of dynamic inputs that need to be appended, updated, removed etc. • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn) • [Video](https://youtu.be/4MrbfGSFY2A)\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn)\n *\n * @param props - useFieldArray props\n *\n * @returns methods - functions to manipulate with the Field Arrays (dynamic inputs) {@link UseFieldArrayReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, control, handleSubmit, reset, trigger, setError } = useForm({\n * defaultValues: {\n * test: []\n * }\n * });\n * const { fields, append } = useFieldArray({\n * control,\n * name: \"test\"\n * });\n *\n * return (\n *
console.log(data))}>\n * {fields.map((item, index) => (\n * \n * ))}\n * \n * \n *
\n * );\n * }\n * ```\n */ function useFieldArray(props) {\n const methods = useFormContext();\n const { control = methods.control, name, keyName = \"id\", shouldUnregister } = props;\n const [fields, setFields] = react__WEBPACK_IMPORTED_MODULE_0__.useState(control._getFieldArray(name));\n const ids = react__WEBPACK_IMPORTED_MODULE_0__.useRef(control._getFieldArray(name).map(generateId));\n const _fieldIds = react__WEBPACK_IMPORTED_MODULE_0__.useRef(fields);\n const _name = react__WEBPACK_IMPORTED_MODULE_0__.useRef(name);\n const _actioned = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);\n _name.current = name;\n _fieldIds.current = fields;\n control._names.array.add(name);\n props.rules && control.register(name, props.rules);\n useSubscribe({\n next: ({ values, name: fieldArrayName })=>{\n if (fieldArrayName === _name.current || !fieldArrayName) {\n const fieldValues = get(values, _name.current);\n if (Array.isArray(fieldValues)) {\n setFields(fieldValues);\n ids.current = fieldValues.map(generateId);\n }\n }\n },\n subject: control._subjects.array\n });\n const updateValues = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((updatedFieldArrayValues)=>{\n _actioned.current = true;\n control._updateFieldArray(name, updatedFieldArrayValues);\n }, [\n control,\n name\n ]);\n const append = (value1, options)=>{\n const appendValue = convertToArrayPayload(cloneObject(value1));\n const updatedFieldArrayValues = appendAt(control._getFieldArray(name), appendValue);\n control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);\n ids.current = appendAt(ids.current, appendValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, appendAt, {\n argA: fillEmptyArray(value1)\n });\n };\n const prepend = (value1, options)=>{\n const prependValue = convertToArrayPayload(cloneObject(value1));\n const updatedFieldArrayValues = prependAt(control._getFieldArray(name), prependValue);\n control._names.focus = getFocusFieldName(name, 0, options);\n ids.current = prependAt(ids.current, prependValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, prependAt, {\n argA: fillEmptyArray(value1)\n });\n };\n const remove = (index)=>{\n const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);\n ids.current = removeArrayAt(ids.current, index);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {\n argA: index\n });\n };\n const insert$1 = (index, value1, options)=>{\n const insertValue = convertToArrayPayload(cloneObject(value1));\n const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);\n control._names.focus = getFocusFieldName(name, index, options);\n ids.current = insert(ids.current, index, insertValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, insert, {\n argA: index,\n argB: fillEmptyArray(value1)\n });\n };\n const swap = (indexA, indexB)=>{\n const updatedFieldArrayValues = control._getFieldArray(name);\n swapArrayAt(updatedFieldArrayValues, indexA, indexB);\n swapArrayAt(ids.current, indexA, indexB);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {\n argA: indexA,\n argB: indexB\n }, false);\n };\n const move = (from, to)=>{\n const updatedFieldArrayValues = control._getFieldArray(name);\n moveArrayAt(updatedFieldArrayValues, from, to);\n moveArrayAt(ids.current, from, to);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {\n argA: from,\n argB: to\n }, false);\n };\n const update = (index, value1)=>{\n const updateValue = cloneObject(value1);\n const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, updateValue);\n ids.current = [\n ...updatedFieldArrayValues\n ].map((item, i)=>!item || i === index ? generateId() : ids.current[i]);\n updateValues(updatedFieldArrayValues);\n setFields([\n ...updatedFieldArrayValues\n ]);\n control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {\n argA: index,\n argB: updateValue\n }, true, false);\n };\n const replace = (value1)=>{\n const updatedFieldArrayValues = convertToArrayPayload(cloneObject(value1));\n ids.current = updatedFieldArrayValues.map(generateId);\n updateValues([\n ...updatedFieldArrayValues\n ]);\n setFields([\n ...updatedFieldArrayValues\n ]);\n control._updateFieldArray(name, [\n ...updatedFieldArrayValues\n ], (data)=>data, {}, true, false);\n };\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n control._state.action = false;\n isWatched(name, control._names) && control._subjects.state.next({\n ...control._formState\n });\n if (_actioned.current && (!getValidationModes(control._options.mode).isOnSubmit || control._formState.isSubmitted)) {\n if (control._options.resolver) {\n control._executeSchema([\n name\n ]).then((result)=>{\n const error = get(result.errors, name);\n const existingError = get(control._formState.errors, name);\n if (existingError ? !error && existingError.type || error && (existingError.type !== error.type || existingError.message !== error.message) : error && error.type) {\n error ? set(control._formState.errors, name, error) : unset(control._formState.errors, name);\n control._subjects.state.next({\n errors: control._formState.errors\n });\n }\n });\n } else {\n const field = get(control._fields, name);\n if (field && field._f && !(getValidationModes(control._options.reValidateMode).isOnSubmit && getValidationModes(control._options.mode).isOnSubmit)) {\n validateField(field, control._formValues, control._options.criteriaMode === VALIDATION_MODE.all, control._options.shouldUseNativeValidation, true).then((error)=>!isEmptyObject(error) && control._subjects.state.next({\n errors: updateFieldArrayRootError(control._formState.errors, error, name)\n }));\n }\n }\n }\n control._subjects.values.next({\n name,\n values: {\n ...control._formValues\n }\n });\n control._names.focus && iterateFieldsByAction(control._fields, (ref, key)=>{\n if (control._names.focus && key.startsWith(control._names.focus) && ref.focus) {\n ref.focus();\n return 1;\n }\n return;\n });\n control._names.focus = \"\";\n control._updateValid();\n _actioned.current = false;\n }, [\n fields,\n name,\n control\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n !get(control._formValues, name) && control._updateFieldArray(name);\n return ()=>{\n (control._options.shouldUnregister || shouldUnregister) && control.unregister(name);\n };\n }, [\n name,\n control,\n keyName,\n shouldUnregister\n ]);\n return {\n swap: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(swap, [\n updateValues,\n name,\n control\n ]),\n move: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(move, [\n updateValues,\n name,\n control\n ]),\n prepend: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(prepend, [\n updateValues,\n name,\n control\n ]),\n append: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(append, [\n updateValues,\n name,\n control\n ]),\n remove: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(remove, [\n updateValues,\n name,\n control\n ]),\n insert: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(insert$1, [\n updateValues,\n name,\n control\n ]),\n update: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(update, [\n updateValues,\n name,\n control\n ]),\n replace: react__WEBPACK_IMPORTED_MODULE_0__.useCallback(replace, [\n updateValues,\n name,\n control\n ]),\n fields: react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>fields.map((field, index)=>({\n ...field,\n [keyName]: ids.current[index] || generateId()\n })), [\n fields,\n keyName\n ])\n };\n}\nvar createSubject = ()=>{\n let _observers = [];\n const next = (value1)=>{\n for (const observer of _observers){\n observer.next && observer.next(value1);\n }\n };\n const subscribe = (observer)=>{\n _observers.push(observer);\n return {\n unsubscribe: ()=>{\n _observers = _observers.filter((o)=>o !== observer);\n }\n };\n };\n const unsubscribe = ()=>{\n _observers = [];\n };\n return {\n get observers () {\n return _observers;\n },\n next,\n subscribe,\n unsubscribe\n };\n};\nvar isPrimitive = (value1)=>isNullOrUndefined(value1) || !isObjectType(value1);\nfunction deepEqual(object1, object2) {\n if (isPrimitive(object1) || isPrimitive(object2)) {\n return object1 === object2;\n }\n if (isDateObject(object1) && isDateObject(object2)) {\n return object1.getTime() === object2.getTime();\n }\n const keys1 = Object.keys(object1);\n const keys2 = Object.keys(object2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1){\n const val1 = object1[key];\n if (!keys2.includes(key)) {\n return false;\n }\n if (key !== \"ref\") {\n const val2 = object2[key];\n if (isDateObject(val1) && isDateObject(val2) || isObject(val1) && isObject(val2) || Array.isArray(val1) && Array.isArray(val2) ? !deepEqual(val1, val2) : val1 !== val2) {\n return false;\n }\n }\n }\n return true;\n}\nvar isMultipleSelect = (element)=>element.type === `select-multiple`;\nvar isRadioOrCheckbox = (ref)=>isRadioInput(ref) || isCheckBoxInput(ref);\nvar live = (ref)=>isHTMLElement(ref) && ref.isConnected;\nvar objectHasFunction = (data)=>{\n for(const key in data){\n if (isFunction(data[key])) {\n return true;\n }\n }\n return false;\n};\nfunction markFieldsDirty(data, fields = {}) {\n const isParentNodeArray = Array.isArray(data);\n if (isObject(data) || isParentNodeArray) {\n for(const key in data){\n if (Array.isArray(data[key]) || isObject(data[key]) && !objectHasFunction(data[key])) {\n fields[key] = Array.isArray(data[key]) ? [] : {};\n markFieldsDirty(data[key], fields[key]);\n } else if (!isNullOrUndefined(data[key])) {\n fields[key] = true;\n }\n }\n }\n return fields;\n}\nfunction getDirtyFieldsFromDefaultValues(data, formValues, dirtyFieldsFromValues) {\n const isParentNodeArray = Array.isArray(data);\n if (isObject(data) || isParentNodeArray) {\n for(const key in data){\n if (Array.isArray(data[key]) || isObject(data[key]) && !objectHasFunction(data[key])) {\n if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) {\n dirtyFieldsFromValues[key] = Array.isArray(data[key]) ? markFieldsDirty(data[key], []) : {\n ...markFieldsDirty(data[key])\n };\n } else {\n getDirtyFieldsFromDefaultValues(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);\n }\n } else {\n dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);\n }\n }\n }\n return dirtyFieldsFromValues;\n}\nvar getDirtyFields = (defaultValues, formValues)=>getDirtyFieldsFromDefaultValues(defaultValues, formValues, markFieldsDirty(formValues));\nvar getFieldValueAs = (value1, { valueAsNumber, valueAsDate, setValueAs })=>isUndefined(value1) ? value1 : valueAsNumber ? value1 === \"\" ? NaN : value1 ? +value1 : value1 : valueAsDate && isString(value1) ? new Date(value1) : setValueAs ? setValueAs(value1) : value1;\nfunction getFieldValue(_f) {\n const ref = _f.ref;\n if (_f.refs ? _f.refs.every((ref)=>ref.disabled) : ref.disabled) {\n return;\n }\n if (isFileInput(ref)) {\n return ref.files;\n }\n if (isRadioInput(ref)) {\n return getRadioValue(_f.refs).value;\n }\n if (isMultipleSelect(ref)) {\n return [\n ...ref.selectedOptions\n ].map(({ value: value1 })=>value1);\n }\n if (isCheckBoxInput(ref)) {\n return getCheckboxValue(_f.refs).value;\n }\n return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);\n}\nvar getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation)=>{\n const fields = {};\n for (const name of fieldsNames){\n const field = get(_fields, name);\n field && set(fields, name, field._f);\n }\n return {\n criteriaMode,\n names: [\n ...fieldsNames\n ],\n fields,\n shouldUseNativeValidation\n };\n};\nvar getRuleValue = (rule)=>isUndefined(rule) ? rule : isRegex(rule) ? rule.source : isObject(rule) ? isRegex(rule.value) ? rule.value.source : rule.value : rule;\nvar hasValidation = (options)=>options.mount && (options.required || options.min || options.max || options.maxLength || options.minLength || options.pattern || options.validate);\nfunction schemaErrorLookup(errors, _fields, name) {\n const error = get(errors, name);\n if (error || isKey(name)) {\n return {\n error,\n name\n };\n }\n const names = name.split(\".\");\n while(names.length){\n const fieldName = names.join(\".\");\n const field = get(_fields, fieldName);\n const foundError = get(errors, fieldName);\n if (field && !Array.isArray(field) && name !== fieldName) {\n return {\n name\n };\n }\n if (foundError && foundError.type) {\n return {\n name: fieldName,\n error: foundError\n };\n }\n names.pop();\n }\n return {\n name\n };\n}\nvar skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode)=>{\n if (mode.isOnAll) {\n return false;\n } else if (!isSubmitted && mode.isOnTouch) {\n return !(isTouched || isBlurEvent);\n } else if (isSubmitted ? reValidateMode.isOnBlur : mode.isOnBlur) {\n return !isBlurEvent;\n } else if (isSubmitted ? reValidateMode.isOnChange : mode.isOnChange) {\n return isBlurEvent;\n }\n return true;\n};\nvar unsetEmptyArray = (ref, name)=>!compact(get(ref, name)).length && unset(ref, name);\nconst defaultOptions = {\n mode: VALIDATION_MODE.onSubmit,\n reValidateMode: VALIDATION_MODE.onChange,\n shouldFocusError: true\n};\nfunction createFormControl(props = {}, flushRootRender) {\n let _options = {\n ...defaultOptions,\n ...props\n };\n let _formState = {\n submitCount: 0,\n isDirty: false,\n isLoading: isFunction(_options.defaultValues),\n isValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n touchedFields: {},\n dirtyFields: {},\n errors: _options.errors || {},\n disabled: _options.disabled || false\n };\n let _fields = {};\n let _defaultValues = isObject(_options.values) || isObject(_options.defaultValues) ? cloneObject(_options.values || _options.defaultValues) || {} : {};\n let _formValues = _options.shouldUnregister ? {} : cloneObject(_defaultValues);\n let _state = {\n action: false,\n mount: false,\n watch: false\n };\n let _names = {\n mount: new Set(),\n unMount: new Set(),\n array: new Set(),\n watch: new Set()\n };\n let delayErrorCallback;\n let timer = 0;\n const _proxyFormState = {\n isDirty: false,\n dirtyFields: false,\n touchedFields: false,\n isValidating: false,\n isValid: false,\n errors: false\n };\n const _subjects = {\n values: createSubject(),\n array: createSubject(),\n state: createSubject()\n };\n const validationModeBeforeSubmit = getValidationModes(_options.mode);\n const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);\n const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;\n const debounce = (callback)=>(wait)=>{\n clearTimeout(timer);\n timer = setTimeout(callback, wait);\n };\n const _updateValid = async (shouldUpdateValid)=>{\n if (_proxyFormState.isValid || shouldUpdateValid) {\n const isValid = _options.resolver ? isEmptyObject((await _executeSchema()).errors) : await executeBuiltInValidation(_fields, true);\n if (isValid !== _formState.isValid) {\n _subjects.state.next({\n isValid\n });\n }\n }\n };\n const _updateIsValidating = (value1)=>_proxyFormState.isValidating && _subjects.state.next({\n isValidating: value1\n });\n const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true)=>{\n if (args && method) {\n _state.action = true;\n if (shouldUpdateFieldsAndState && Array.isArray(get(_fields, name))) {\n const fieldValues = method(get(_fields, name), args.argA, args.argB);\n shouldSetValues && set(_fields, name, fieldValues);\n }\n if (shouldUpdateFieldsAndState && Array.isArray(get(_formState.errors, name))) {\n const errors = method(get(_formState.errors, name), args.argA, args.argB);\n shouldSetValues && set(_formState.errors, name, errors);\n unsetEmptyArray(_formState.errors, name);\n }\n if (_proxyFormState.touchedFields && shouldUpdateFieldsAndState && Array.isArray(get(_formState.touchedFields, name))) {\n const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);\n shouldSetValues && set(_formState.touchedFields, name, touchedFields);\n }\n if (_proxyFormState.dirtyFields) {\n _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);\n }\n _subjects.state.next({\n name,\n isDirty: _getDirty(name, values),\n dirtyFields: _formState.dirtyFields,\n errors: _formState.errors,\n isValid: _formState.isValid\n });\n } else {\n set(_formValues, name, values);\n }\n };\n const updateErrors = (name, error)=>{\n set(_formState.errors, name, error);\n _subjects.state.next({\n errors: _formState.errors\n });\n };\n const _setErrors = (errors)=>{\n _formState.errors = errors;\n _subjects.state.next({\n errors: _formState.errors,\n isValid: false\n });\n };\n const updateValidAndValue = (name, shouldSkipSetValueAs, value1, ref)=>{\n const field = get(_fields, name);\n if (field) {\n const defaultValue = get(_formValues, name, isUndefined(value1) ? get(_defaultValues, name) : value1);\n isUndefined(defaultValue) || ref && ref.defaultChecked || shouldSkipSetValueAs ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f)) : setFieldValue(name, defaultValue);\n _state.mount && _updateValid();\n }\n };\n const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender)=>{\n let shouldUpdateField = false;\n let isPreviousDirty = false;\n const output = {\n name\n };\n const disabledField = !!(get(_fields, name) && get(_fields, name)._f.disabled);\n if (!isBlurEvent || shouldDirty) {\n if (_proxyFormState.isDirty) {\n isPreviousDirty = _formState.isDirty;\n _formState.isDirty = output.isDirty = _getDirty();\n shouldUpdateField = isPreviousDirty !== output.isDirty;\n }\n const isCurrentFieldPristine = disabledField || deepEqual(get(_defaultValues, name), fieldValue);\n isPreviousDirty = !!(!disabledField && get(_formState.dirtyFields, name));\n isCurrentFieldPristine || disabledField ? unset(_formState.dirtyFields, name) : set(_formState.dirtyFields, name, true);\n output.dirtyFields = _formState.dirtyFields;\n shouldUpdateField = shouldUpdateField || _proxyFormState.dirtyFields && isPreviousDirty !== !isCurrentFieldPristine;\n }\n if (isBlurEvent) {\n const isPreviousFieldTouched = get(_formState.touchedFields, name);\n if (!isPreviousFieldTouched) {\n set(_formState.touchedFields, name, isBlurEvent);\n output.touchedFields = _formState.touchedFields;\n shouldUpdateField = shouldUpdateField || _proxyFormState.touchedFields && isPreviousFieldTouched !== isBlurEvent;\n }\n }\n shouldUpdateField && shouldRender && _subjects.state.next(output);\n return shouldUpdateField ? output : {};\n };\n const shouldRenderByError = (name, isValid, error, fieldState)=>{\n const previousFieldError = get(_formState.errors, name);\n const shouldUpdateValid = _proxyFormState.isValid && isBoolean(isValid) && _formState.isValid !== isValid;\n if (props.delayError && error) {\n delayErrorCallback = debounce(()=>updateErrors(name, error));\n delayErrorCallback(props.delayError);\n } else {\n clearTimeout(timer);\n delayErrorCallback = null;\n error ? set(_formState.errors, name, error) : unset(_formState.errors, name);\n }\n if ((error ? !deepEqual(previousFieldError, error) : previousFieldError) || !isEmptyObject(fieldState) || shouldUpdateValid) {\n const updatedFormState = {\n ...fieldState,\n ...shouldUpdateValid && isBoolean(isValid) ? {\n isValid\n } : {},\n errors: _formState.errors,\n name\n };\n _formState = {\n ..._formState,\n ...updatedFormState\n };\n _subjects.state.next(updatedFormState);\n }\n _updateIsValidating(false);\n };\n const _executeSchema = async (name)=>_options.resolver(_formValues, _options.context, getResolverOptions(name || _names.mount, _fields, _options.criteriaMode, _options.shouldUseNativeValidation));\n const executeSchemaAndUpdateState = async (names)=>{\n const { errors } = await _executeSchema(names);\n if (names) {\n for (const name of names){\n const error = get(errors, name);\n error ? set(_formState.errors, name, error) : unset(_formState.errors, name);\n }\n } else {\n _formState.errors = errors;\n }\n return errors;\n };\n const executeBuiltInValidation = async (fields, shouldOnlyCheckValid, context = {\n valid: true\n })=>{\n for(const name in fields){\n const field = fields[name];\n if (field) {\n const { _f, ...fieldValue } = field;\n if (_f) {\n const isFieldArrayRoot = _names.array.has(_f.name);\n const fieldError = await validateField(field, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !shouldOnlyCheckValid, isFieldArrayRoot);\n if (fieldError[_f.name]) {\n context.valid = false;\n if (shouldOnlyCheckValid) {\n break;\n }\n }\n !shouldOnlyCheckValid && (get(fieldError, _f.name) ? isFieldArrayRoot ? updateFieldArrayRootError(_formState.errors, fieldError, _f.name) : set(_formState.errors, _f.name, fieldError[_f.name]) : unset(_formState.errors, _f.name));\n }\n fieldValue && await executeBuiltInValidation(fieldValue, shouldOnlyCheckValid, context);\n }\n }\n return context.valid;\n };\n const _removeUnmounted = ()=>{\n for (const name of _names.unMount){\n const field = get(_fields, name);\n field && (field._f.refs ? field._f.refs.every((ref)=>!live(ref)) : !live(field._f.ref)) && unregister(name);\n }\n _names.unMount = new Set();\n };\n const _getDirty = (name, data)=>(name && data && set(_formValues, name, data), !deepEqual(getValues(), _defaultValues));\n const _getWatch = (names, defaultValue, isGlobal)=>generateWatchOutput(names, _names, {\n ..._state.mount ? _formValues : isUndefined(defaultValue) ? _defaultValues : isString(names) ? {\n [names]: defaultValue\n } : defaultValue\n }, isGlobal, defaultValue);\n const _getFieldArray = (name)=>compact(get(_state.mount ? _formValues : _defaultValues, name, props.shouldUnregister ? get(_defaultValues, name, []) : []));\n const setFieldValue = (name, value1, options = {})=>{\n const field = get(_fields, name);\n let fieldValue = value1;\n if (field) {\n const fieldReference = field._f;\n if (fieldReference) {\n !fieldReference.disabled && set(_formValues, name, getFieldValueAs(value1, fieldReference));\n fieldValue = isHTMLElement(fieldReference.ref) && isNullOrUndefined(value1) ? \"\" : value1;\n if (isMultipleSelect(fieldReference.ref)) {\n [\n ...fieldReference.ref.options\n ].forEach((optionRef)=>optionRef.selected = fieldValue.includes(optionRef.value));\n } else if (fieldReference.refs) {\n if (isCheckBoxInput(fieldReference.ref)) {\n fieldReference.refs.length > 1 ? fieldReference.refs.forEach((checkboxRef)=>(!checkboxRef.defaultChecked || !checkboxRef.disabled) && (checkboxRef.checked = Array.isArray(fieldValue) ? !!fieldValue.find((data)=>data === checkboxRef.value) : fieldValue === checkboxRef.value)) : fieldReference.refs[0] && (fieldReference.refs[0].checked = !!fieldValue);\n } else {\n fieldReference.refs.forEach((radioRef)=>radioRef.checked = radioRef.value === fieldValue);\n }\n } else if (isFileInput(fieldReference.ref)) {\n fieldReference.ref.value = \"\";\n } else {\n fieldReference.ref.value = fieldValue;\n if (!fieldReference.ref.type) {\n _subjects.values.next({\n name,\n values: {\n ..._formValues\n }\n });\n }\n }\n }\n }\n (options.shouldDirty || options.shouldTouch) && updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);\n options.shouldValidate && trigger(name);\n };\n const setValues = (name, value1, options)=>{\n for(const fieldKey in value1){\n const fieldValue = value1[fieldKey];\n const fieldName = `${name}.${fieldKey}`;\n const field = get(_fields, fieldName);\n (_names.array.has(name) || !isPrimitive(fieldValue) || field && !field._f) && !isDateObject(fieldValue) ? setValues(fieldName, fieldValue, options) : setFieldValue(fieldName, fieldValue, options);\n }\n };\n const setValue = (name, value1, options = {})=>{\n const field = get(_fields, name);\n const isFieldArray = _names.array.has(name);\n const cloneValue = cloneObject(value1);\n set(_formValues, name, cloneValue);\n if (isFieldArray) {\n _subjects.array.next({\n name,\n values: {\n ..._formValues\n }\n });\n if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields) && options.shouldDirty) {\n _subjects.state.next({\n name,\n dirtyFields: getDirtyFields(_defaultValues, _formValues),\n isDirty: _getDirty(name, cloneValue)\n });\n }\n } else {\n field && !field._f && !isNullOrUndefined(cloneValue) ? setValues(name, cloneValue, options) : setFieldValue(name, cloneValue, options);\n }\n isWatched(name, _names) && _subjects.state.next({\n ..._formState\n });\n _subjects.values.next({\n name,\n values: {\n ..._formValues\n }\n });\n !_state.mount && flushRootRender();\n };\n const onChange = async (event)=>{\n const target = event.target;\n let name = target.name;\n let isFieldValueUpdated = true;\n const field = get(_fields, name);\n const getCurrentFieldValue = ()=>target.type ? getFieldValue(field._f) : getEventValue(event);\n const _updateIsFieldValueUpdated = (fieldValue)=>{\n isFieldValueUpdated = Number.isNaN(fieldValue) || fieldValue === get(_formValues, name, fieldValue);\n };\n if (field) {\n let error;\n let isValid;\n const fieldValue = getCurrentFieldValue();\n const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;\n const shouldSkipValidation = !hasValidation(field._f) && !_options.resolver && !get(_formState.errors, name) && !field._f.deps || skipValidation(isBlurEvent, get(_formState.touchedFields, name), _formState.isSubmitted, validationModeAfterSubmit, validationModeBeforeSubmit);\n const watched = isWatched(name, _names, isBlurEvent);\n set(_formValues, name, fieldValue);\n if (isBlurEvent) {\n field._f.onBlur && field._f.onBlur(event);\n delayErrorCallback && delayErrorCallback(0);\n } else if (field._f.onChange) {\n field._f.onChange(event);\n }\n const fieldState = updateTouchAndDirty(name, fieldValue, isBlurEvent, false);\n const shouldRender = !isEmptyObject(fieldState) || watched;\n !isBlurEvent && _subjects.values.next({\n name,\n type: event.type,\n values: {\n ..._formValues\n }\n });\n if (shouldSkipValidation) {\n _proxyFormState.isValid && _updateValid();\n return shouldRender && _subjects.state.next({\n name,\n ...watched ? {} : fieldState\n });\n }\n !isBlurEvent && watched && _subjects.state.next({\n ..._formState\n });\n _updateIsValidating(true);\n if (_options.resolver) {\n const { errors } = await _executeSchema([\n name\n ]);\n _updateIsFieldValueUpdated(fieldValue);\n if (isFieldValueUpdated) {\n const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);\n const errorLookupResult = schemaErrorLookup(errors, _fields, previousErrorLookupResult.name || name);\n error = errorLookupResult.error;\n name = errorLookupResult.name;\n isValid = isEmptyObject(errors);\n }\n } else {\n error = (await validateField(field, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation))[name];\n _updateIsFieldValueUpdated(fieldValue);\n if (isFieldValueUpdated) {\n if (error) {\n isValid = false;\n } else if (_proxyFormState.isValid) {\n isValid = await executeBuiltInValidation(_fields, true);\n }\n }\n }\n if (isFieldValueUpdated) {\n field._f.deps && trigger(field._f.deps);\n shouldRenderByError(name, isValid, error, fieldState);\n }\n }\n };\n const _focusInput = (ref, key)=>{\n if (get(_formState.errors, key) && ref.focus) {\n ref.focus();\n return 1;\n }\n return;\n };\n const trigger = async (name, options = {})=>{\n let isValid;\n let validationResult;\n const fieldNames = convertToArrayPayload(name);\n _updateIsValidating(true);\n if (_options.resolver) {\n const errors = await executeSchemaAndUpdateState(isUndefined(name) ? name : fieldNames);\n isValid = isEmptyObject(errors);\n validationResult = name ? !fieldNames.some((name)=>get(errors, name)) : isValid;\n } else if (name) {\n validationResult = (await Promise.all(fieldNames.map(async (fieldName)=>{\n const field = get(_fields, fieldName);\n return await executeBuiltInValidation(field && field._f ? {\n [fieldName]: field\n } : field);\n }))).every(Boolean);\n !(!validationResult && !_formState.isValid) && _updateValid();\n } else {\n validationResult = isValid = await executeBuiltInValidation(_fields);\n }\n _subjects.state.next({\n ...!isString(name) || _proxyFormState.isValid && isValid !== _formState.isValid ? {} : {\n name\n },\n ..._options.resolver || !name ? {\n isValid\n } : {},\n errors: _formState.errors,\n isValidating: false\n });\n options.shouldFocus && !validationResult && iterateFieldsByAction(_fields, _focusInput, name ? fieldNames : _names.mount);\n return validationResult;\n };\n const getValues = (fieldNames)=>{\n const values = {\n ..._defaultValues,\n ..._state.mount ? _formValues : {}\n };\n return isUndefined(fieldNames) ? values : isString(fieldNames) ? get(values, fieldNames) : fieldNames.map((name)=>get(values, name));\n };\n const getFieldState = (name, formState)=>({\n invalid: !!get((formState || _formState).errors, name),\n isDirty: !!get((formState || _formState).dirtyFields, name),\n isTouched: !!get((formState || _formState).touchedFields, name),\n error: get((formState || _formState).errors, name)\n });\n const clearErrors = (name)=>{\n name && convertToArrayPayload(name).forEach((inputName)=>unset(_formState.errors, inputName));\n _subjects.state.next({\n errors: name ? _formState.errors : {}\n });\n };\n const setError = (name, error, options)=>{\n const ref = (get(_fields, name, {\n _f: {}\n })._f || {}).ref;\n set(_formState.errors, name, {\n ...error,\n ref\n });\n _subjects.state.next({\n name,\n errors: _formState.errors,\n isValid: false\n });\n options && options.shouldFocus && ref && ref.focus && ref.focus();\n };\n const watch = (name, defaultValue)=>isFunction(name) ? _subjects.values.subscribe({\n next: (payload)=>name(_getWatch(undefined, defaultValue), payload)\n }) : _getWatch(name, defaultValue, true);\n const unregister = (name, options = {})=>{\n for (const fieldName of name ? convertToArrayPayload(name) : _names.mount){\n _names.mount.delete(fieldName);\n _names.array.delete(fieldName);\n if (!options.keepValue) {\n unset(_fields, fieldName);\n unset(_formValues, fieldName);\n }\n !options.keepError && unset(_formState.errors, fieldName);\n !options.keepDirty && unset(_formState.dirtyFields, fieldName);\n !options.keepTouched && unset(_formState.touchedFields, fieldName);\n !_options.shouldUnregister && !options.keepDefaultValue && unset(_defaultValues, fieldName);\n }\n _subjects.values.next({\n values: {\n ..._formValues\n }\n });\n _subjects.state.next({\n ..._formState,\n ...!options.keepDirty ? {} : {\n isDirty: _getDirty()\n }\n });\n !options.keepIsValid && _updateValid();\n };\n const _updateDisabledField = ({ disabled, name, field, fields, value: value1 })=>{\n if (isBoolean(disabled)) {\n const inputValue = disabled ? undefined : isUndefined(value1) ? getFieldValue(field ? field._f : get(fields, name)._f) : value1;\n set(_formValues, name, inputValue);\n updateTouchAndDirty(name, inputValue, false, false, true);\n }\n };\n const register = (name, options = {})=>{\n let field = get(_fields, name);\n const disabledIsDefined = isBoolean(options.disabled);\n set(_fields, name, {\n ...field || {},\n _f: {\n ...field && field._f ? field._f : {\n ref: {\n name\n }\n },\n name,\n mount: true,\n ...options\n }\n });\n _names.mount.add(name);\n if (field) {\n _updateDisabledField({\n field,\n disabled: options.disabled,\n name,\n value: options.value\n });\n } else {\n updateValidAndValue(name, true, options.value);\n }\n return {\n ...disabledIsDefined ? {\n disabled: options.disabled\n } : {},\n ..._options.progressive ? {\n required: !!options.required,\n min: getRuleValue(options.min),\n max: getRuleValue(options.max),\n minLength: getRuleValue(options.minLength),\n maxLength: getRuleValue(options.maxLength),\n pattern: getRuleValue(options.pattern)\n } : {},\n name,\n onChange,\n onBlur: onChange,\n ref: (ref)=>{\n if (ref) {\n register(name, options);\n field = get(_fields, name);\n const fieldRef = isUndefined(ref.value) ? ref.querySelectorAll ? ref.querySelectorAll(\"input,select,textarea\")[0] || ref : ref : ref;\n const radioOrCheckbox = isRadioOrCheckbox(fieldRef);\n const refs = field._f.refs || [];\n if (radioOrCheckbox ? refs.find((option)=>option === fieldRef) : fieldRef === field._f.ref) {\n return;\n }\n set(_fields, name, {\n _f: {\n ...field._f,\n ...radioOrCheckbox ? {\n refs: [\n ...refs.filter(live),\n fieldRef,\n ...Array.isArray(get(_defaultValues, name)) ? [\n {}\n ] : []\n ],\n ref: {\n type: fieldRef.type,\n name\n }\n } : {\n ref: fieldRef\n }\n }\n });\n updateValidAndValue(name, false, undefined, fieldRef);\n } else {\n field = get(_fields, name, {});\n if (field._f) {\n field._f.mount = false;\n }\n (_options.shouldUnregister || options.shouldUnregister) && !(isNameInFieldArray(_names.array, name) && _state.action) && _names.unMount.add(name);\n }\n }\n };\n };\n const _focusError = ()=>_options.shouldFocusError && iterateFieldsByAction(_fields, _focusInput, _names.mount);\n const _disableForm = (disabled)=>{\n if (isBoolean(disabled)) {\n _subjects.state.next({\n disabled\n });\n iterateFieldsByAction(_fields, (ref, name)=>{\n let requiredDisabledState = disabled;\n const currentField = get(_fields, name);\n if (currentField && isBoolean(currentField._f.disabled)) {\n requiredDisabledState || (requiredDisabledState = currentField._f.disabled);\n }\n ref.disabled = requiredDisabledState;\n }, 0, false);\n }\n };\n const handleSubmit = (onValid, onInvalid)=>async (e)=>{\n let onValidError = undefined;\n if (e) {\n e.preventDefault && e.preventDefault();\n e.persist && e.persist();\n }\n let fieldValues = cloneObject(_formValues);\n _subjects.state.next({\n isSubmitting: true\n });\n if (_options.resolver) {\n const { errors, values } = await _executeSchema();\n _formState.errors = errors;\n fieldValues = values;\n } else {\n await executeBuiltInValidation(_fields);\n }\n unset(_formState.errors, \"root\");\n if (isEmptyObject(_formState.errors)) {\n _subjects.state.next({\n errors: {}\n });\n try {\n await onValid(fieldValues, e);\n } catch (error) {\n onValidError = error;\n }\n } else {\n if (onInvalid) {\n await onInvalid({\n ..._formState.errors\n }, e);\n }\n _focusError();\n setTimeout(_focusError);\n }\n _subjects.state.next({\n isSubmitted: true,\n isSubmitting: false,\n isSubmitSuccessful: isEmptyObject(_formState.errors) && !onValidError,\n submitCount: _formState.submitCount + 1,\n errors: _formState.errors\n });\n if (onValidError) {\n throw onValidError;\n }\n };\n const resetField = (name, options = {})=>{\n if (get(_fields, name)) {\n if (isUndefined(options.defaultValue)) {\n setValue(name, cloneObject(get(_defaultValues, name)));\n } else {\n setValue(name, options.defaultValue);\n set(_defaultValues, name, cloneObject(options.defaultValue));\n }\n if (!options.keepTouched) {\n unset(_formState.touchedFields, name);\n }\n if (!options.keepDirty) {\n unset(_formState.dirtyFields, name);\n _formState.isDirty = options.defaultValue ? _getDirty(name, cloneObject(get(_defaultValues, name))) : _getDirty();\n }\n if (!options.keepError) {\n unset(_formState.errors, name);\n _proxyFormState.isValid && _updateValid();\n }\n _subjects.state.next({\n ..._formState\n });\n }\n };\n const _reset = (formValues, keepStateOptions = {})=>{\n const updatedValues = formValues ? cloneObject(formValues) : _defaultValues;\n const cloneUpdatedValues = cloneObject(updatedValues);\n const values = formValues && !isEmptyObject(formValues) ? cloneUpdatedValues : _defaultValues;\n if (!keepStateOptions.keepDefaultValues) {\n _defaultValues = updatedValues;\n }\n if (!keepStateOptions.keepValues) {\n if (keepStateOptions.keepDirtyValues) {\n for (const fieldName of _names.mount){\n get(_formState.dirtyFields, fieldName) ? set(values, fieldName, get(_formValues, fieldName)) : setValue(fieldName, get(values, fieldName));\n }\n } else {\n if (isWeb && isUndefined(formValues)) {\n for (const name of _names.mount){\n const field = get(_fields, name);\n if (field && field._f) {\n const fieldReference = Array.isArray(field._f.refs) ? field._f.refs[0] : field._f.ref;\n if (isHTMLElement(fieldReference)) {\n const form = fieldReference.closest(\"form\");\n if (form) {\n form.reset();\n break;\n }\n }\n }\n }\n }\n _fields = {};\n }\n _formValues = props.shouldUnregister ? keepStateOptions.keepDefaultValues ? cloneObject(_defaultValues) : {} : cloneObject(values);\n _subjects.array.next({\n values: {\n ...values\n }\n });\n _subjects.values.next({\n values: {\n ...values\n }\n });\n }\n _names = {\n mount: new Set(),\n unMount: new Set(),\n array: new Set(),\n watch: new Set(),\n watchAll: false,\n focus: \"\"\n };\n !_state.mount && flushRootRender();\n _state.mount = !_proxyFormState.isValid || !!keepStateOptions.keepIsValid || !!keepStateOptions.keepDirtyValues;\n _state.watch = !!props.shouldUnregister;\n _subjects.state.next({\n submitCount: keepStateOptions.keepSubmitCount ? _formState.submitCount : 0,\n isDirty: keepStateOptions.keepDirty ? _formState.isDirty : !!(keepStateOptions.keepDefaultValues && !deepEqual(formValues, _defaultValues)),\n isSubmitted: keepStateOptions.keepIsSubmitted ? _formState.isSubmitted : false,\n dirtyFields: keepStateOptions.keepDirtyValues ? keepStateOptions.keepDefaultValues && _formValues ? getDirtyFields(_defaultValues, _formValues) : _formState.dirtyFields : keepStateOptions.keepDefaultValues && formValues ? getDirtyFields(_defaultValues, formValues) : {},\n touchedFields: keepStateOptions.keepTouched ? _formState.touchedFields : {},\n errors: keepStateOptions.keepErrors ? _formState.errors : {},\n isSubmitSuccessful: keepStateOptions.keepIsSubmitSuccessful ? _formState.isSubmitSuccessful : false,\n isSubmitting: false\n });\n };\n const reset = (formValues, keepStateOptions)=>_reset(isFunction(formValues) ? formValues(_formValues) : formValues, keepStateOptions);\n const setFocus = (name, options = {})=>{\n const field = get(_fields, name);\n const fieldReference = field && field._f;\n if (fieldReference) {\n const fieldRef = fieldReference.refs ? fieldReference.refs[0] : fieldReference.ref;\n if (fieldRef.focus) {\n fieldRef.focus();\n options.shouldSelect && fieldRef.select();\n }\n }\n };\n const _updateFormState = (updatedFormState)=>{\n _formState = {\n ..._formState,\n ...updatedFormState\n };\n };\n const _resetDefaultValues = ()=>isFunction(_options.defaultValues) && _options.defaultValues().then((values)=>{\n reset(values, _options.resetOptions);\n _subjects.state.next({\n isLoading: false\n });\n });\n return {\n control: {\n register,\n unregister,\n getFieldState,\n handleSubmit,\n setError,\n _executeSchema,\n _getWatch,\n _getDirty,\n _updateValid,\n _removeUnmounted,\n _updateFieldArray,\n _updateDisabledField,\n _getFieldArray,\n _reset,\n _resetDefaultValues,\n _updateFormState,\n _disableForm,\n _subjects,\n _proxyFormState,\n _setErrors,\n get _fields () {\n return _fields;\n },\n get _formValues () {\n return _formValues;\n },\n get _state () {\n return _state;\n },\n set _state (value){\n _state = value;\n },\n get _defaultValues () {\n return _defaultValues;\n },\n get _names () {\n return _names;\n },\n set _names (value){\n _names = value;\n },\n get _formState () {\n return _formState;\n },\n set _formState (value){\n _formState = value;\n },\n get _options () {\n return _options;\n },\n set _options (value){\n _options = {\n ..._options,\n ...value\n };\n }\n },\n trigger,\n register,\n handleSubmit,\n watch,\n setValue,\n getValues,\n reset,\n resetField,\n clearErrors,\n unregister,\n setError,\n setFocus,\n getFieldState\n };\n}\n/**\n * Custom hook to manage the entire form.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform) • [Demo](https://codesandbox.io/s/react-hook-form-get-started-ts-5ksmm) • [Video](https://www.youtube.com/watch?v=RkXv4AXXC_4)\n *\n * @param props - form configuration and validation parameters.\n *\n * @returns methods - individual functions to manage the form state. {@link UseFormReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, watch, formState: { errors } } = useForm();\n * const onSubmit = data => console.log(data);\n *\n * console.log(watch(\"example\"));\n *\n * return (\n *
\n * \n * \n * {errors.exampleRequired && This field is required}\n * \n *
\n * );\n * }\n * ```\n */ function useForm(props = {}) {\n const _formControl = react__WEBPACK_IMPORTED_MODULE_0__.useRef();\n const _values = react__WEBPACK_IMPORTED_MODULE_0__.useRef();\n const [formState, updateFormState] = react__WEBPACK_IMPORTED_MODULE_0__.useState({\n isDirty: false,\n isValidating: false,\n isLoading: isFunction(props.defaultValues),\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n submitCount: 0,\n dirtyFields: {},\n touchedFields: {},\n errors: props.errors || {},\n disabled: props.disabled || false,\n defaultValues: isFunction(props.defaultValues) ? undefined : props.defaultValues\n });\n if (!_formControl.current) {\n _formControl.current = {\n ...createFormControl(props, ()=>updateFormState((formState)=>({\n ...formState\n }))),\n formState\n };\n }\n const control = _formControl.current.control;\n control._options = props;\n useSubscribe({\n subject: control._subjects.state,\n next: (value1)=>{\n if (shouldRenderFormState(value1, control._proxyFormState, control._updateFormState, true)) {\n updateFormState({\n ...control._formState\n });\n }\n }\n });\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>control._disableForm(props.disabled), [\n control,\n props.disabled\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (control._proxyFormState.isDirty) {\n const isDirty = control._getDirty();\n if (isDirty !== formState.isDirty) {\n control._subjects.state.next({\n isDirty\n });\n }\n }\n }, [\n control,\n formState.isDirty\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (props.values && !deepEqual(props.values, _values.current)) {\n control._reset(props.values, control._options.resetOptions);\n _values.current = props.values;\n updateFormState((state)=>({\n ...state\n }));\n } else {\n control._resetDefaultValues();\n }\n }, [\n props.values,\n control\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (props.errors) {\n control._setErrors(props.errors);\n }\n }, [\n props.errors,\n control\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (!control._state.mount) {\n control._updateValid();\n control._state.mount = true;\n }\n if (control._state.watch) {\n control._state.watch = false;\n control._subjects.state.next({\n ...control._formState\n });\n }\n control._removeUnmounted();\n });\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n props.shouldUnregister && control._subjects.values.next({\n values: control._getWatch()\n });\n }, [\n props.shouldUnregister,\n control\n ]);\n _formControl.current.formState = getProxyFormState(formState, control);\n return _formControl.current;\n}\n //# sourceMappingURL=index.esm.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvcmVhY3QtaG9vay1mb3JtL2Rpc3QvaW5kZXguZXNtLm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQTBCO0FBRTFCLElBQUlDLGtCQUFrQixDQUFDQyxVQUFZQSxRQUFRQyxJQUFJLEtBQUs7QUFFcEQsSUFBSUMsZUFBZSxDQUFDQyxTQUFVQSxrQkFBaUJDO0FBRS9DLElBQUlDLG9CQUFvQixDQUFDRixTQUFVQSxVQUFTO0FBRTVDLE1BQU1HLGVBQWUsQ0FBQ0gsU0FBVSxPQUFPQSxXQUFVO0FBQ2pELElBQUlJLFdBQVcsQ0FBQ0osU0FBVSxDQUFDRSxrQkFBa0JGLFdBQ3pDLENBQUNLLE1BQU1DLE9BQU8sQ0FBQ04sV0FDZkcsYUFBYUgsV0FDYixDQUFDRCxhQUFhQztBQUVsQixJQUFJTyxnQkFBZ0IsQ0FBQ0MsUUFBVUosU0FBU0ksVUFBVUEsTUFBTUMsTUFBTSxHQUN4RGIsZ0JBQWdCWSxNQUFNQyxNQUFNLElBQ3hCRCxNQUFNQyxNQUFNLENBQUNDLE9BQU8sR0FDcEJGLE1BQU1DLE1BQU0sQ0FBQ1QsS0FBSyxHQUN0QlE7QUFFTixJQUFJRyxvQkFBb0IsQ0FBQ0MsT0FBU0EsS0FBS0MsU0FBUyxDQUFDLEdBQUdELEtBQUtFLE1BQU0sQ0FBQyxtQkFBbUJGO0FBRW5GLElBQUlHLHFCQUFxQixDQUFDQyxPQUFPSixPQUFTSSxNQUFNQyxHQUFHLENBQUNOLGtCQUFrQkM7QUFFdEUsSUFBSU0sZ0JBQWdCLENBQUNDO0lBQ2pCLE1BQU1DLGdCQUFnQkQsV0FBV0UsV0FBVyxJQUFJRixXQUFXRSxXQUFXLENBQUNDLFNBQVM7SUFDaEYsT0FBUWxCLFNBQVNnQixrQkFBa0JBLGNBQWNHLGNBQWMsQ0FBQztBQUNwRTtBQUVBLElBQUlDLFFBQVEsTUFDc0IsSUFDOUIsQ0FBb0I7QUFFeEIsU0FBU0ksWUFBWUMsSUFBSTtJQUNyQixJQUFJQztJQUNKLE1BQU14QixVQUFVRCxNQUFNQyxPQUFPLENBQUN1QjtJQUM5QixJ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RztRQUMzQjtRQUNBLElBQUk3RixRQUFROEYsTUFBTSxDQUFDckMsS0FBSyxFQUFFO1lBQ3RCekQsUUFBUThGLE1BQU0sQ0FBQ3JDLEtBQUssR0FBRztZQUN2QnpELFFBQVFpRCxTQUFTLENBQUNDLEtBQUssQ0FBQ2xCLElBQUksQ0FBQztnQkFBRSxHQUFHaEMsUUFBUXFDLFVBQVU7WUFBQztRQUN6RDtRQUNBckMsUUFBUW1FLGdCQUFnQjtJQUM1QjtJQUNBdEosNENBQWUsQ0FBQztRQUNaNkUsTUFBTXVGLGdCQUFnQixJQUNsQmpGLFFBQVFpRCxTQUFTLENBQUNjLE1BQU0sQ0FBQy9CLElBQUksQ0FBQztZQUMxQitCLFFBQVEvRCxRQUFRa0UsU0FBUztRQUM3QjtJQUNSLEdBQUc7UUFBQ3hFLE1BQU11RixnQkFBZ0I7UUFBRWpGO0tBQVE7SUFDcEM0YyxhQUFhbGIsT0FBTyxDQUFDM0IsU0FBUyxHQUFHRCxrQkFBa0JDLFdBQVdDO0lBQzlELE9BQU80YyxhQUFhbGIsT0FBTztBQUMvQjtBQUVpSixDQUNqSixzQ0FBc0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9lbWJlZGNoYWluLWFkbWluLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWhvb2stZm9ybS9kaXN0L2luZGV4LmVzbS5tanM/OWRjMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG52YXIgaXNDaGVja0JveElucHV0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JztcblxudmFyIGlzRGF0ZU9iamVjdCA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuXG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSAodmFsdWUpID0+IHZhbHVlID09IG51bGw7XG5cbmNvbnN0IGlzT2JqZWN0VHlwZSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbnZhciBpc09iamVjdCA9ICh2YWx1ZSkgPT4gIWlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSAmJlxuICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgIGlzT2JqZWN0VHlwZSh2YWx1ZSkgJiZcbiAgICAhaXNEYXRlT2JqZWN0KHZhbHVlKTtcblxudmFyIGdldEV2ZW50VmFsdWUgPSAoZXZlbnQpID0+IGlzT2JqZWN0KGV2ZW50KSAmJiBldmVudC50YXJnZXRcbiAgICA/IGlzQ2hlY2tCb3hJbnB1dChldmVudC50YXJnZXQpXG4gICAgICAgID8gZXZlbnQudGFyZ2V0LmNoZWNrZWRcbiAgICAgICAgOiBldmVudC50YXJnZXQudmFsdWVcbiAgICA6IGV2ZW50O1xuXG52YXIgZ2V0Tm9kZVBhcmVudE5hbWUgPSAobmFtZSkgPT4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5zZWFyY2goL1xcLlxcZCsoXFwufCQpLykpIHx8IG5hbWU7XG5cbnZhciBpc05hbWVJbkZpZWxkQXJyYXkgPSAobmFtZXMsIG5hbWUpID0+IG5hbWVzLmhhcyhnZXROb2RlUGFyZW50TmFtZShuYW1lKSk7XG5cbnZhciBpc1BsYWluT2JqZWN0ID0gKHRlbXBPYmplY3QpID0+IHtcbiAgICBjb25zdCBwcm90b3R5cGVDb3B5ID0gdGVtcE9iamVjdC5jb25zdHJ1Y3RvciAmJiB0ZW1wT2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICByZXR1cm4gKGlzT2JqZWN0KHByb3RvdHlwZUNvcHkpICYmIHByb3RvdHlwZUNvcHkuaGFzT3duUHJvcGVydHkoJ2lzUHJvdG90eXBlT2YnKSk7XG59O1xuXG52YXIgaXNXZWIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiB3aW5kb3cuSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuZnVuY3Rpb24gY2xvbmVPYmplY3QoZGF0YSkge1xuICAgIGxldCBjb3B5O1xuICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBjb3B5ID0gbmV3IERhdGUoZGF0YSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgY29weSA9IG5ldyBTZXQoZGF0YSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEoaXNXZWIgJiYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iIHx8IGRhdGEgaW5zdGFuY2VvZiBGaWxlTGlzdCkpICYmXG4gICAgICAgIChpc0FycmF5IHx8IGlzT2JqZWN0KGRhdGEpKSkge1xuICAgICAgICBjb3B5ID0gaXNBcnJheSA/IFtdIDoge307XG4gICAgICAgIGlmICghaXNBcnJheSAmJiAhaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgY29weSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb3B5W2tleV0gPSBjbG9uZU9iamVjdChkYXRhW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xufVxuXG52YXIgY29tcGFjdCA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcblxudmFyIGlzVW5kZWZpbmVkID0gKHZhbCkgPT4gdmFsID09PSB1bmRlZmluZWQ7XG5cbnZhciBnZXQgPSAob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICBpZiAoIXBhdGggfHwgIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGFjdChwYXRoLnNwbGl0KC9bLFtcXF0uXSs/LykpLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IGlzTnVsbE9yVW5kZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHRba2V5XSwgb2JqZWN0KTtcbiAgICByZXR1cm4gaXNVbmRlZmluZWQocmVzdWx0KSB8fCByZXN1bHQgPT09IG9iamVjdFxuICAgICAgICA/IGlzVW5kZWZpbmVkKG9iamVjdFtwYXRoXSlcbiAgICAgICAgICAgID8gZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICA6IG9iamVjdFtwYXRoXVxuICAgICAgICA6IHJlc3VsdDtcbn07XG5cbnZhciBpc0Jvb2xlYW4gPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuXG5jb25zdCBFVkVOVFMgPSB7XG4gICAgQkxVUjogJ2JsdXInLFxuICAgIEZPQ1VTX09VVDogJ2ZvY3Vzb3V0JyxcbiAgICBDSEFOR0U6ICdjaGFuZ2UnLFxufTtcbmNvbnN0IFZBTElEQVRJT05fTU9ERSA9IHtcbiAgICBvbkJsdXI6ICdvbkJsdXInLFxuICAgIG9uQ2hhbmdlOiAnb25DaGFuZ2UnLFxuICAgIG9uU3VibWl0OiAnb25TdWJtaXQnLFxuICAgIG9uVG91Y2hlZDogJ29uVG91Y2hlZCcsXG4gICAgYWxsOiAnYWxsJyxcbn07XG5jb25zdCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTID0ge1xuICAgIG1heDogJ21heCcsXG4gICAgbWluOiAnbWluJyxcbiAgICBtYXhMZW5ndGg6ICdtYXhMZW5ndGgnLFxuICAgIG1pbkxlbmd0aDogJ21pbkxlbmd0aCcsXG4gICAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgIHZhbGlkYXRlOiAndmFsaWRhdGUnLFxufTtcblxuY29uc3QgSG9va0Zvcm1Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbi8qKlxuICogVGhpcyBjdXN0b20gaG9vayBhbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgZm9ybSBjb250ZXh0LiB1c2VGb3JtQ29udGV4dCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGRlZXBseSBuZXN0ZWQgc3RydWN0dXJlcywgd2hlcmUgaXQgd291bGQgYmVjb21lIGluY29udmVuaWVudCB0byBwYXNzIHRoZSBjb250ZXh0IGFzIGEgcHJvcC4gVG8gYmUgdXNlZCB3aXRoIHtAbGluayBGb3JtUHJvdmlkZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vmb3JtY29udGV4dCkg4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvcmVhY3QtaG9vay1mb3JtLXY3LWZvcm0tY29udGV4dC15dHVkaSlcbiAqXG4gKiBAcmV0dXJucyByZXR1cm4gYWxsIHVzZUZvcm0gbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Rm9ybVByb3ZpZGVyIHsuLi5tZXRob2RzfSA+XG4gKiAgICAgICA8Zm9ybSBvblN1Ym1pdD17bWV0aG9kcy5oYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgICAgPE5lc3RlZElucHV0IC8+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgLz5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L0Zvcm1Qcm92aWRlcj5cbiAqICAgKTtcbiAqIH1cbiAqXG4gKiAgZnVuY3Rpb24gTmVzdGVkSW5wdXQoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIgfSA9IHVzZUZvcm1Db250ZXh0KCk7IC8vIHJldHJpZXZlIGFsbCBob29rIG1ldGhvZHNcbiAqICAgcmV0dXJuIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJ0ZXN0XCIpfSAvPjtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCB1c2VGb3JtQ29udGV4dCA9ICgpID0+IFJlYWN0LnVzZUNvbnRleHQoSG9va0Zvcm1Db250ZXh0KTtcbi8qKlxuICogQSBwcm92aWRlciBjb21wb25lbnQgdGhhdCBwcm9wYWdhdGVzIHRoZSBgdXNlRm9ybWAgbWV0aG9kcyB0byBhbGwgY2hpbGRyZW4gY29tcG9uZW50cyB2aWEgW1JlYWN0IENvbnRleHRdKGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9jb250ZXh0Lmh0bWwpIEFQSS4gVG8gYmUgdXNlZCB3aXRoIHtAbGluayB1c2VGb3JtQ29udGV4dH0uXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZvcm1jb250ZXh0KSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjctZm9ybS1jb250ZXh0LXl0dWRpKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIGFsbCB1c2VGb3JtIG1ldGhvZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IG9uU3VibWl0ID0gZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEZvcm1Qcm92aWRlciB7Li4ubWV0aG9kc30gPlxuICogICAgICAgPGZvcm0gb25TdWJtaXQ9e21ldGhvZHMuaGFuZGxlU3VibWl0KG9uU3VibWl0KX0+XG4gKiAgICAgICAgIDxOZXN0ZWRJbnB1dCAvPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgPC9Gb3JtUHJvdmlkZXI+XG4gKiAgICk7XG4gKiB9XG4gKlxuICogIGZ1bmN0aW9uIE5lc3RlZElucHV0KCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyIH0gPSB1c2VGb3JtQ29udGV4dCgpOyAvLyByZXRyaWV2ZSBhbGwgaG9vayBtZXRob2RzXG4gKiAgIHJldHVybiA8aW5wdXQgey4uLnJlZ2lzdGVyKFwidGVzdFwiKX0gLz47XG4gKiB9XG4gKiBgYGBcbiAqL1xuY29uc3QgRm9ybVByb3ZpZGVyID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgeyBjaGlsZHJlbiwgLi4uZGF0YSB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEhvb2tGb3JtQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZGF0YSB9LCBjaGlsZHJlbikpO1xufTtcblxudmFyIGdldFByb3h5Rm9ybVN0YXRlID0gKGZvcm1TdGF0ZSwgY29udHJvbCwgbG9jYWxQcm94eUZvcm1TdGF0ZSwgaXNSb290ID0gdHJ1ZSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlczogY29udHJvbC5fZGVmYXVsdFZhbHVlcyxcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm1TdGF0ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBrZXksIHtcbiAgICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9rZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlW19rZXldICE9PSBWQUxJREFUSU9OX01PREUuYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlW19rZXldID0gIWlzUm9vdCB8fCBWQUxJREFUSU9OX01PREUuYWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbFByb3h5Rm9ybVN0YXRlICYmIChsb2NhbFByb3h5Rm9ybVN0YXRlW19rZXldID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1TdGF0ZVtfa2V5XTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIGlzRW1wdHlPYmplY3QgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSAmJiAhT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcblxudmFyIHNob3VsZFJlbmRlckZvcm1TdGF0ZSA9IChmb3JtU3RhdGVEYXRhLCBfcHJveHlGb3JtU3RhdGUsIHVwZGF0ZUZvcm1TdGF0ZSwgaXNSb290KSA9PiB7XG4gICAgdXBkYXRlRm9ybVN0YXRlKGZvcm1TdGF0ZURhdGEpO1xuICAgIGNvbnN0IHsgbmFtZSwgLi4uZm9ybVN0YXRlIH0gPSBmb3JtU3RhdGVEYXRhO1xuICAgIHJldHVybiAoaXNFbXB0eU9iamVjdChmb3JtU3RhdGUpIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKGZvcm1TdGF0ZSkubGVuZ3RoID49IE9iamVjdC5rZXlzKF9wcm94eUZvcm1TdGF0ZSkubGVuZ3RoIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKGZvcm1TdGF0ZSkuZmluZCgoa2V5KSA9PiBfcHJveHlGb3JtU3RhdGVba2V5XSA9PT1cbiAgICAgICAgICAgICghaXNSb290IHx8IFZBTElEQVRJT05fTU9ERS5hbGwpKSk7XG59O1xuXG52YXIgY29udmVydFRvQXJyYXlQYXlsb2FkID0gKHZhbHVlKSA9PiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuXG52YXIgc2hvdWxkU3Vic2NyaWJlQnlOYW1lID0gKG5hbWUsIHNpZ25hbE5hbWUsIGV4YWN0KSA9PiAhbmFtZSB8fFxuICAgICFzaWduYWxOYW1lIHx8XG4gICAgbmFtZSA9PT0gc2lnbmFsTmFtZSB8fFxuICAgIGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKS5zb21lKChjdXJyZW50TmFtZSkgPT4gY3VycmVudE5hbWUgJiZcbiAgICAgICAgKGV4YWN0XG4gICAgICAgICAgICA/IGN1cnJlbnROYW1lID09PSBzaWduYWxOYW1lXG4gICAgICAgICAgICA6IGN1cnJlbnROYW1lLnN0YXJ0c1dpdGgoc2lnbmFsTmFtZSkgfHxcbiAgICAgICAgICAgICAgICBzaWduYWxOYW1lLnN0YXJ0c1dpdGgoY3VycmVudE5hbWUpKSk7XG5cbmZ1bmN0aW9uIHVzZVN1YnNjcmliZShwcm9wcykge1xuICAgIGNvbnN0IF9wcm9wcyA9IFJlYWN0LnVzZVJlZihwcm9wcyk7XG4gICAgX3Byb3BzLmN1cnJlbnQgPSBwcm9wcztcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSAhcHJvcHMuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIF9wcm9wcy5jdXJyZW50LnN1YmplY3QgJiZcbiAgICAgICAgICAgIF9wcm9wcy5jdXJyZW50LnN1YmplY3Quc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiBfcHJvcHMuY3VycmVudC5uZXh0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gJiYgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG4gICAgfSwgW3Byb3BzLmRpc2FibGVkXSk7XG59XG5cbi8qKlxuICogVGhpcyBjdXN0b20gaG9vayBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBlYWNoIGZvcm0gc3RhdGUsIGFuZCBpc29sYXRlIHRoZSByZS1yZW5kZXIgYXQgdGhlIGN1c3RvbSBob29rIGxldmVsLiBJdCBoYXMgaXRzIHNjb3BlIGluIHRlcm1zIG9mIGZvcm0gc3RhdGUgc3Vic2NyaXB0aW9uLCBzbyBpdCB3b3VsZCBub3QgYWZmZWN0IG90aGVyIHVzZUZvcm1TdGF0ZSBhbmQgdXNlRm9ybS4gVXNpbmcgdGhpcyBob29rIGNhbiByZWR1Y2UgdGhlIHJlLXJlbmRlciBpbXBhY3Qgb24gbGFyZ2UgYW5kIGNvbXBsZXggZm9ybSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybXN0YXRlKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy91c2Vmb3Jtc3RhdGUtNzV4bHkpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gaW5jbHVkZSBvcHRpb25zIG9uIHNwZWNpZnkgZmllbGRzIHRvIHN1YnNjcmliZS4ge0BsaW5rIFVzZUZvcm1TdGF0ZVJldHVybn1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIsIGhhbmRsZVN1Ym1pdCwgY29udHJvbCB9ID0gdXNlRm9ybSh7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgIGZpcnN0TmFtZTogXCJmaXJzdE5hbWVcIlxuICogICB9fSk7XG4gKiAgIGNvbnN0IHsgZGlydHlGaWVsZHMgfSA9IHVzZUZvcm1TdGF0ZSh7XG4gKiAgICAgY29udHJvbFxuICogICB9KTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSAoZGF0YSkgPT4gY29uc29sZS5sb2coZGF0YSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJmaXJzdE5hbWVcIil9IHBsYWNlaG9sZGVyPVwiRmlyc3QgTmFtZVwiIC8+XG4gKiAgICAgICB7ZGlydHlGaWVsZHMuZmlyc3ROYW1lICYmIDxwPkZpZWxkIGlzIGRpcnR5LjwvcD59XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUZvcm1TdGF0ZShwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgZGlzYWJsZWQsIG5hbWUsIGV4YWN0IH0gPSBwcm9wcyB8fCB7fTtcbiAgICBjb25zdCBbZm9ybVN0YXRlLCB1cGRhdGVGb3JtU3RhdGVdID0gUmVhY3QudXNlU3RhdGUoY29udHJvbC5fZm9ybVN0YXRlKTtcbiAgICBjb25zdCBfbW91bnRlZCA9IFJlYWN0LnVzZVJlZih0cnVlKTtcbiAgICBjb25zdCBfbG9jYWxQcm94eUZvcm1TdGF0ZSA9IFJlYWN0LnVzZVJlZih7XG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBkaXJ0eUZpZWxkczogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3JzOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBfbmFtZSA9IFJlYWN0LnVzZVJlZihuYW1lKTtcbiAgICBfbmFtZS5jdXJyZW50ID0gbmFtZTtcbiAgICB1c2VTdWJzY3JpYmUoe1xuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgbmV4dDogKHZhbHVlKSA9PiBfbW91bnRlZC5jdXJyZW50ICYmXG4gICAgICAgICAgICBzaG91bGRTdWJzY3JpYmVCeU5hbWUoX25hbWUuY3VycmVudCwgdmFsdWUubmFtZSwgZXhhY3QpICYmXG4gICAgICAgICAgICBzaG91bGRSZW5kZXJGb3JtU3RhdGUodmFsdWUsIF9sb2NhbFByb3h5Rm9ybVN0YXRlLmN1cnJlbnQsIGNvbnRyb2wuX3VwZGF0ZUZvcm1TdGF0ZSkgJiZcbiAgICAgICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4uY29udHJvbC5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIHN1YmplY3Q6IGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLFxuICAgIH0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIF9tb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBfbG9jYWxQcm94eUZvcm1TdGF0ZS5jdXJyZW50LmlzVmFsaWQgJiYgY29udHJvbC5fdXBkYXRlVmFsaWQodHJ1ZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBfbW91bnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfSwgW2NvbnRyb2xdKTtcbiAgICByZXR1cm4gZ2V0UHJveHlGb3JtU3RhdGUoZm9ybVN0YXRlLCBjb250cm9sLCBfbG9jYWxQcm94eUZvcm1TdGF0ZS5jdXJyZW50LCBmYWxzZSk7XG59XG5cbnZhciBpc1N0cmluZyA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcblxudmFyIGdlbmVyYXRlV2F0Y2hPdXRwdXQgPSAobmFtZXMsIF9uYW1lcywgZm9ybVZhbHVlcywgaXNHbG9iYWwsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhuYW1lcykpIHtcbiAgICAgICAgaXNHbG9iYWwgJiYgX25hbWVzLndhdGNoLmFkZChuYW1lcyk7XG4gICAgICAgIHJldHVybiBnZXQoZm9ybVZhbHVlcywgbmFtZXMsIGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWVzKSkge1xuICAgICAgICByZXR1cm4gbmFtZXMubWFwKChmaWVsZE5hbWUpID0+IChpc0dsb2JhbCAmJiBfbmFtZXMud2F0Y2guYWRkKGZpZWxkTmFtZSksIGdldChmb3JtVmFsdWVzLCBmaWVsZE5hbWUpKSk7XG4gICAgfVxuICAgIGlzR2xvYmFsICYmIChfbmFtZXMud2F0Y2hBbGwgPSB0cnVlKTtcbiAgICByZXR1cm4gZm9ybVZhbHVlcztcbn07XG5cbi8qKlxuICogQ3VzdG9tIGhvb2sgdG8gc3Vic2NyaWJlIHRvIGZpZWxkIGNoYW5nZSBhbmQgaXNvbGF0ZSByZS1yZW5kZXJpbmcgYXQgdGhlIGNvbXBvbmVudCBsZXZlbC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZXdhdGNoKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjctdHMtdXNld2F0Y2gtaDlpNWUpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiBjb25zdCB2YWx1ZXMgPSB1c2VXYXRjaCh7XG4gKiAgIG5hbWU6IFwiZmllbGROYW1lXCJcbiAqICAgY29udHJvbCxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXNlV2F0Y2gocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG5hbWUsIGRlZmF1bHRWYWx1ZSwgZGlzYWJsZWQsIGV4YWN0LCB9ID0gcHJvcHMgfHwge307XG4gICAgY29uc3QgX25hbWUgPSBSZWFjdC51c2VSZWYobmFtZSk7XG4gICAgX25hbWUuY3VycmVudCA9IG5hbWU7XG4gICAgdXNlU3Vic2NyaWJlKHtcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIHN1YmplY3Q6IGNvbnRyb2wuX3N1YmplY3RzLnZhbHVlcyxcbiAgICAgICAgbmV4dDogKGZvcm1TdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNob3VsZFN1YnNjcmliZUJ5TmFtZShfbmFtZS5jdXJyZW50LCBmb3JtU3RhdGUubmFtZSwgZXhhY3QpKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlVmFsdWUoY2xvbmVPYmplY3QoZ2VuZXJhdGVXYXRjaE91dHB1dChfbmFtZS5jdXJyZW50LCBjb250cm9sLl9uYW1lcywgZm9ybVN0YXRlLnZhbHVlcyB8fCBjb250cm9sLl9mb3JtVmFsdWVzLCBmYWxzZSwgZGVmYXVsdFZhbHVlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFt2YWx1ZSwgdXBkYXRlVmFsdWVdID0gUmVhY3QudXNlU3RhdGUoY29udHJvbC5fZ2V0V2F0Y2gobmFtZSwgZGVmYXVsdFZhbHVlKSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IGNvbnRyb2wuX3JlbW92ZVVubW91bnRlZCgpKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBpc0tleSA9ICh2YWx1ZSkgPT4gL15cXHcqJC8udGVzdCh2YWx1ZSk7XG5cbnZhciBzdHJpbmdUb1BhdGggPSAoaW5wdXQpID0+IGNvbXBhY3QoaW5wdXQucmVwbGFjZSgvW1wifCddfFxcXS9nLCAnJykuc3BsaXQoL1xcLnxcXFsvKSk7XG5cbnZhciBzZXQgPSAob2JqZWN0LCBwYXRoLCB2YWx1ZSkgPT4ge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGNvbnN0IHRlbXBQYXRoID0gaXNLZXkocGF0aCkgPyBbcGF0aF0gOiBzdHJpbmdUb1BhdGgocGF0aCk7XG4gICAgY29uc3QgbGVuZ3RoID0gdGVtcFBhdGgubGVuZ3RoO1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGVtcFBhdGhbaW5kZXhdO1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgICBuZXdWYWx1ZSA9XG4gICAgICAgICAgICAgICAgaXNPYmplY3Qob2JqVmFsdWUpIHx8IEFycmF5LmlzQXJyYXkob2JqVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiAhaXNOYU4oK3RlbXBQYXRoW2luZGV4ICsgMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHt9O1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdFtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xufTtcblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byB3b3JrIHdpdGggY29udHJvbGxlZCBjb21wb25lbnQsIHRoaXMgZnVuY3Rpb24gcHJvdmlkZSB5b3Ugd2l0aCBib3RoIGZvcm0gYW5kIGZpZWxkIGxldmVsIHN0YXRlLiBSZS1yZW5kZXIgaXMgaXNvbGF0ZWQgYXQgdGhlIGhvb2sgbGV2ZWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWNvbnRyb2xsZXIpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3VzZWNvbnRyb2xsZXItMG84cHgpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gdGhlIHBhdGggbmFtZSB0byB0aGUgZm9ybSBmaWVsZCB2YWx1ZSwgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHJldHVybnMgZmllbGQgcHJvcGVydGllcywgZmllbGQgYW5kIGZvcm0gc3RhdGUuIHtAbGluayBVc2VDb250cm9sbGVyUmV0dXJufVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIElucHV0KHByb3BzKSB7XG4gKiAgIGNvbnN0IHsgZmllbGQsIGZpZWxkU3RhdGUsIGZvcm1TdGF0ZSB9ID0gdXNlQ29udHJvbGxlcihwcm9wcyk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxpbnB1dCB7Li4uZmllbGR9IHBsYWNlaG9sZGVyPXtwcm9wcy5uYW1lfSAvPlxuICogICAgICAgPHA+e2ZpZWxkU3RhdGUuaXNUb3VjaGVkICYmIFwiVG91Y2hlZFwifTwvcD5cbiAqICAgICAgIDxwPntmb3JtU3RhdGUuaXNTdWJtaXR0ZWQgPyBcInN1Ym1pdHRlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXNlQ29udHJvbGxlcihwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgbmFtZSwgZGlzYWJsZWQsIGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIHNob3VsZFVucmVnaXN0ZXIgfSA9IHByb3BzO1xuICAgIGNvbnN0IGlzQXJyYXlGaWVsZCA9IGlzTmFtZUluRmllbGRBcnJheShjb250cm9sLl9uYW1lcy5hcnJheSwgbmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7XG4gICAgICAgIGNvbnRyb2wsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUsIGdldChjb250cm9sLl9kZWZhdWx0VmFsdWVzLCBuYW1lLCBwcm9wcy5kZWZhdWx0VmFsdWUpKSxcbiAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgZm9ybVN0YXRlID0gdXNlRm9ybVN0YXRlKHtcbiAgICAgICAgY29udHJvbCxcbiAgICAgICAgbmFtZSxcbiAgICB9KTtcbiAgICBjb25zdCBfcmVnaXN0ZXJQcm9wcyA9IFJlYWN0LnVzZVJlZihjb250cm9sLnJlZ2lzdGVyKG5hbWUsIHtcbiAgICAgICAgLi4ucHJvcHMucnVsZXMsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICAuLi4oaXNCb29sZWFuKHByb3BzLmRpc2FibGVkKSA/IHsgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkIH0gOiB7fSksXG4gICAgfSkpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQgPSBjb250cm9sLl9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgc2hvdWxkVW5yZWdpc3RlcjtcbiAgICAgICAgY29uc3QgdXBkYXRlTW91bnRlZCA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHVwZGF0ZU1vdW50ZWQobmFtZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChfc2hvdWxkVW5yZWdpc3RlckZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNsb25lT2JqZWN0KGdldChjb250cm9sLl9vcHRpb25zLmRlZmF1bHRWYWx1ZXMsIG5hbWUpKTtcbiAgICAgICAgICAgIHNldChjb250cm9sLl9kZWZhdWx0VmFsdWVzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoZ2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUpKSkge1xuICAgICAgICAgICAgICAgIHNldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIChpc0FycmF5RmllbGRcbiAgICAgICAgICAgICAgICA/IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQgJiYgIWNvbnRyb2wuX3N0YXRlLmFjdGlvblxuICAgICAgICAgICAgICAgIDogX3Nob3VsZFVucmVnaXN0ZXJGaWVsZClcbiAgICAgICAgICAgICAgICA/IGNvbnRyb2wudW5yZWdpc3RlcihuYW1lKVxuICAgICAgICAgICAgICAgIDogdXBkYXRlTW91bnRlZChuYW1lLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgfSwgW25hbWUsIGNvbnRyb2wsIGlzQXJyYXlGaWVsZCwgc2hvdWxkVW5yZWdpc3Rlcl0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKSkge1xuICAgICAgICAgICAgY29udHJvbC5fdXBkYXRlRGlzYWJsZWRGaWVsZCh7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgZmllbGRzOiBjb250cm9sLl9maWVsZHMsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSkuX2YudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtkaXNhYmxlZCwgbmFtZSwgY29udHJvbF0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAuLi4oaXNCb29sZWFuKGRpc2FibGVkKSB8fCBmb3JtU3RhdGUuZGlzYWJsZWRcbiAgICAgICAgICAgICAgICA/IHsgZGlzYWJsZWQ6IGZvcm1TdGF0ZS5kaXNhYmxlZCB8fCBkaXNhYmxlZCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICBvbkNoYW5nZTogUmVhY3QudXNlQ2FsbGJhY2soKGV2ZW50KSA9PiBfcmVnaXN0ZXJQcm9wcy5jdXJyZW50Lm9uQ2hhbmdlKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldEV2ZW50VmFsdWUoZXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRVZFTlRTLkNIQU5HRSxcbiAgICAgICAgICAgIH0pLCBbbmFtZV0pLFxuICAgICAgICAgICAgb25CbHVyOiBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBfcmVnaXN0ZXJQcm9wcy5jdXJyZW50Lm9uQmx1cih7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXQoY29udHJvbC5fZm9ybVZhbHVlcywgbmFtZSksXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiBFVkVOVFMuQkxVUixcbiAgICAgICAgICAgIH0pLCBbbmFtZSwgY29udHJvbF0pLFxuICAgICAgICAgICAgcmVmOiAoZWxtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiYgZWxtKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mLnJlZiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiAoKSA9PiBlbG0uZm9jdXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogKCkgPT4gZWxtLnNlbGVjdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHk6IChtZXNzYWdlKSA9PiBlbG0uc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRWYWxpZGl0eTogKCkgPT4gZWxtLnJlcG9ydFZhbGlkaXR5KCksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZm9ybVN0YXRlLFxuICAgICAgICBmaWVsZFN0YXRlOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSwge1xuICAgICAgICAgICAgaW52YWxpZDoge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0RpcnR5OiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgbmFtZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNUb3VjaGVkOiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBnZXQoZm9ybVN0YXRlLmVycm9ycywgbmFtZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICB9O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCBiYXNlZCBvbiBgdXNlQ29udHJvbGxlcmAgaG9vayB0byB3b3JrIHdpdGggY29udHJvbGxlZCBjb21wb25lbnQuXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWNvbnRyb2xsZXIvY29udHJvbGxlcikg4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvcmVhY3QtaG9vay1mb3JtLXY2LWNvbnRyb2xsZXItdHMtand5encpIOKAoiBbVmlkZW9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TjJVTmtfVUNWeUEpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gdGhlIHBhdGggbmFtZSB0byB0aGUgZm9ybSBmaWVsZCB2YWx1ZSwgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHJldHVybnMgcHJvdmlkZSBmaWVsZCBoYW5kbGVyIGZ1bmN0aW9ucywgZmllbGQgYW5kIGZvcm0gc3RhdGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08Rm9ybVZhbHVlcz4oe1xuICogICAgIGRlZmF1bHRWYWx1ZXM6IHtcbiAqICAgICAgIHRlc3Q6IFwiXCJcbiAqICAgICB9XG4gKiAgIH0pO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Zm9ybT5cbiAqICAgICAgIDxDb250cm9sbGVyXG4gKiAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICAgIG5hbWU9XCJ0ZXN0XCJcbiAqICAgICAgICAgcmVuZGVyPXsoeyBmaWVsZDogeyBvbkNoYW5nZSwgb25CbHVyLCB2YWx1ZSwgcmVmIH0sIGZvcm1TdGF0ZSwgZmllbGRTdGF0ZSB9KSA9PiAoXG4gKiAgICAgICAgICAgPD5cbiAqICAgICAgICAgICAgIDxpbnB1dFxuICogICAgICAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9IC8vIHNlbmQgdmFsdWUgdG8gaG9vayBmb3JtXG4gKiAgICAgICAgICAgICAgIG9uQmx1cj17b25CbHVyfSAvLyBub3RpZnkgd2hlbiBpbnB1dCBpcyB0b3VjaGVkXG4gKiAgICAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX0gLy8gcmV0dXJuIHVwZGF0ZWQgdmFsdWVcbiAqICAgICAgICAgICAgICAgcmVmPXtyZWZ9IC8vIHNldCByZWYgZm9yIGZvY3VzIG1hbmFnZW1lbnRcbiAqICAgICAgICAgICAgIC8+XG4gKiAgICAgICAgICAgICA8cD57Zm9ybVN0YXRlLmlzU3VibWl0dGVkID8gXCJzdWJtaXR0ZWRcIiA6IFwiXCJ9PC9wPlxuICogICAgICAgICAgICAgPHA+e2ZpZWxkU3RhdGUuaXNUb3VjaGVkID8gXCJ0b3VjaGVkXCIgOiBcIlwifTwvcD5cbiAqICAgICAgICAgICA8Lz5cbiAqICAgICAgICAgKX1cbiAqICAgICAgIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmNvbnN0IENvbnRyb2xsZXIgPSAocHJvcHMpID0+IHByb3BzLnJlbmRlcih1c2VDb250cm9sbGVyKHByb3BzKSk7XG5cbmNvbnN0IFBPU1RfUkVRVUVTVCA9ICdwb3N0Jztcbi8qKlxuICogRm9ybSBjb21wb25lbnQgdG8gbWFuYWdlIHN1Ym1pc3Npb24uXG4gKlxuICogQHBhcmFtIHByb3BzIC0gdG8gc2V0dXAgc3VibWlzc2lvbiBkZXRhaWwuIHtAbGluayBGb3JtUHJvcHN9XG4gKlxuICogQHJldHVybnMgZm9ybSBjb21wb25lbnQgb3IgaGVhZGxlc3MgcmVuZGVyIHByb3AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wsIGZvcm1TdGF0ZTogeyBlcnJvcnMgfSB9ID0gdXNlRm9ybSgpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Rm9ybSBhY3Rpb249XCIvYXBpXCIgY29udHJvbD17Y29udHJvbH0+XG4gKiAgICAgICA8aW5wdXQgey4uLnJlZ2lzdGVyKFwibmFtZVwiKX0gLz5cbiAqICAgICAgIDxwPntlcnJvcnM/LnJvb3Q/LnNlcnZlciAmJiAnU2VydmVyIGVycm9yJ308L3A+XG4gKiAgICAgICA8YnV0dG9uPlN1Ym1pdDwvYnV0dG9uPlxuICogICAgIDwvRm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBGb3JtKHByb3BzKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm1Db250ZXh0KCk7XG4gICAgY29uc3QgW21vdW50ZWQsIHNldE1vdW50ZWRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgb25TdWJtaXQsIGNoaWxkcmVuLCBhY3Rpb24sIG1ldGhvZCA9IFBPU1RfUkVRVUVTVCwgaGVhZGVycywgZW5jVHlwZSwgb25FcnJvciwgcmVuZGVyLCBvblN1Y2Nlc3MsIHZhbGlkYXRlU3RhdHVzLCAuLi5yZXN0IH0gPSBwcm9wcztcbiAgICBjb25zdCBzdWJtaXQgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIGxldCB0eXBlID0gJyc7XG4gICAgICAgIGF3YWl0IGNvbnRyb2wuaGFuZGxlU3VibWl0KGFzeW5jIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgbGV0IGZvcm1EYXRhSnNvbiA9ICcnO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YUpzb24gPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkgeyB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29udHJvbC5fbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgZ2V0KGRhdGEsIG5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvblN1Ym1pdCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uU3VibWl0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhSnNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRTdHJpbmdpZnlTdWJtaXNzaW9uRGF0YSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgJiYgaGVhZGVyc1snQ29udGVudC1UeXBlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNUeXBlLFxuICAgICAgICAgICAgICAgICAgICBdLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAmJiB2YWx1ZS5pbmNsdWRlcygnanNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhY3Rpb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihlbmNUeXBlID8geyAnQ29udGVudC1UeXBlJzogZW5jVHlwZSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHNob3VsZFN0cmluZ2lmeVN1Ym1pc3Npb25EYXRhID8gZm9ybURhdGFKc29uIDogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZVN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIXZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPj0gMzAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvciAmJiBvbkVycm9yKHsgcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RyaW5nKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MgJiYgb25TdWNjZXNzKHsgcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvciAmJiBvbkVycm9yKHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KShldmVudCk7XG4gICAgICAgIGlmIChoYXNFcnJvciAmJiBwcm9wcy5jb250cm9sKSB7XG4gICAgICAgICAgICBwcm9wcy5jb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm9wcy5jb250cm9sLnNldEVycm9yKCdyb290LnNlcnZlcicsIHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHNldE1vdW50ZWQodHJ1ZSk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiByZW5kZXIgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgcmVuZGVyKHtcbiAgICAgICAgc3VibWl0LFxuICAgIH0pKSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImZvcm1cIiwgeyBub1ZhbGlkYXRlOiBtb3VudGVkLCBhY3Rpb246IGFjdGlvbiwgbWV0aG9kOiBtZXRob2QsIGVuY1R5cGU6IGVuY1R5cGUsIG9uU3VibWl0OiBzdWJtaXQsIC4uLnJlc3QgfSwgY2hpbGRyZW4pKTtcbn1cblxudmFyIGFwcGVuZEVycm9ycyA9IChuYW1lLCB2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEsIGVycm9ycywgdHlwZSwgbWVzc2FnZSkgPT4gdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhXG4gICAgPyB7XG4gICAgICAgIC4uLmVycm9yc1tuYW1lXSxcbiAgICAgICAgdHlwZXM6IHtcbiAgICAgICAgICAgIC4uLihlcnJvcnNbbmFtZV0gJiYgZXJyb3JzW25hbWVdLnR5cGVzID8gZXJyb3JzW25hbWVdLnR5cGVzIDoge30pLFxuICAgICAgICAgICAgW3R5cGVdOiBtZXNzYWdlIHx8IHRydWUsXG4gICAgICAgIH0sXG4gICAgfVxuICAgIDoge307XG5cbnZhciBnZW5lcmF0ZUlkID0gKCkgPT4ge1xuICAgIGNvbnN0IGQgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZS5ub3coKSA6IHBlcmZvcm1hbmNlLm5vdygpICogMTAwMDtcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNiArIGQpICUgMTYgfCAwO1xuICAgICAgICByZXR1cm4gKGMgPT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OCkudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufTtcblxudmFyIGdldEZvY3VzRmllbGROYW1lID0gKG5hbWUsIGluZGV4LCBvcHRpb25zID0ge30pID0+IG9wdGlvbnMuc2hvdWxkRm9jdXMgfHwgaXNVbmRlZmluZWQob3B0aW9ucy5zaG91bGRGb2N1cylcbiAgICA/IG9wdGlvbnMuZm9jdXNOYW1lIHx8XG4gICAgICAgIGAke25hbWV9LiR7aXNVbmRlZmluZWQob3B0aW9ucy5mb2N1c0luZGV4KSA/IGluZGV4IDogb3B0aW9ucy5mb2N1c0luZGV4fS5gXG4gICAgOiAnJztcblxudmFyIGdldFZhbGlkYXRpb25Nb2RlcyA9IChtb2RlKSA9PiAoe1xuICAgIGlzT25TdWJtaXQ6ICFtb2RlIHx8IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblN1Ym1pdCxcbiAgICBpc09uQmx1cjogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLm9uQmx1cixcbiAgICBpc09uQ2hhbmdlOiBtb2RlID09PSBWQUxJREFUSU9OX01PREUub25DaGFuZ2UsXG4gICAgaXNPbkFsbDogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLmFsbCxcbiAgICBpc09uVG91Y2g6IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblRvdWNoZWQsXG59KTtcblxudmFyIGlzV2F0Y2hlZCA9IChuYW1lLCBfbmFtZXMsIGlzQmx1ckV2ZW50KSA9PiAhaXNCbHVyRXZlbnQgJiZcbiAgICAoX25hbWVzLndhdGNoQWxsIHx8XG4gICAgICAgIF9uYW1lcy53YXRjaC5oYXMobmFtZSkgfHxcbiAgICAgICAgWy4uLl9uYW1lcy53YXRjaF0uc29tZSgod2F0Y2hOYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgod2F0Y2hOYW1lKSAmJlxuICAgICAgICAgICAgL15cXC5cXHcrLy50ZXN0KG5hbWUuc2xpY2Uod2F0Y2hOYW1lLmxlbmd0aCkpKSk7XG5cbmNvbnN0IGl0ZXJhdGVGaWVsZHNCeUFjdGlvbiA9IChmaWVsZHMsIGFjdGlvbiwgZmllbGRzTmFtZXMsIGFib3J0RWFybHkpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZHNOYW1lcyB8fCBPYmplY3Qua2V5cyhmaWVsZHMpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KGZpZWxkcywga2V5KTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCB7IF9mLCAuLi5jdXJyZW50RmllbGQgfSA9IGZpZWxkO1xuICAgICAgICAgICAgaWYgKF9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9mLnJlZnMgJiYgX2YucmVmc1swXSAmJiBhY3Rpb24oX2YucmVmc1swXSwga2V5KSAmJiAhYWJvcnRFYXJseSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoX2YucmVmICYmIGFjdGlvbihfZi5yZWYsIF9mLm5hbWUpICYmICFhYm9ydEVhcmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGN1cnJlbnRGaWVsZCwgYWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChjdXJyZW50RmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGN1cnJlbnRGaWVsZCwgYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciB1cGRhdGVGaWVsZEFycmF5Um9vdEVycm9yID0gKGVycm9ycywgZXJyb3IsIG5hbWUpID0+IHtcbiAgICBjb25zdCBmaWVsZEFycmF5RXJyb3JzID0gY29tcGFjdChnZXQoZXJyb3JzLCBuYW1lKSk7XG4gICAgc2V0KGZpZWxkQXJyYXlFcnJvcnMsICdyb290JywgZXJyb3JbbmFtZV0pO1xuICAgIHNldChlcnJvcnMsIG5hbWUsIGZpZWxkQXJyYXlFcnJvcnMpO1xuICAgIHJldHVybiBlcnJvcnM7XG59O1xuXG52YXIgaXNGaWxlSW5wdXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSAnZmlsZSc7XG5cbnZhciBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG5cbnZhciBpc0hUTUxFbGVtZW50ID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKCFpc1dlYikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG93bmVyID0gdmFsdWUgPyB2YWx1ZS5vd25lckRvY3VtZW50IDogMDtcbiAgICByZXR1cm4gKHZhbHVlIGluc3RhbmNlb2ZcbiAgICAgICAgKG93bmVyICYmIG93bmVyLmRlZmF1bHRWaWV3ID8gb3duZXIuZGVmYXVsdFZpZXcuSFRNTEVsZW1lbnQgOiBIVE1MRWxlbWVudCkpO1xufTtcblxudmFyIGlzTWVzc2FnZSA9ICh2YWx1ZSkgPT4gaXNTdHJpbmcodmFsdWUpO1xuXG52YXIgaXNSYWRpb0lucHV0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJztcblxudmFyIGlzUmVnZXggPSAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwO1xuXG5jb25zdCBkZWZhdWx0UmVzdWx0ID0ge1xuICAgIHZhbHVlOiBmYWxzZSxcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbn07XG5jb25zdCB2YWxpZFJlc3VsdCA9IHsgdmFsdWU6IHRydWUsIGlzVmFsaWQ6IHRydWUgfTtcbnZhciBnZXRDaGVja2JveFZhbHVlID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24gJiYgb3B0aW9uLmNoZWNrZWQgJiYgIW9wdGlvbi5kaXNhYmxlZClcbiAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWVzLCBpc1ZhbGlkOiAhIXZhbHVlcy5sZW5ndGggfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9uc1swXS5jaGVja2VkICYmICFvcHRpb25zWzBdLmRpc2FibGVkXG4gICAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgZXhwZWN0ZWQgdG8gd29yayBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgIG9wdGlvbnNbMF0uYXR0cmlidXRlcyAmJiAhaXNVbmRlZmluZWQob3B0aW9uc1swXS5hdHRyaWJ1dGVzLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGlzVW5kZWZpbmVkKG9wdGlvbnNbMF0udmFsdWUpIHx8IG9wdGlvbnNbMF0udmFsdWUgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6IG9wdGlvbnNbMF0udmFsdWUsIGlzVmFsaWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICA6IGRlZmF1bHRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0UmVzdWx0O1xufTtcblxuY29uc3QgZGVmYXVsdFJldHVybiA9IHtcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICB2YWx1ZTogbnVsbCxcbn07XG52YXIgZ2V0UmFkaW9WYWx1ZSA9IChvcHRpb25zKSA9PiBBcnJheS5pc0FycmF5KG9wdGlvbnMpXG4gICAgPyBvcHRpb25zLnJlZHVjZSgocHJldmlvdXMsIG9wdGlvbikgPT4gb3B0aW9uICYmIG9wdGlvbi5jaGVja2VkICYmICFvcHRpb24uZGlzYWJsZWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IHByZXZpb3VzLCBkZWZhdWx0UmV0dXJuKVxuICAgIDogZGVmYXVsdFJldHVybjtcblxuZnVuY3Rpb24gZ2V0VmFsaWRhdGVFcnJvcihyZXN1bHQsIHJlZiwgdHlwZSA9ICd2YWxpZGF0ZScpIHtcbiAgICBpZiAoaXNNZXNzYWdlKHJlc3VsdCkgfHxcbiAgICAgICAgKEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQuZXZlcnkoaXNNZXNzYWdlKSkgfHxcbiAgICAgICAgKGlzQm9vbGVhbihyZXN1bHQpICYmICFyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogaXNNZXNzYWdlKHJlc3VsdCkgPyByZXN1bHQgOiAnJyxcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbnZhciBnZXRWYWx1ZUFuZE1lc3NhZ2UgPSAodmFsaWRhdGlvbkRhdGEpID0+IGlzT2JqZWN0KHZhbGlkYXRpb25EYXRhKSAmJiAhaXNSZWdleCh2YWxpZGF0aW9uRGF0YSlcbiAgICA/IHZhbGlkYXRpb25EYXRhXG4gICAgOiB7XG4gICAgICAgIHZhbHVlOiB2YWxpZGF0aW9uRGF0YSxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgfTtcblxudmFyIHZhbGlkYXRlRmllbGQgPSBhc3luYyAoZmllbGQsIGZvcm1WYWx1ZXMsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiwgaXNGaWVsZEFycmF5KSA9PiB7XG4gICAgY29uc3QgeyByZWYsIHJlZnMsIHJlcXVpcmVkLCBtYXhMZW5ndGgsIG1pbkxlbmd0aCwgbWluLCBtYXgsIHBhdHRlcm4sIHZhbGlkYXRlLCBuYW1lLCB2YWx1ZUFzTnVtYmVyLCBtb3VudCwgZGlzYWJsZWQsIH0gPSBmaWVsZC5fZjtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gZ2V0KGZvcm1WYWx1ZXMsIG5hbWUpO1xuICAgIGlmICghbW91bnQgfHwgZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJlZiA9IHJlZnMgPyByZWZzWzBdIDogcmVmO1xuICAgIGNvbnN0IHNldEN1c3RvbVZhbGlkaXR5ID0gKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKHNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24gJiYgaW5wdXRSZWYucmVwb3J0VmFsaWRpdHkpIHtcbiAgICAgICAgICAgIGlucHV0UmVmLnNldEN1c3RvbVZhbGlkaXR5KGlzQm9vbGVhbihtZXNzYWdlKSA/ICcnIDogbWVzc2FnZSB8fCAnJyk7XG4gICAgICAgICAgICBpbnB1dFJlZi5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBlcnJvciA9IHt9O1xuICAgIGNvbnN0IGlzUmFkaW8gPSBpc1JhZGlvSW5wdXQocmVmKTtcbiAgICBjb25zdCBpc0NoZWNrQm94ID0gaXNDaGVja0JveElucHV0KHJlZik7XG4gICAgY29uc3QgaXNSYWRpb09yQ2hlY2tib3ggPSBpc1JhZGlvIHx8IGlzQ2hlY2tCb3g7XG4gICAgY29uc3QgaXNFbXB0eSA9ICgodmFsdWVBc051bWJlciB8fCBpc0ZpbGVJbnB1dChyZWYpKSAmJlxuICAgICAgICBpc1VuZGVmaW5lZChyZWYudmFsdWUpICYmXG4gICAgICAgIGlzVW5kZWZpbmVkKGlucHV0VmFsdWUpKSB8fFxuICAgICAgICAoaXNIVE1MRWxlbWVudChyZWYpICYmIHJlZi52YWx1ZSA9PT0gJycpIHx8XG4gICAgICAgIGlucHV0VmFsdWUgPT09ICcnIHx8XG4gICAgICAgIChBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpICYmICFpbnB1dFZhbHVlLmxlbmd0aCk7XG4gICAgY29uc3QgYXBwZW5kRXJyb3JzQ3VycnkgPSBhcHBlbmRFcnJvcnMuYmluZChudWxsLCBuYW1lLCB2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEsIGVycm9yKTtcbiAgICBjb25zdCBnZXRNaW5NYXhNZXNzYWdlID0gKGV4Y2VlZE1heCwgbWF4TGVuZ3RoTWVzc2FnZSwgbWluTGVuZ3RoTWVzc2FnZSwgbWF4VHlwZSA9IElOUFVUX1ZBTElEQVRJT05fUlVMRVMubWF4TGVuZ3RoLCBtaW5UeXBlID0gSU5QVVRfVkFMSURBVElPTl9SVUxFUy5taW5MZW5ndGgpID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV4Y2VlZE1heCA/IG1heExlbmd0aE1lc3NhZ2UgOiBtaW5MZW5ndGhNZXNzYWdlO1xuICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgIHR5cGU6IGV4Y2VlZE1heCA/IG1heFR5cGUgOiBtaW5UeXBlLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgIC4uLmFwcGVuZEVycm9yc0N1cnJ5KGV4Y2VlZE1heCA/IG1heFR5cGUgOiBtaW5UeXBlLCBtZXNzYWdlKSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGlmIChpc0ZpZWxkQXJyYXlcbiAgICAgICAgPyAhQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSB8fCAhaW5wdXRWYWx1ZS5sZW5ndGhcbiAgICAgICAgOiByZXF1aXJlZCAmJlxuICAgICAgICAgICAgKCghaXNSYWRpb09yQ2hlY2tib3ggJiYgKGlzRW1wdHkgfHwgaXNOdWxsT3JVbmRlZmluZWQoaW5wdXRWYWx1ZSkpKSB8fFxuICAgICAgICAgICAgICAgIChpc0Jvb2xlYW4oaW5wdXRWYWx1ZSkgJiYgIWlucHV0VmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgKGlzQ2hlY2tCb3ggJiYgIWdldENoZWNrYm94VmFsdWUocmVmcykuaXNWYWxpZCkgfHxcbiAgICAgICAgICAgICAgICAoaXNSYWRpbyAmJiAhZ2V0UmFkaW9WYWx1ZShyZWZzKS5pc1ZhbGlkKSkpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgbWVzc2FnZSB9ID0gaXNNZXNzYWdlKHJlcXVpcmVkKVxuICAgICAgICAgICAgPyB7IHZhbHVlOiAhIXJlcXVpcmVkLCBtZXNzYWdlOiByZXF1aXJlZCB9XG4gICAgICAgICAgICA6IGdldFZhbHVlQW5kTWVzc2FnZShyZXF1aXJlZCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgZXJyb3JbbmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogSU5QVVRfVkFMSURBVElPTl9SVUxFUy5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoSU5QVVRfVkFMSURBVElPTl9SVUxFUy5yZXF1aXJlZCwgbWVzc2FnZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc0VtcHR5ICYmICghaXNOdWxsT3JVbmRlZmluZWQobWluKSB8fCAhaXNOdWxsT3JVbmRlZmluZWQobWF4KSkpIHtcbiAgICAgICAgbGV0IGV4Y2VlZE1heDtcbiAgICAgICAgbGV0IGV4Y2VlZE1pbjtcbiAgICAgICAgY29uc3QgbWF4T3V0cHV0ID0gZ2V0VmFsdWVBbmRNZXNzYWdlKG1heCk7XG4gICAgICAgIGNvbnN0IG1pbk91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtaW4pO1xuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGlucHV0VmFsdWUpICYmICFpc05hTihpbnB1dFZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVOdW1iZXIgPSByZWYudmFsdWVBc051bWJlciB8fFxuICAgICAgICAgICAgICAgIChpbnB1dFZhbHVlID8gK2lucHV0VmFsdWUgOiBpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQobWF4T3V0cHV0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1heCA9IHZhbHVlTnVtYmVyID4gbWF4T3V0cHV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChtaW5PdXRwdXQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZXhjZWVkTWluID0gdmFsdWVOdW1iZXIgPCBtaW5PdXRwdXQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZURhdGUgPSByZWYudmFsdWVBc0RhdGUgfHwgbmV3IERhdGUoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0VGltZVRvRGF0ZSA9ICh0aW1lKSA9PiBuZXcgRGF0ZShuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpICsgJyAnICsgdGltZSk7XG4gICAgICAgICAgICBjb25zdCBpc1RpbWUgPSByZWYudHlwZSA9PSAndGltZSc7XG4gICAgICAgICAgICBjb25zdCBpc1dlZWsgPSByZWYudHlwZSA9PSAnd2Vlayc7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcobWF4T3V0cHV0LnZhbHVlKSAmJiBpbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZXhjZWVkTWF4ID0gaXNUaW1lXG4gICAgICAgICAgICAgICAgICAgID8gY29udmVydFRpbWVUb0RhdGUoaW5wdXRWYWx1ZSkgPiBjb252ZXJ0VGltZVRvRGF0ZShtYXhPdXRwdXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogaXNXZWVrXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0VmFsdWUgPiBtYXhPdXRwdXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWVEYXRlID4gbmV3IERhdGUobWF4T3V0cHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhtaW5PdXRwdXQudmFsdWUpICYmIGlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBleGNlZWRNaW4gPSBpc1RpbWVcbiAgICAgICAgICAgICAgICAgICAgPyBjb252ZXJ0VGltZVRvRGF0ZShpbnB1dFZhbHVlKSA8IGNvbnZlcnRUaW1lVG9EYXRlKG1pbk91dHB1dC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBpc1dlZWtcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaW5wdXRWYWx1ZSA8IG1pbk91dHB1dC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZURhdGUgPCBuZXcgRGF0ZShtaW5PdXRwdXQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleGNlZWRNYXggfHwgZXhjZWVkTWluKSB7XG4gICAgICAgICAgICBnZXRNaW5NYXhNZXNzYWdlKCEhZXhjZWVkTWF4LCBtYXhPdXRwdXQubWVzc2FnZSwgbWluT3V0cHV0Lm1lc3NhZ2UsIElOUFVUX1ZBTElEQVRJT05fUlVMRVMubWF4LCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1pbik7XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KGVycm9yW25hbWVdLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoKG1heExlbmd0aCB8fCBtaW5MZW5ndGgpICYmXG4gICAgICAgICFpc0VtcHR5ICYmXG4gICAgICAgIChpc1N0cmluZyhpbnB1dFZhbHVlKSB8fCAoaXNGaWVsZEFycmF5ICYmIEFycmF5LmlzQXJyYXkoaW5wdXRWYWx1ZSkpKSkge1xuICAgICAgICBjb25zdCBtYXhMZW5ndGhPdXRwdXQgPSBnZXRWYWx1ZUFuZE1lc3NhZ2UobWF4TGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbWluTGVuZ3RoT3V0cHV0ID0gZ2V0VmFsdWVBbmRNZXNzYWdlKG1pbkxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGV4Y2VlZE1heCA9ICFpc051bGxPclVuZGVmaW5lZChtYXhMZW5ndGhPdXRwdXQudmFsdWUpICYmXG4gICAgICAgICAgICBpbnB1dFZhbHVlLmxlbmd0aCA+ICttYXhMZW5ndGhPdXRwdXQudmFsdWU7XG4gICAgICAgIGNvbnN0IGV4Y2VlZE1pbiA9ICFpc051bGxPclVuZGVmaW5lZChtaW5MZW5ndGhPdXRwdXQudmFsdWUpICYmXG4gICAgICAgICAgICBpbnB1dFZhbHVlLmxlbmd0aCA8ICttaW5MZW5ndGhPdXRwdXQudmFsdWU7XG4gICAgICAgIGlmIChleGNlZWRNYXggfHwgZXhjZWVkTWluKSB7XG4gICAgICAgICAgICBnZXRNaW5NYXhNZXNzYWdlKGV4Y2VlZE1heCwgbWF4TGVuZ3RoT3V0cHV0Lm1lc3NhZ2UsIG1pbkxlbmd0aE91dHB1dC5tZXNzYWdlKTtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3JbbmFtZV0ubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuICYmICFpc0VtcHR5ICYmIGlzU3RyaW5nKGlucHV0VmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IHBhdHRlcm5WYWx1ZSwgbWVzc2FnZSB9ID0gZ2V0VmFsdWVBbmRNZXNzYWdlKHBhdHRlcm4pO1xuICAgICAgICBpZiAoaXNSZWdleChwYXR0ZXJuVmFsdWUpICYmICFpbnB1dFZhbHVlLm1hdGNoKHBhdHRlcm5WYWx1ZSkpIHtcbiAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IElOUFVUX1ZBTElEQVRJT05fUlVMRVMucGF0dGVybixcbiAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShJTlBVVF9WQUxJREFUSU9OX1JVTEVTLnBhdHRlcm4sIG1lc3NhZ2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWxpZGF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZhbGlkYXRlKGlucHV0VmFsdWUsIGZvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IGdldFZhbGlkYXRlRXJyb3IocmVzdWx0LCBpbnB1dFJlZik7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVFcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi52YWxpZGF0ZUVycm9yLFxuICAgICAgICAgICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShJTlBVVF9WQUxJREFUSU9OX1JVTEVTLnZhbGlkYXRlLCB2YWxpZGF0ZUVycm9yLm1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkodmFsaWRhdGVFcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdCh2YWxpZGF0ZSkpIHtcbiAgICAgICAgICAgIGxldCB2YWxpZGF0aW9uUmVzdWx0ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWxpZGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eU9iamVjdCh2YWxpZGF0aW9uUmVzdWx0KSAmJiAhdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0ZUVycm9yID0gZ2V0VmFsaWRhdGVFcnJvcihhd2FpdCB2YWxpZGF0ZVtrZXldKGlucHV0VmFsdWUsIGZvcm1WYWx1ZXMpLCBpbnB1dFJlZiwga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udmFsaWRhdGVFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFwcGVuZEVycm9yc0N1cnJ5KGtleSwgdmFsaWRhdGVFcnJvci5tZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkodmFsaWRhdGVFcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JbbmFtZV0gPSB2YWxpZGF0aW9uUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0VtcHR5T2JqZWN0KHZhbGlkYXRpb25SZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JbbmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbGlkYXRpb25SZXN1bHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldEN1c3RvbVZhbGlkaXR5KHRydWUpO1xuICAgIHJldHVybiBlcnJvcjtcbn07XG5cbnZhciBhcHBlbmRBdCA9IChkYXRhLCB2YWx1ZSkgPT4gW1xuICAgIC4uLmRhdGEsXG4gICAgLi4uY29udmVydFRvQXJyYXlQYXlsb2FkKHZhbHVlKSxcbl07XG5cbnZhciBmaWxsRW1wdHlBcnJheSA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKCkgPT4gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaW5zZXJ0KGRhdGEsIGluZGV4LCB2YWx1ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIC4uLmRhdGEuc2xpY2UoMCwgaW5kZXgpLFxuICAgICAgICAuLi5jb252ZXJ0VG9BcnJheVBheWxvYWQodmFsdWUpLFxuICAgICAgICAuLi5kYXRhLnNsaWNlKGluZGV4KSxcbiAgICBdO1xufVxuXG52YXIgbW92ZUFycmF5QXQgPSAoZGF0YSwgZnJvbSwgdG8pID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoaXNVbmRlZmluZWQoZGF0YVt0b10pKSB7XG4gICAgICAgIGRhdGFbdG9dID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBkYXRhLnNwbGljZSh0bywgMCwgZGF0YS5zcGxpY2UoZnJvbSwgMSlbMF0pO1xuICAgIHJldHVybiBkYXRhO1xufTtcblxudmFyIHByZXBlbmRBdCA9IChkYXRhLCB2YWx1ZSkgPT4gW1xuICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZCh2YWx1ZSksXG4gICAgLi4uY29udmVydFRvQXJyYXlQYXlsb2FkKGRhdGEpLFxuXTtcblxuZnVuY3Rpb24gcmVtb3ZlQXRJbmRleGVzKGRhdGEsIGluZGV4ZXMpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3QgdGVtcCA9IFsuLi5kYXRhXTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgdGVtcC5zcGxpY2UoaW5kZXggLSBpLCAxKTtcbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGFjdCh0ZW1wKS5sZW5ndGggPyB0ZW1wIDogW107XG59XG52YXIgcmVtb3ZlQXJyYXlBdCA9IChkYXRhLCBpbmRleCkgPT4gaXNVbmRlZmluZWQoaW5kZXgpXG4gICAgPyBbXVxuICAgIDogcmVtb3ZlQXRJbmRleGVzKGRhdGEsIGNvbnZlcnRUb0FycmF5UGF5bG9hZChpbmRleCkuc29ydCgoYSwgYikgPT4gYSAtIGIpKTtcblxudmFyIHN3YXBBcnJheUF0ID0gKGRhdGEsIGluZGV4QSwgaW5kZXhCKSA9PiB7XG4gICAgW2RhdGFbaW5kZXhBXSwgZGF0YVtpbmRleEJdXSA9IFtkYXRhW2luZGV4Ql0sIGRhdGFbaW5kZXhBXV07XG59O1xuXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgdXBkYXRlUGF0aCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHVwZGF0ZVBhdGguc2xpY2UoMCwgLTEpLmxlbmd0aDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBpc1VuZGVmaW5lZChvYmplY3QpID8gaW5kZXgrKyA6IG9iamVjdFt1cGRhdGVQYXRoW2luZGV4KytdXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbn1cbmZ1bmN0aW9uIGlzRW1wdHlBcnJheShvYmopIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFpc1VuZGVmaW5lZChvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgICA/IHBhdGhcbiAgICAgICAgOiBpc0tleShwYXRoKVxuICAgICAgICAgICAgPyBbcGF0aF1cbiAgICAgICAgICAgIDogc3RyaW5nVG9QYXRoKHBhdGgpO1xuICAgIGNvbnN0IGNoaWxkT2JqZWN0ID0gcGF0aHMubGVuZ3RoID09PSAxID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIHBhdGhzKTtcbiAgICBjb25zdCBpbmRleCA9IHBhdGhzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qga2V5ID0gcGF0aHNbaW5kZXhdO1xuICAgIGlmIChjaGlsZE9iamVjdCkge1xuICAgICAgICBkZWxldGUgY2hpbGRPYmplY3Rba2V5XTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSAwICYmXG4gICAgICAgICgoaXNPYmplY3QoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlPYmplY3QoY2hpbGRPYmplY3QpKSB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlBcnJheShjaGlsZE9iamVjdCkpKSkge1xuICAgICAgICB1bnNldChvYmplY3QsIHBhdGhzLnNsaWNlKDAsIC0xKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG59XG5cbnZhciB1cGRhdGVBdCA9IChmaWVsZFZhbHVlcywgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgZmllbGRWYWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWVzO1xufTtcblxuLyoqXG4gKiBBIGN1c3RvbSBob29rIHRoYXQgZXhwb3NlcyBjb252ZW5pZW50IG1ldGhvZHMgdG8gcGVyZm9ybSBvcGVyYXRpb25zIHdpdGggYSBsaXN0IG9mIGR5bmFtaWMgaW5wdXRzIHRoYXQgbmVlZCB0byBiZSBhcHBlbmRlZCwgdXBkYXRlZCwgcmVtb3ZlZCBldGMuIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS11c2VmaWVsZGFycmF5LXNzdWduKSDigKIgW1ZpZGVvXShodHRwczovL3lvdXR1LmJlLzRNcmJmR1NGWTJBKVxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2VmaWVsZGFycmF5KSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdXNlZmllbGRhcnJheS1zc3VnbilcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSB1c2VGaWVsZEFycmF5IHByb3BzXG4gKlxuICogQHJldHVybnMgbWV0aG9kcyAtIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHdpdGggdGhlIEZpZWxkIEFycmF5cyAoZHluYW1pYyBpbnB1dHMpIHtAbGluayBVc2VGaWVsZEFycmF5UmV0dXJufVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyByZWdpc3RlciwgY29udHJvbCwgaGFuZGxlU3VibWl0LCByZXNldCwgdHJpZ2dlciwgc2V0RXJyb3IgfSA9IHVzZUZvcm0oe1xuICogICAgIGRlZmF1bHRWYWx1ZXM6IHtcbiAqICAgICAgIHRlc3Q6IFtdXG4gKiAgICAgfVxuICogICB9KTtcbiAqICAgY29uc3QgeyBmaWVsZHMsIGFwcGVuZCB9ID0gdXNlRmllbGRBcnJheSh7XG4gKiAgICAgY29udHJvbCxcbiAqICAgICBuYW1lOiBcInRlc3RcIlxuICogICB9KTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdChkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpKX0+XG4gKiAgICAgICB7ZmllbGRzLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAqICAgICAgICAgIDxpbnB1dCBrZXk9e2l0ZW0uaWR9IHsuLi5yZWdpc3RlcihgdGVzdC4ke2luZGV4fS5maXJzdE5hbWVgKX0gIC8+XG4gKiAgICAgICApKX1cbiAqICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9eygpID0+IGFwcGVuZCh7IGZpcnN0TmFtZTogXCJiaWxsXCIgfSl9PlxuICogICAgICAgICBhcHBlbmRcbiAqICAgICAgIDwvYnV0dG9uPlxuICogICAgICAgPGlucHV0IHR5cGU9XCJzdWJtaXRcIiAvPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VGaWVsZEFycmF5KHByb3BzKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm1Db250ZXh0KCk7XG4gICAgY29uc3QgeyBjb250cm9sID0gbWV0aG9kcy5jb250cm9sLCBuYW1lLCBrZXlOYW1lID0gJ2lkJywgc2hvdWxkVW5yZWdpc3RlciwgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtmaWVsZHMsIHNldEZpZWxkc10gPSBSZWFjdC51c2VTdGF0ZShjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpKTtcbiAgICBjb25zdCBpZHMgPSBSZWFjdC51c2VSZWYoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKS5tYXAoZ2VuZXJhdGVJZCkpO1xuICAgIGNvbnN0IF9maWVsZElkcyA9IFJlYWN0LnVzZVJlZihmaWVsZHMpO1xuICAgIGNvbnN0IF9uYW1lID0gUmVhY3QudXNlUmVmKG5hbWUpO1xuICAgIGNvbnN0IF9hY3Rpb25lZCA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgX25hbWUuY3VycmVudCA9IG5hbWU7XG4gICAgX2ZpZWxkSWRzLmN1cnJlbnQgPSBmaWVsZHM7XG4gICAgY29udHJvbC5fbmFtZXMuYXJyYXkuYWRkKG5hbWUpO1xuICAgIHByb3BzLnJ1bGVzICYmXG4gICAgICAgIGNvbnRyb2wucmVnaXN0ZXIobmFtZSwgcHJvcHMucnVsZXMpO1xuICAgIHVzZVN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICh7IHZhbHVlcywgbmFtZTogZmllbGRBcnJheU5hbWUsIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5TmFtZSA9PT0gX25hbWUuY3VycmVudCB8fCAhZmllbGRBcnJheU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldCh2YWx1ZXMsIF9uYW1lLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRGaWVsZHMoZmllbGRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZHMuY3VycmVudCA9IGZpZWxkVmFsdWVzLm1hcChnZW5lcmF0ZUlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN1YmplY3Q6IGNvbnRyb2wuX3N1YmplY3RzLmFycmF5LFxuICAgIH0pO1xuICAgIGNvbnN0IHVwZGF0ZVZhbHVlcyA9IFJlYWN0LnVzZUNhbGxiYWNrKCh1cGRhdGVkRmllbGRBcnJheVZhbHVlcykgPT4ge1xuICAgICAgICBfYWN0aW9uZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIGNvbnRyb2wuX3VwZGF0ZUZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgIH0sIFtjb250cm9sLCBuYW1lXSk7XG4gICAgY29uc3QgYXBwZW5kID0gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcGVuZFZhbHVlID0gY29udmVydFRvQXJyYXlQYXlsb2FkKGNsb25lT2JqZWN0KHZhbHVlKSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gYXBwZW5kQXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgYXBwZW5kVmFsdWUpO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyA9IGdldEZvY3VzRmllbGROYW1lKG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLmxlbmd0aCAtIDEsIG9wdGlvbnMpO1xuICAgICAgICBpZHMuY3VycmVudCA9IGFwcGVuZEF0KGlkcy5jdXJyZW50LCBhcHBlbmRWYWx1ZS5tYXAoZ2VuZXJhdGVJZCkpO1xuICAgICAgICB1cGRhdGVWYWx1ZXModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBzZXRGaWVsZHModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBjb250cm9sLl91cGRhdGVGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBhcHBlbmRBdCwge1xuICAgICAgICAgICAgYXJnQTogZmlsbEVtcHR5QXJyYXkodmFsdWUpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHByZXBlbmQgPSAodmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgcHJlcGVuZFZhbHVlID0gY29udmVydFRvQXJyYXlQYXlsb2FkKGNsb25lT2JqZWN0KHZhbHVlKSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gcHJlcGVuZEF0KGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSksIHByZXBlbmRWYWx1ZSk7XG4gICAgICAgIGNvbnRyb2wuX25hbWVzLmZvY3VzID0gZ2V0Rm9jdXNGaWVsZE5hbWUobmFtZSwgMCwgb3B0aW9ucyk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gcHJlcGVuZEF0KGlkcy5jdXJyZW50LCBwcmVwZW5kVmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fdXBkYXRlRmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgcHJlcGVuZEF0LCB7XG4gICAgICAgICAgICBhcmdBOiBmaWxsRW1wdHlBcnJheSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgcmVtb3ZlID0gKGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gcmVtb3ZlQXJyYXlBdChjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpLCBpbmRleCk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gcmVtb3ZlQXJyYXlBdChpZHMuY3VycmVudCwgaW5kZXgpO1xuICAgICAgICB1cGRhdGVWYWx1ZXModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBzZXRGaWVsZHModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBjb250cm9sLl91cGRhdGVGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCByZW1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBpbnNlcnQkMSA9IChpbmRleCwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0VmFsdWUgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBpbnNlcnQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIGluc2VydFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gaW5zZXJ0KGlkcy5jdXJyZW50LCBpbmRleCwgaW5zZXJ0VmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fdXBkYXRlRmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgaW5zZXJ0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgICAgIGFyZ0I6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzd2FwID0gKGluZGV4QSwgaW5kZXhCKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKTtcbiAgICAgICAgc3dhcEFycmF5QXQodXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgc3dhcEFycmF5QXQoaWRzLmN1cnJlbnQsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fdXBkYXRlRmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgc3dhcEFycmF5QXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4QSxcbiAgICAgICAgICAgIGFyZ0I6IGluZGV4QixcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH07XG4gICAgY29uc3QgbW92ZSA9IChmcm9tLCB0bykgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSk7XG4gICAgICAgIG1vdmVBcnJheUF0KHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBmcm9tLCB0byk7XG4gICAgICAgIG1vdmVBcnJheUF0KGlkcy5jdXJyZW50LCBmcm9tLCB0byk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3VwZGF0ZUZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIG1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBmcm9tLFxuICAgICAgICAgICAgYXJnQjogdG8sXG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZSA9IChpbmRleCwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSBjbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gdXBkYXRlQXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIHVwZGF0ZVZhbHVlKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdLm1hcCgoaXRlbSwgaSkgPT4gIWl0ZW0gfHwgaSA9PT0gaW5kZXggPyBnZW5lcmF0ZUlkKCkgOiBpZHMuY3VycmVudFtpXSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgY29udHJvbC5fdXBkYXRlRmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgdXBkYXRlQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4LFxuICAgICAgICAgICAgYXJnQjogdXBkYXRlVmFsdWUsXG4gICAgICAgIH0sIHRydWUsIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlcGxhY2UgPSAodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSB1cGRhdGVkRmllbGRBcnJheVZhbHVlcy5tYXAoZ2VuZXJhdGVJZCk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgc2V0RmllbGRzKFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10pO1xuICAgICAgICBjb250cm9sLl91cGRhdGVGaWVsZEFycmF5KG5hbWUsIFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10sIChkYXRhKSA9PiBkYXRhLCB7fSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH07XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29udHJvbC5fc3RhdGUuYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGlzV2F0Y2hlZChuYW1lLCBjb250cm9sLl9uYW1lcykgJiZcbiAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoX2FjdGlvbmVkLmN1cnJlbnQgJiZcbiAgICAgICAgICAgICghZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMubW9kZSkuaXNPblN1Ym1pdCB8fFxuICAgICAgICAgICAgICAgIGNvbnRyb2wuX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCkpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLl9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5fZXhlY3V0ZVNjaGVtYShbbmFtZV0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGdldChyZXN1bHQuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdFcnJvciA9IGdldChjb250cm9sLl9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKCFlcnJvciAmJiBleGlzdGluZ0Vycm9yLnR5cGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleGlzdGluZ0Vycm9yLnR5cGUgIT09IGVycm9yLnR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRXJyb3IubWVzc2FnZSAhPT0gZXJyb3IubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGVycm9yICYmIGVycm9yLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXQoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgbmFtZSwgZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bnNldChjb250cm9sLl9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChjb250cm9sLl9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZiAmJlxuICAgICAgICAgICAgICAgICAgICAhKGdldFZhbGlkYXRpb25Nb2Rlcyhjb250cm9sLl9vcHRpb25zLnJlVmFsaWRhdGVNb2RlKS5pc09uU3VibWl0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWxpZGF0aW9uTW9kZXMoY29udHJvbC5fb3B0aW9ucy5tb2RlKS5pc09uU3VibWl0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkLCBjb250cm9sLl9mb3JtVmFsdWVzLCBjb250cm9sLl9vcHRpb25zLmNyaXRlcmlhTW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLmFsbCwgY29udHJvbC5fb3B0aW9ucy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uLCB0cnVlKS50aGVuKChlcnJvcikgPT4gIWlzRW1wdHlPYmplY3QoZXJyb3IpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IHVwZGF0ZUZpZWxkQXJyYXlSb290RXJyb3IoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgZXJyb3IsIG5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLl9zdWJqZWN0cy52YWx1ZXMubmV4dCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdmFsdWVzOiB7IC4uLmNvbnRyb2wuX2Zvcm1WYWx1ZXMgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRyb2wuX25hbWVzLmZvY3VzICYmXG4gICAgICAgICAgICBpdGVyYXRlRmllbGRzQnlBY3Rpb24oY29udHJvbC5fZmllbGRzLCAocmVmLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5fbmFtZXMuZm9jdXMgJiZcbiAgICAgICAgICAgICAgICAgICAga2V5LnN0YXJ0c1dpdGgoY29udHJvbC5fbmFtZXMuZm9jdXMpICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZi5mb2N1cykge1xuICAgICAgICAgICAgICAgICAgICByZWYuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyA9ICcnO1xuICAgICAgICBjb250cm9sLl91cGRhdGVWYWxpZCgpO1xuICAgICAgICBfYWN0aW9uZWQuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sIFtmaWVsZHMsIG5hbWUsIGNvbnRyb2xdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAhZ2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUpICYmIGNvbnRyb2wuX3VwZGF0ZUZpZWxkQXJyYXkobmFtZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAoY29udHJvbC5fb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyIHx8IHNob3VsZFVucmVnaXN0ZXIpICYmXG4gICAgICAgICAgICAgICAgY29udHJvbC51bnJlZ2lzdGVyKG5hbWUpO1xuICAgICAgICB9O1xuICAgIH0sIFtuYW1lLCBjb250cm9sLCBrZXlOYW1lLCBzaG91bGRVbnJlZ2lzdGVyXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3dhcDogUmVhY3QudXNlQ2FsbGJhY2soc3dhcCwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICBtb3ZlOiBSZWFjdC51c2VDYWxsYmFjayhtb3ZlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIHByZXBlbmQ6IFJlYWN0LnVzZUNhbGxiYWNrKHByZXBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgYXBwZW5kOiBSZWFjdC51c2VDYWxsYmFjayhhcHBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgcmVtb3ZlOiBSZWFjdC51c2VDYWxsYmFjayhyZW1vdmUsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgaW5zZXJ0OiBSZWFjdC51c2VDYWxsYmFjayhpbnNlcnQkMSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICB1cGRhdGU6IFJlYWN0LnVzZUNhbGxiYWNrKHVwZGF0ZSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICByZXBsYWNlOiBSZWFjdC51c2VDYWxsYmFjayhyZXBsYWNlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIGZpZWxkczogUmVhY3QudXNlTWVtbygoKSA9PiBmaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICAgIFtrZXlOYW1lXTogaWRzLmN1cnJlbnRbaW5kZXhdIHx8IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgfSkpLCBbZmllbGRzLCBrZXlOYW1lXSksXG4gICAgfTtcbn1cblxudmFyIGNyZWF0ZVN1YmplY3QgPSAoKSA9PiB7XG4gICAgbGV0IF9vYnNlcnZlcnMgPSBbXTtcbiAgICBjb25zdCBuZXh0ID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2YgX29ic2VydmVycykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCAmJiBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIF9vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9vYnNlcnZlcnMgPSBfb2JzZXJ2ZXJzLmZpbHRlcigobykgPT4gbyAhPT0gb2JzZXJ2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBfb2JzZXJ2ZXJzID0gW107XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZlcnM7XG4gICAgICAgIH0sXG4gICAgICAgIG5leHQsXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgdW5zdWJzY3JpYmUsXG4gICAgfTtcbn07XG5cbnZhciBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4gaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpIHx8ICFpc09iamVjdFR5cGUodmFsdWUpO1xuXG5mdW5jdGlvbiBkZWVwRXF1YWwob2JqZWN0MSwgb2JqZWN0Mikge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmplY3QxKSB8fCBpc1ByaW1pdGl2ZShvYmplY3QyKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0MSA9PT0gb2JqZWN0MjtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZU9iamVjdChvYmplY3QxKSAmJiBpc0RhdGVPYmplY3Qob2JqZWN0MikpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDEuZ2V0VGltZSgpID09PSBvYmplY3QyLmdldFRpbWUoKTtcbiAgICB9XG4gICAgY29uc3Qga2V5czEgPSBPYmplY3Qua2V5cyhvYmplY3QxKTtcbiAgICBjb25zdCBrZXlzMiA9IE9iamVjdC5rZXlzKG9iamVjdDIpO1xuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGNvbnN0IHZhbDEgPSBvYmplY3QxW2tleV07XG4gICAgICAgIGlmICgha2V5czIuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgIT09ICdyZWYnKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwyID0gb2JqZWN0MltrZXldO1xuICAgICAgICAgICAgaWYgKChpc0RhdGVPYmplY3QodmFsMSkgJiYgaXNEYXRlT2JqZWN0KHZhbDIpKSB8fFxuICAgICAgICAgICAgICAgIChpc09iamVjdCh2YWwxKSAmJiBpc09iamVjdCh2YWwyKSkgfHxcbiAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWwxKSAmJiBBcnJheS5pc0FycmF5KHZhbDIpKVxuICAgICAgICAgICAgICAgID8gIWRlZXBFcXVhbCh2YWwxLCB2YWwyKVxuICAgICAgICAgICAgICAgIDogdmFsMSAhPT0gdmFsMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIGlzTXVsdGlwbGVTZWxlY3QgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSBgc2VsZWN0LW11bHRpcGxlYDtcblxudmFyIGlzUmFkaW9PckNoZWNrYm94ID0gKHJlZikgPT4gaXNSYWRpb0lucHV0KHJlZikgfHwgaXNDaGVja0JveElucHV0KHJlZik7XG5cbnZhciBsaXZlID0gKHJlZikgPT4gaXNIVE1MRWxlbWVudChyZWYpICYmIHJlZi5pc0Nvbm5lY3RlZDtcblxudmFyIG9iamVjdEhhc0Z1bmN0aW9uID0gKGRhdGEpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGRhdGFba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIG1hcmtGaWVsZHNEaXJ0eShkYXRhLCBmaWVsZHMgPSB7fSkge1xuICAgIGNvbnN0IGlzUGFyZW50Tm9kZUFycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBpZiAoaXNPYmplY3QoZGF0YSkgfHwgaXNQYXJlbnROb2RlQXJyYXkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSB8fFxuICAgICAgICAgICAgICAgIChpc09iamVjdChkYXRhW2tleV0pICYmICFvYmplY3RIYXNGdW5jdGlvbihkYXRhW2tleV0pKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkc1trZXldID0gQXJyYXkuaXNBcnJheShkYXRhW2tleV0pID8gW10gOiB7fTtcbiAgICAgICAgICAgICAgICBtYXJrRmllbGRzRGlydHkoZGF0YVtrZXldLCBmaWVsZHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZGF0YVtrZXldKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xufVxuZnVuY3Rpb24gZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyhkYXRhLCBmb3JtVmFsdWVzLCBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXMpIHtcbiAgICBjb25zdCBpc1BhcmVudE5vZGVBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpIHx8IGlzUGFyZW50Tm9kZUFycmF5KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgfHxcbiAgICAgICAgICAgICAgICAoaXNPYmplY3QoZGF0YVtrZXldKSAmJiAhb2JqZWN0SGFzRnVuY3Rpb24oZGF0YVtrZXldKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoZm9ybVZhbHVlcykgfHxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmltaXRpdmUoZGlydHlGaWVsZHNGcm9tVmFsdWVzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldID0gQXJyYXkuaXNBcnJheShkYXRhW2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG1hcmtGaWVsZHNEaXJ0eShkYXRhW2tleV0sIFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLm1hcmtGaWVsZHNEaXJ0eShkYXRhW2tleV0pIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXREaXJ0eUZpZWxkc0Zyb21EZWZhdWx0VmFsdWVzKGRhdGFba2V5XSwgaXNOdWxsT3JVbmRlZmluZWQoZm9ybVZhbHVlcykgPyB7fSA6IGZvcm1WYWx1ZXNba2V5XSwgZGlydHlGaWVsZHNGcm9tVmFsdWVzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldID0gIWRlZXBFcXVhbChkYXRhW2tleV0sIGZvcm1WYWx1ZXNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpcnR5RmllbGRzRnJvbVZhbHVlcztcbn1cbnZhciBnZXREaXJ0eUZpZWxkcyA9IChkZWZhdWx0VmFsdWVzLCBmb3JtVmFsdWVzKSA9PiBnZXREaXJ0eUZpZWxkc0Zyb21EZWZhdWx0VmFsdWVzKGRlZmF1bHRWYWx1ZXMsIGZvcm1WYWx1ZXMsIG1hcmtGaWVsZHNEaXJ0eShmb3JtVmFsdWVzKSk7XG5cbnZhciBnZXRGaWVsZFZhbHVlQXMgPSAodmFsdWUsIHsgdmFsdWVBc051bWJlciwgdmFsdWVBc0RhdGUsIHNldFZhbHVlQXMgfSkgPT4gaXNVbmRlZmluZWQodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogdmFsdWVBc051bWJlclxuICAgICAgICA/IHZhbHVlID09PSAnJ1xuICAgICAgICAgICAgPyBOYU5cbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgICA/ICt2YWx1ZVxuICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgOiB2YWx1ZUFzRGF0ZSAmJiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgID8gbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICA6IHNldFZhbHVlQXNcbiAgICAgICAgICAgICAgICA/IHNldFZhbHVlQXModmFsdWUpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZTtcblxuZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShfZikge1xuICAgIGNvbnN0IHJlZiA9IF9mLnJlZjtcbiAgICBpZiAoX2YucmVmcyA/IF9mLnJlZnMuZXZlcnkoKHJlZikgPT4gcmVmLmRpc2FibGVkKSA6IHJlZi5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0ZpbGVJbnB1dChyZWYpKSB7XG4gICAgICAgIHJldHVybiByZWYuZmlsZXM7XG4gICAgfVxuICAgIGlmIChpc1JhZGlvSW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0UmFkaW9WYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QocmVmKSkge1xuICAgICAgICByZXR1cm4gWy4uLnJlZi5zZWxlY3RlZE9wdGlvbnNdLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0NoZWNrQm94SW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hlY2tib3hWYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpZWxkVmFsdWVBcyhpc1VuZGVmaW5lZChyZWYudmFsdWUpID8gX2YucmVmLnZhbHVlIDogcmVmLnZhbHVlLCBfZik7XG59XG5cbnZhciBnZXRSZXNvbHZlck9wdGlvbnMgPSAoZmllbGRzTmFtZXMsIF9maWVsZHMsIGNyaXRlcmlhTW9kZSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBmaWVsZHNOYW1lcykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgZmllbGQgJiYgc2V0KGZpZWxkcywgbmFtZSwgZmllbGQuX2YpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjcml0ZXJpYU1vZGUsXG4gICAgICAgIG5hbWVzOiBbLi4uZmllbGRzTmFtZXNdLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sXG4gICAgfTtcbn07XG5cbnZhciBnZXRSdWxlVmFsdWUgPSAocnVsZSkgPT4gaXNVbmRlZmluZWQocnVsZSlcbiAgICA/IHJ1bGVcbiAgICA6IGlzUmVnZXgocnVsZSlcbiAgICAgICAgPyBydWxlLnNvdXJjZVxuICAgICAgICA6IGlzT2JqZWN0KHJ1bGUpXG4gICAgICAgICAgICA/IGlzUmVnZXgocnVsZS52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHJ1bGUudmFsdWUuc291cmNlXG4gICAgICAgICAgICAgICAgOiBydWxlLnZhbHVlXG4gICAgICAgICAgICA6IHJ1bGU7XG5cbnZhciBoYXNWYWxpZGF0aW9uID0gKG9wdGlvbnMpID0+IG9wdGlvbnMubW91bnQgJiZcbiAgICAob3B0aW9ucy5yZXF1aXJlZCB8fFxuICAgICAgICBvcHRpb25zLm1pbiB8fFxuICAgICAgICBvcHRpb25zLm1heCB8fFxuICAgICAgICBvcHRpb25zLm1heExlbmd0aCB8fFxuICAgICAgICBvcHRpb25zLm1pbkxlbmd0aCB8fFxuICAgICAgICBvcHRpb25zLnBhdHRlcm4gfHxcbiAgICAgICAgb3B0aW9ucy52YWxpZGF0ZSk7XG5cbmZ1bmN0aW9uIHNjaGVtYUVycm9yTG9va3VwKGVycm9ycywgX2ZpZWxkcywgbmFtZSkge1xuICAgIGNvbnN0IGVycm9yID0gZ2V0KGVycm9ycywgbmFtZSk7XG4gICAgaWYgKGVycm9yIHx8IGlzS2V5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG5hbWVzID0gbmFtZS5zcGxpdCgnLicpO1xuICAgIHdoaWxlIChuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gbmFtZXMuam9pbignLicpO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCBmb3VuZEVycm9yID0gZ2V0KGVycm9ycywgZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICYmICFBcnJheS5pc0FycmF5KGZpZWxkKSAmJiBuYW1lICE9PSBmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFcnJvciAmJiBmb3VuZEVycm9yLnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIGVycm9yOiBmb3VuZEVycm9yLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lcy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICB9O1xufVxuXG52YXIgc2tpcFZhbGlkYXRpb24gPSAoaXNCbHVyRXZlbnQsIGlzVG91Y2hlZCwgaXNTdWJtaXR0ZWQsIHJlVmFsaWRhdGVNb2RlLCBtb2RlKSA9PiB7XG4gICAgaWYgKG1vZGUuaXNPbkFsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc1N1Ym1pdHRlZCAmJiBtb2RlLmlzT25Ub3VjaCkge1xuICAgICAgICByZXR1cm4gIShpc1RvdWNoZWQgfHwgaXNCbHVyRXZlbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1N1Ym1pdHRlZCA/IHJlVmFsaWRhdGVNb2RlLmlzT25CbHVyIDogbW9kZS5pc09uQmx1cikge1xuICAgICAgICByZXR1cm4gIWlzQmx1ckV2ZW50O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1N1Ym1pdHRlZCA/IHJlVmFsaWRhdGVNb2RlLmlzT25DaGFuZ2UgOiBtb2RlLmlzT25DaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIGlzQmx1ckV2ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciB1bnNldEVtcHR5QXJyYXkgPSAocmVmLCBuYW1lKSA9PiAhY29tcGFjdChnZXQocmVmLCBuYW1lKSkubGVuZ3RoICYmIHVuc2V0KHJlZiwgbmFtZSk7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG1vZGU6IFZBTElEQVRJT05fTU9ERS5vblN1Ym1pdCxcbiAgICByZVZhbGlkYXRlTW9kZTogVkFMSURBVElPTl9NT0RFLm9uQ2hhbmdlLFxuICAgIHNob3VsZEZvY3VzRXJyb3I6IHRydWUsXG59O1xuZnVuY3Rpb24gY3JlYXRlRm9ybUNvbnRyb2wocHJvcHMgPSB7fSwgZmx1c2hSb290UmVuZGVyKSB7XG4gICAgbGV0IF9vcHRpb25zID0ge1xuICAgICAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgfTtcbiAgICBsZXQgX2Zvcm1TdGF0ZSA9IHtcbiAgICAgICAgc3VibWl0Q291bnQ6IDAsXG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGlzRnVuY3Rpb24oX29wdGlvbnMuZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IHt9LFxuICAgICAgICBkaXJ0eUZpZWxkczoge30sXG4gICAgICAgIGVycm9yczogX29wdGlvbnMuZXJyb3JzIHx8IHt9LFxuICAgICAgICBkaXNhYmxlZDogX29wdGlvbnMuZGlzYWJsZWQgfHwgZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgX2ZpZWxkcyA9IHt9O1xuICAgIGxldCBfZGVmYXVsdFZhbHVlcyA9IGlzT2JqZWN0KF9vcHRpb25zLnZhbHVlcykgfHwgaXNPYmplY3QoX29wdGlvbnMuZGVmYXVsdFZhbHVlcylcbiAgICAgICAgPyBjbG9uZU9iamVjdChfb3B0aW9ucy52YWx1ZXMgfHwgX29wdGlvbnMuZGVmYXVsdFZhbHVlcykgfHwge31cbiAgICAgICAgOiB7fTtcbiAgICBsZXQgX2Zvcm1WYWx1ZXMgPSBfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyXG4gICAgICAgID8ge31cbiAgICAgICAgOiBjbG9uZU9iamVjdChfZGVmYXVsdFZhbHVlcyk7XG4gICAgbGV0IF9zdGF0ZSA9IHtcbiAgICAgICAgYWN0aW9uOiBmYWxzZSxcbiAgICAgICAgbW91bnQ6IGZhbHNlLFxuICAgICAgICB3YXRjaDogZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgX25hbWVzID0ge1xuICAgICAgICBtb3VudDogbmV3IFNldCgpLFxuICAgICAgICB1bk1vdW50OiBuZXcgU2V0KCksXG4gICAgICAgIGFycmF5OiBuZXcgU2V0KCksXG4gICAgICAgIHdhdGNoOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgICBsZXQgZGVsYXlFcnJvckNhbGxiYWNrO1xuICAgIGxldCB0aW1lciA9IDA7XG4gICAgY29uc3QgX3Byb3h5Rm9ybVN0YXRlID0ge1xuICAgICAgICBpc0RpcnR5OiBmYWxzZSxcbiAgICAgICAgZGlydHlGaWVsZHM6IGZhbHNlLFxuICAgICAgICB0b3VjaGVkRmllbGRzOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yczogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBfc3ViamVjdHMgPSB7XG4gICAgICAgIHZhbHVlczogY3JlYXRlU3ViamVjdCgpLFxuICAgICAgICBhcnJheTogY3JlYXRlU3ViamVjdCgpLFxuICAgICAgICBzdGF0ZTogY3JlYXRlU3ViamVjdCgpLFxuICAgIH07XG4gICAgY29uc3QgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQgPSBnZXRWYWxpZGF0aW9uTW9kZXMoX29wdGlvbnMubW9kZSk7XG4gICAgY29uc3QgdmFsaWRhdGlvbk1vZGVBZnRlclN1Ym1pdCA9IGdldFZhbGlkYXRpb25Nb2Rlcyhfb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSk7XG4gICAgY29uc3Qgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMgPSBfb3B0aW9ucy5jcml0ZXJpYU1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5hbGw7XG4gICAgY29uc3QgZGVib3VuY2UgPSAoY2FsbGJhY2spID0+ICh3YWl0KSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjYWxsYmFjaywgd2FpdCk7XG4gICAgfTtcbiAgICBjb25zdCBfdXBkYXRlVmFsaWQgPSBhc3luYyAoc2hvdWxkVXBkYXRlVmFsaWQpID0+IHtcbiAgICAgICAgaWYgKF9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkIHx8IHNob3VsZFVwZGF0ZVZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gX29wdGlvbnMucmVzb2x2ZXJcbiAgICAgICAgICAgICAgICA/IGlzRW1wdHlPYmplY3QoKGF3YWl0IF9leGVjdXRlU2NoZW1hKCkpLmVycm9ycylcbiAgICAgICAgICAgICAgICA6IGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkICE9PSBfZm9ybVN0YXRlLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF91cGRhdGVJc1ZhbGlkYXRpbmcgPSAodmFsdWUpID0+IF9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkYXRpbmcgJiZcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgaXNWYWxpZGF0aW5nOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgY29uc3QgX3VwZGF0ZUZpZWxkQXJyYXkgPSAobmFtZSwgdmFsdWVzID0gW10sIG1ldGhvZCwgYXJncywgc2hvdWxkU2V0VmFsdWVzID0gdHJ1ZSwgc2hvdWxkVXBkYXRlRmllbGRzQW5kU3RhdGUgPSB0cnVlKSA9PiB7XG4gICAgICAgIGlmIChhcmdzICYmIG1ldGhvZCkge1xuICAgICAgICAgICAgX3N0YXRlLmFjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlRmllbGRzQW5kU3RhdGUgJiYgQXJyYXkuaXNBcnJheShnZXQoX2ZpZWxkcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZXMgPSBtZXRob2QoZ2V0KF9maWVsZHMsIG5hbWUpLCBhcmdzLmFyZ0EsIGFyZ3MuYXJnQik7XG4gICAgICAgICAgICAgICAgc2hvdWxkU2V0VmFsdWVzICYmIHNldChfZmllbGRzLCBuYW1lLCBmaWVsZFZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlRmllbGRzQW5kU3RhdGUgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gbWV0aG9kKGdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSksIGFyZ3MuYXJnQSwgYXJncy5hcmdCKTtcbiAgICAgICAgICAgICAgICBzaG91bGRTZXRWYWx1ZXMgJiYgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcnMpO1xuICAgICAgICAgICAgICAgIHVuc2V0RW1wdHlBcnJheShfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3Byb3h5Rm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMgJiZcbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hlZEZpZWxkcyA9IG1ldGhvZChnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgYXJncy5hcmdBLCBhcmdzLmFyZ0IpO1xuICAgICAgICAgICAgICAgIHNob3VsZFNldFZhbHVlcyAmJiBzZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lLCB0b3VjaGVkRmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmRpcnR5RmllbGRzID0gZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGlzRGlydHk6IF9nZXREaXJ0eShuYW1lLCB2YWx1ZXMpLFxuICAgICAgICAgICAgICAgIGRpcnR5RmllbGRzOiBfZm9ybVN0YXRlLmRpcnR5RmllbGRzLFxuICAgICAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICAgICAgaXNWYWxpZDogX2Zvcm1TdGF0ZS5pc1ZhbGlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZUVycm9ycyA9IChuYW1lLCBlcnJvcikgPT4ge1xuICAgICAgICBzZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9yKTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgZXJyb3JzOiBfZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBfc2V0RXJyb3JzID0gKGVycm9ycykgPT4ge1xuICAgICAgICBfZm9ybVN0YXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgZXJyb3JzOiBfZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZVZhbGlkQW5kVmFsdWUgPSAobmFtZSwgc2hvdWxkU2tpcFNldFZhbHVlQXMsIHZhbHVlLCByZWYpID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZ2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBpc1VuZGVmaW5lZCh2YWx1ZSkgPyBnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpIDogdmFsdWUpO1xuICAgICAgICAgICAgaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIChyZWYgJiYgcmVmLmRlZmF1bHRDaGVja2VkKSB8fFxuICAgICAgICAgICAgICAgIHNob3VsZFNraXBTZXRWYWx1ZUFzXG4gICAgICAgICAgICAgICAgPyBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIHNob3VsZFNraXBTZXRWYWx1ZUFzID8gZGVmYXVsdFZhbHVlIDogZ2V0RmllbGRWYWx1ZShmaWVsZC5fZikpXG4gICAgICAgICAgICAgICAgOiBzZXRGaWVsZFZhbHVlKG5hbWUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICBfc3RhdGUubW91bnQgJiYgX3VwZGF0ZVZhbGlkKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZVRvdWNoQW5kRGlydHkgPSAobmFtZSwgZmllbGRWYWx1ZSwgaXNCbHVyRXZlbnQsIHNob3VsZERpcnR5LCBzaG91bGRSZW5kZXIpID0+IHtcbiAgICAgICAgbGV0IHNob3VsZFVwZGF0ZUZpZWxkID0gZmFsc2U7XG4gICAgICAgIGxldCBpc1ByZXZpb3VzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWRGaWVsZCA9ICEhKGdldChfZmllbGRzLCBuYW1lKSAmJiBnZXQoX2ZpZWxkcywgbmFtZSkuX2YuZGlzYWJsZWQpO1xuICAgICAgICBpZiAoIWlzQmx1ckV2ZW50IHx8IHNob3VsZERpcnR5KSB7XG4gICAgICAgICAgICBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICBpc1ByZXZpb3VzRGlydHkgPSBfZm9ybVN0YXRlLmlzRGlydHk7XG4gICAgICAgICAgICAgICAgX2Zvcm1TdGF0ZS5pc0RpcnR5ID0gb3V0cHV0LmlzRGlydHkgPSBfZ2V0RGlydHkoKTtcbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCA9IGlzUHJldmlvdXNEaXJ0eSAhPT0gb3V0cHV0LmlzRGlydHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRGaWVsZFByaXN0aW5lID0gZGlzYWJsZWRGaWVsZCB8fCBkZWVwRXF1YWwoZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICBpc1ByZXZpb3VzRGlydHkgPSAhISghZGlzYWJsZWRGaWVsZCAmJiBnZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgbmFtZSkpO1xuICAgICAgICAgICAgaXNDdXJyZW50RmllbGRQcmlzdGluZSB8fCBkaXNhYmxlZEZpZWxkXG4gICAgICAgICAgICAgICAgPyB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lKVxuICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUsIHRydWUpO1xuICAgICAgICAgICAgb3V0cHV0LmRpcnR5RmllbGRzID0gX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcztcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkID1cbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAoX3Byb3h5Rm9ybVN0YXRlLmRpcnR5RmllbGRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXZpb3VzRGlydHkgIT09ICFpc0N1cnJlbnRGaWVsZFByaXN0aW5lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHJldmlvdXNGaWVsZFRvdWNoZWQgPSBnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIGlmICghaXNQcmV2aW91c0ZpZWxkVG91Y2hlZCkge1xuICAgICAgICAgICAgICAgIHNldChfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMsIG5hbWUsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgICAgICBvdXRwdXQudG91Y2hlZEZpZWxkcyA9IF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcztcbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCA9XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoX3Byb3h5Rm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXZpb3VzRmllbGRUb3VjaGVkICE9PSBpc0JsdXJFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkVXBkYXRlRmllbGQgJiYgc2hvdWxkUmVuZGVyICYmIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KG91dHB1dCk7XG4gICAgICAgIHJldHVybiBzaG91bGRVcGRhdGVGaWVsZCA/IG91dHB1dCA6IHt9O1xuICAgIH07XG4gICAgY29uc3Qgc2hvdWxkUmVuZGVyQnlFcnJvciA9IChuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c0ZpZWxkRXJyb3IgPSBnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGVWYWxpZCA9IF9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkICYmXG4gICAgICAgICAgICBpc0Jvb2xlYW4oaXNWYWxpZCkgJiZcbiAgICAgICAgICAgIF9mb3JtU3RhdGUuaXNWYWxpZCAhPT0gaXNWYWxpZDtcbiAgICAgICAgaWYgKHByb3BzLmRlbGF5RXJyb3IgJiYgZXJyb3IpIHtcbiAgICAgICAgICAgIGRlbGF5RXJyb3JDYWxsYmFjayA9IGRlYm91bmNlKCgpID0+IHVwZGF0ZUVycm9ycyhuYW1lLCBlcnJvcikpO1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrKHByb3BzLmRlbGF5RXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIGRlbGF5RXJyb3JDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcilcbiAgICAgICAgICAgICAgICA6IHVuc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGVycm9yID8gIWRlZXBFcXVhbChwcmV2aW91c0ZpZWxkRXJyb3IsIGVycm9yKSA6IHByZXZpb3VzRmllbGRFcnJvcikgfHxcbiAgICAgICAgICAgICFpc0VtcHR5T2JqZWN0KGZpZWxkU3RhdGUpIHx8XG4gICAgICAgICAgICBzaG91bGRVcGRhdGVWYWxpZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZEZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZFN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLihzaG91bGRVcGRhdGVWYWxpZCAmJiBpc0Jvb2xlYW4oaXNWYWxpZCkgPyB7IGlzVmFsaWQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgX2Zvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLnVwZGF0ZWRGb3JtU3RhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQodXBkYXRlZEZvcm1TdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3VwZGF0ZUlzVmFsaWRhdGluZyhmYWxzZSk7XG4gICAgfTtcbiAgICBjb25zdCBfZXhlY3V0ZVNjaGVtYSA9IGFzeW5jIChuYW1lKSA9PiBfb3B0aW9ucy5yZXNvbHZlcihfZm9ybVZhbHVlcywgX29wdGlvbnMuY29udGV4dCwgZ2V0UmVzb2x2ZXJPcHRpb25zKG5hbWUgfHwgX25hbWVzLm1vdW50LCBfZmllbGRzLCBfb3B0aW9ucy5jcml0ZXJpYU1vZGUsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24pKTtcbiAgICBjb25zdCBleGVjdXRlU2NoZW1hQW5kVXBkYXRlU3RhdGUgPSBhc3luYyAobmFtZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBlcnJvcnMgfSA9IGF3YWl0IF9leGVjdXRlU2NoZW1hKG5hbWVzKTtcbiAgICAgICAgaWYgKG5hbWVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGdldChlcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgOiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfZm9ybVN0YXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH07XG4gICAgY29uc3QgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uID0gYXN5bmMgKGZpZWxkcywgc2hvdWxkT25seUNoZWNrVmFsaWQsIGNvbnRleHQgPSB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgIH0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IF9mLCAuLi5maWVsZFZhbHVlIH0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAoX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWVsZEFycmF5Um9vdCA9IF9uYW1lcy5hcnJheS5oYXMoX2YubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRXJyb3IgPSBhd2FpdCB2YWxpZGF0ZUZpZWxkKGZpZWxkLCBfZm9ybVZhbHVlcywgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24gJiYgIXNob3VsZE9ubHlDaGVja1ZhbGlkLCBpc0ZpZWxkQXJyYXlSb290KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXJyb3JbX2YubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRPbmx5Q2hlY2tWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICFzaG91bGRPbmx5Q2hlY2tWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGdldChmaWVsZEVycm9yLCBfZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaXNGaWVsZEFycmF5Um9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVwZGF0ZUZpZWxkQXJyYXlSb290RXJyb3IoX2Zvcm1TdGF0ZS5lcnJvcnMsIGZpZWxkRXJyb3IsIF9mLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBfZi5uYW1lLCBmaWVsZEVycm9yW19mLm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIF9mLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKGZpZWxkVmFsdWUsIHNob3VsZE9ubHlDaGVja1ZhbGlkLCBjb250ZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHQudmFsaWQ7XG4gICAgfTtcbiAgICBjb25zdCBfcmVtb3ZlVW5tb3VudGVkID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgX25hbWVzLnVuTW91bnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgZmllbGQgJiZcbiAgICAgICAgICAgICAgICAoZmllbGQuX2YucmVmc1xuICAgICAgICAgICAgICAgICAgICA/IGZpZWxkLl9mLnJlZnMuZXZlcnkoKHJlZikgPT4gIWxpdmUocmVmKSlcbiAgICAgICAgICAgICAgICAgICAgOiAhbGl2ZShmaWVsZC5fZi5yZWYpKSAmJlxuICAgICAgICAgICAgICAgIHVucmVnaXN0ZXIobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgX25hbWVzLnVuTW91bnQgPSBuZXcgU2V0KCk7XG4gICAgfTtcbiAgICBjb25zdCBfZ2V0RGlydHkgPSAobmFtZSwgZGF0YSkgPT4gKG5hbWUgJiYgZGF0YSAmJiBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGRhdGEpLFxuICAgICAgICAhZGVlcEVxdWFsKGdldFZhbHVlcygpLCBfZGVmYXVsdFZhbHVlcykpO1xuICAgIGNvbnN0IF9nZXRXYXRjaCA9IChuYW1lcywgZGVmYXVsdFZhbHVlLCBpc0dsb2JhbCkgPT4gZ2VuZXJhdGVXYXRjaE91dHB1dChuYW1lcywgX25hbWVzLCB7XG4gICAgICAgIC4uLihfc3RhdGUubW91bnRcbiAgICAgICAgICAgID8gX2Zvcm1WYWx1ZXNcbiAgICAgICAgICAgIDogaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgICAgID8gX2RlZmF1bHRWYWx1ZXNcbiAgICAgICAgICAgICAgICA6IGlzU3RyaW5nKG5hbWVzKVxuICAgICAgICAgICAgICAgICAgICA/IHsgW25hbWVzXTogZGVmYXVsdFZhbHVlIH1cbiAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUpLFxuICAgIH0sIGlzR2xvYmFsLCBkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IF9nZXRGaWVsZEFycmF5ID0gKG5hbWUpID0+IGNvbXBhY3QoZ2V0KF9zdGF0ZS5tb3VudCA/IF9mb3JtVmFsdWVzIDogX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIHByb3BzLnNob3VsZFVucmVnaXN0ZXIgPyBnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIFtdKSA6IFtdKSk7XG4gICAgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVmZXJlbmNlID0gZmllbGQuX2Y7XG4gICAgICAgICAgICBpZiAoZmllbGRSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAhZmllbGRSZWZlcmVuY2UuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBnZXRGaWVsZFZhbHVlQXModmFsdWUsIGZpZWxkUmVmZXJlbmNlKSk7XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIGlzSFRNTEVsZW1lbnQoZmllbGRSZWZlcmVuY2UucmVmKSAmJiBpc051bGxPclVuZGVmaW5lZCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBbLi4uZmllbGRSZWZlcmVuY2UucmVmLm9wdGlvbnNdLmZvckVhY2goKG9wdGlvblJlZikgPT4gKG9wdGlvblJlZi5zZWxlY3RlZCA9IGZpZWxkVmFsdWUuaW5jbHVkZXMob3B0aW9uUmVmLnZhbHVlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFJlZmVyZW5jZS5yZWZzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrQm94SW5wdXQoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmcy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWVsZFJlZmVyZW5jZS5yZWZzLmZvckVhY2goKGNoZWNrYm94UmVmKSA9PiAoIWNoZWNrYm94UmVmLmRlZmF1bHRDaGVja2VkIHx8ICFjaGVja2JveFJlZi5kaXNhYmxlZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrYm94UmVmLmNoZWNrZWQgPSBBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICEhZmllbGRWYWx1ZS5maW5kKChkYXRhKSA9PiBkYXRhID09PSBjaGVja2JveFJlZi52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmllbGRWYWx1ZSA9PT0gY2hlY2tib3hSZWYudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmllbGRSZWZlcmVuY2UucmVmc1swXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmllbGRSZWZlcmVuY2UucmVmc1swXS5jaGVja2VkID0gISFmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmZXJlbmNlLnJlZnMuZm9yRWFjaCgocmFkaW9SZWYpID0+IChyYWRpb1JlZi5jaGVja2VkID0gcmFkaW9SZWYudmFsdWUgPT09IGZpZWxkVmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0ZpbGVJbnB1dChmaWVsZFJlZmVyZW5jZS5yZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmZXJlbmNlLnJlZi52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmLnZhbHVlID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZFJlZmVyZW5jZS5yZWYudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3N1YmplY3RzLnZhbHVlcy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogeyAuLi5fZm9ybVZhbHVlcyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKG9wdGlvbnMuc2hvdWxkRGlydHkgfHwgb3B0aW9ucy5zaG91bGRUb3VjaCkgJiZcbiAgICAgICAgICAgIHVwZGF0ZVRvdWNoQW5kRGlydHkobmFtZSwgZmllbGRWYWx1ZSwgb3B0aW9ucy5zaG91bGRUb3VjaCwgb3B0aW9ucy5zaG91bGREaXJ0eSwgdHJ1ZSk7XG4gICAgICAgIG9wdGlvbnMuc2hvdWxkVmFsaWRhdGUgJiYgdHJpZ2dlcihuYW1lKTtcbiAgICB9O1xuICAgIGNvbnN0IHNldFZhbHVlcyA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkS2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdmFsdWVbZmllbGRLZXldO1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gYCR7bmFtZX0uJHtmaWVsZEtleX1gO1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIChfbmFtZXMuYXJyYXkuaGFzKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgIWlzUHJpbWl0aXZlKGZpZWxkVmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgKGZpZWxkICYmICFmaWVsZC5fZikpICYmXG4gICAgICAgICAgICAgICAgIWlzRGF0ZU9iamVjdChmaWVsZFZhbHVlKVxuICAgICAgICAgICAgICAgID8gc2V0VmFsdWVzKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IHNldEZpZWxkVmFsdWUoZmllbGROYW1lLCBmaWVsZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2V0VmFsdWUgPSAobmFtZSwgdmFsdWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgaXNGaWVsZEFycmF5ID0gX25hbWVzLmFycmF5LmhhcyhuYW1lKTtcbiAgICAgICAgY29uc3QgY2xvbmVWYWx1ZSA9IGNsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBjbG9uZVZhbHVlKTtcbiAgICAgICAgaWYgKGlzRmllbGRBcnJheSkge1xuICAgICAgICAgICAgX3N1YmplY3RzLmFycmF5Lm5leHQoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiB7IC4uLl9mb3JtVmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICgoX3Byb3h5Rm9ybVN0YXRlLmlzRGlydHkgfHwgX3Byb3h5Rm9ybVN0YXRlLmRpcnR5RmllbGRzKSAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvdWxkRGlydHkpIHtcbiAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpcnR5RmllbGRzOiBnZXREaXJ0eUZpZWxkcyhfZGVmYXVsdFZhbHVlcywgX2Zvcm1WYWx1ZXMpLFxuICAgICAgICAgICAgICAgICAgICBpc0RpcnR5OiBfZ2V0RGlydHkobmFtZSwgY2xvbmVWYWx1ZSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZCAmJiAhZmllbGQuX2YgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKGNsb25lVmFsdWUpXG4gICAgICAgICAgICAgICAgPyBzZXRWYWx1ZXMobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IHNldEZpZWxkVmFsdWUobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaXNXYXRjaGVkKG5hbWUsIF9uYW1lcykgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICBfc3ViamVjdHMudmFsdWVzLm5leHQoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZhbHVlczogeyAuLi5fZm9ybVZhbHVlcyB9LFxuICAgICAgICB9KTtcbiAgICAgICAgIV9zdGF0ZS5tb3VudCAmJiBmbHVzaFJvb3RSZW5kZXIoKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uQ2hhbmdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgbGV0IG5hbWUgPSB0YXJnZXQubmFtZTtcbiAgICAgICAgbGV0IGlzRmllbGRWYWx1ZVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgZ2V0Q3VycmVudEZpZWxkVmFsdWUgPSAoKSA9PiB0YXJnZXQudHlwZSA/IGdldEZpZWxkVmFsdWUoZmllbGQuX2YpIDogZ2V0RXZlbnRWYWx1ZShldmVudCk7XG4gICAgICAgIGNvbnN0IF91cGRhdGVJc0ZpZWxkVmFsdWVVcGRhdGVkID0gKGZpZWxkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlzRmllbGRWYWx1ZVVwZGF0ZWQgPVxuICAgICAgICAgICAgICAgIE51bWJlci5pc05hTihmaWVsZFZhbHVlKSB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID09PSBnZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IGdldEN1cnJlbnRGaWVsZFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBpc0JsdXJFdmVudCA9IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5CTFVSIHx8IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5GT0NVU19PVVQ7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTa2lwVmFsaWRhdGlvbiA9ICghaGFzVmFsaWRhdGlvbihmaWVsZC5fZikgJiZcbiAgICAgICAgICAgICAgICAhX29wdGlvbnMucmVzb2x2ZXIgJiZcbiAgICAgICAgICAgICAgICAhZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC5fZi5kZXBzKSB8fFxuICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uKGlzQmx1ckV2ZW50LCBnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCwgdmFsaWRhdGlvbk1vZGVBZnRlclN1Ym1pdCwgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlZCA9IGlzV2F0Y2hlZChuYW1lLCBfbmFtZXMsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkJsdXIgJiYgZmllbGQuX2Yub25CbHVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBkZWxheUVycm9yQ2FsbGJhY2sgJiYgZGVsYXlFcnJvckNhbGxiYWNrKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQuX2Yub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZFN0YXRlID0gdXBkYXRlVG91Y2hBbmREaXJ0eShuYW1lLCBmaWVsZFZhbHVlLCBpc0JsdXJFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVuZGVyID0gIWlzRW1wdHlPYmplY3QoZmllbGRTdGF0ZSkgfHwgd2F0Y2hlZDtcbiAgICAgICAgICAgICFpc0JsdXJFdmVudCAmJlxuICAgICAgICAgICAgICAgIF9zdWJqZWN0cy52YWx1ZXMubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogeyAuLi5fZm9ybVZhbHVlcyB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHNob3VsZFNraXBWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgJiYgX3VwZGF0ZVZhbGlkKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChzaG91bGRSZW5kZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyBuYW1lLCAuLi4od2F0Y2hlZCA/IHt9IDogZmllbGRTdGF0ZSkgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIWlzQmx1ckV2ZW50ICYmIHdhdGNoZWQgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICAgICAgX3VwZGF0ZUlzVmFsaWRhdGluZyh0cnVlKTtcbiAgICAgICAgICAgIGlmIChfb3B0aW9ucy5yZXNvbHZlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBhd2FpdCBfZXhlY3V0ZVNjaGVtYShbbmFtZV0pO1xuICAgICAgICAgICAgICAgIF91cGRhdGVJc0ZpZWxkVmFsdWVVcGRhdGVkKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpZWxkVmFsdWVVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRXJyb3JMb29rdXBSZXN1bHQgPSBzY2hlbWFFcnJvckxvb2t1cChfZm9ybVN0YXRlLmVycm9ycywgX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTG9va3VwUmVzdWx0ID0gc2NoZW1hRXJyb3JMb29rdXAoZXJyb3JzLCBfZmllbGRzLCBwcmV2aW91c0Vycm9yTG9va3VwUmVzdWx0Lm5hbWUgfHwgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyb3JMb29rdXBSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBlcnJvckxvb2t1cFJlc3VsdC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNFbXB0eU9iamVjdChlcnJvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yID0gKGF3YWl0IHZhbGlkYXRlRmllbGQoZmllbGQsIF9mb3JtVmFsdWVzLCBzaG91bGREaXNwbGF5QWxsQXNzb2NpYXRlZEVycm9ycywgX29wdGlvbnMuc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikpW25hbWVdO1xuICAgICAgICAgICAgICAgIF91cGRhdGVJc0ZpZWxkVmFsdWVVcGRhdGVkKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpZWxkVmFsdWVVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5kZXBzICYmXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoZmllbGQuX2YuZGVwcyk7XG4gICAgICAgICAgICAgICAgc2hvdWxkUmVuZGVyQnlFcnJvcihuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9mb2N1c0lucHV0ID0gKHJlZiwga2V5KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIGtleSkgJiYgcmVmLmZvY3VzKSB7XG4gICAgICAgICAgICByZWYuZm9jdXMoKTtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIGNvbnN0IHRyaWdnZXIgPSBhc3luYyAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdDtcbiAgICAgICAgY29uc3QgZmllbGROYW1lcyA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKTtcbiAgICAgICAgX3VwZGF0ZUlzVmFsaWRhdGluZyh0cnVlKTtcbiAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBleGVjdXRlU2NoZW1hQW5kVXBkYXRlU3RhdGUoaXNVbmRlZmluZWQobmFtZSkgPyBuYW1lIDogZmllbGROYW1lcyk7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNFbXB0eU9iamVjdChlcnJvcnMpO1xuICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IG5hbWVcbiAgICAgICAgICAgICAgICA/ICFmaWVsZE5hbWVzLnNvbWUoKG5hbWUpID0+IGdldChlcnJvcnMsIG5hbWUpKVxuICAgICAgICAgICAgICAgIDogaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gKGF3YWl0IFByb21pc2UuYWxsKGZpZWxkTmFtZXMubWFwKGFzeW5jIChmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlQnVpbHRJblZhbGlkYXRpb24oZmllbGQgJiYgZmllbGQuX2YgPyB7IFtmaWVsZE5hbWVdOiBmaWVsZCB9IDogZmllbGQpO1xuICAgICAgICAgICAgfSkpKS5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgICAgICEoIXZhbGlkYXRpb25SZXN1bHQgJiYgIV9mb3JtU3RhdGUuaXNWYWxpZCkgJiYgX3VwZGF0ZVZhbGlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gaXNWYWxpZCA9IGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAuLi4oIWlzU3RyaW5nKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgKF9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkICYmIGlzVmFsaWQgIT09IF9mb3JtU3RhdGUuaXNWYWxpZClcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7IG5hbWUgfSksXG4gICAgICAgICAgICAuLi4oX29wdGlvbnMucmVzb2x2ZXIgfHwgIW5hbWUgPyB7IGlzVmFsaWQgfSA6IHt9KSxcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICBpc1ZhbGlkYXRpbmc6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgb3B0aW9ucy5zaG91bGRGb2N1cyAmJlxuICAgICAgICAgICAgIXZhbGlkYXRpb25SZXN1bHQgJiZcbiAgICAgICAgICAgIGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihfZmllbGRzLCBfZm9jdXNJbnB1dCwgbmFtZSA/IGZpZWxkTmFtZXMgOiBfbmFtZXMubW91bnQpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdDtcbiAgICB9O1xuICAgIGNvbnN0IGdldFZhbHVlcyA9IChmaWVsZE5hbWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgICAgICAgIC4uLl9kZWZhdWx0VmFsdWVzLFxuICAgICAgICAgICAgLi4uKF9zdGF0ZS5tb3VudCA/IF9mb3JtVmFsdWVzIDoge30pLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNVbmRlZmluZWQoZmllbGROYW1lcylcbiAgICAgICAgICAgID8gdmFsdWVzXG4gICAgICAgICAgICA6IGlzU3RyaW5nKGZpZWxkTmFtZXMpXG4gICAgICAgICAgICAgICAgPyBnZXQodmFsdWVzLCBmaWVsZE5hbWVzKVxuICAgICAgICAgICAgICAgIDogZmllbGROYW1lcy5tYXAoKG5hbWUpID0+IGdldCh2YWx1ZXMsIG5hbWUpKTtcbiAgICB9O1xuICAgIGNvbnN0IGdldEZpZWxkU3RhdGUgPSAobmFtZSwgZm9ybVN0YXRlKSA9PiAoe1xuICAgICAgICBpbnZhbGlkOiAhIWdldCgoZm9ybVN0YXRlIHx8IF9mb3JtU3RhdGUpLmVycm9ycywgbmFtZSksXG4gICAgICAgIGlzRGlydHk6ICEhZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkuZGlydHlGaWVsZHMsIG5hbWUpLFxuICAgICAgICBpc1RvdWNoZWQ6ICEhZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkudG91Y2hlZEZpZWxkcywgbmFtZSksXG4gICAgICAgIGVycm9yOiBnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS5lcnJvcnMsIG5hbWUpLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsZWFyRXJyb3JzID0gKG5hbWUpID0+IHtcbiAgICAgICAgbmFtZSAmJlxuICAgICAgICAgICAgY29udmVydFRvQXJyYXlQYXlsb2FkKG5hbWUpLmZvckVhY2goKGlucHV0TmFtZSkgPT4gdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIGlucHV0TmFtZSkpO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBlcnJvcnM6IG5hbWUgPyBfZm9ybVN0YXRlLmVycm9ycyA6IHt9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHNldEVycm9yID0gKG5hbWUsIGVycm9yLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZiA9IChnZXQoX2ZpZWxkcywgbmFtZSwgeyBfZjoge30gfSkuX2YgfHwge30pLnJlZjtcbiAgICAgICAgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCB7XG4gICAgICAgICAgICAuLi5lcnJvcixcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuc2hvdWxkRm9jdXMgJiYgcmVmICYmIHJlZi5mb2N1cyAmJiByZWYuZm9jdXMoKTtcbiAgICB9O1xuICAgIGNvbnN0IHdhdGNoID0gKG5hbWUsIGRlZmF1bHRWYWx1ZSkgPT4gaXNGdW5jdGlvbihuYW1lKVxuICAgICAgICA/IF9zdWJqZWN0cy52YWx1ZXMuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChwYXlsb2FkKSA9PiBuYW1lKF9nZXRXYXRjaCh1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZSksIHBheWxvYWQpLFxuICAgICAgICB9KVxuICAgICAgICA6IF9nZXRXYXRjaChuYW1lLCBkZWZhdWx0VmFsdWUsIHRydWUpO1xuICAgIGNvbnN0IHVucmVnaXN0ZXIgPSAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGROYW1lIG9mIG5hbWUgPyBjb252ZXJ0VG9BcnJheVBheWxvYWQobmFtZSkgOiBfbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgIF9uYW1lcy5tb3VudC5kZWxldGUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIF9uYW1lcy5hcnJheS5kZWxldGUoZmllbGROYW1lKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgIHVuc2V0KF9mb3JtVmFsdWVzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIW9wdGlvbnMua2VlcEVycm9yICYmIHVuc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgIW9wdGlvbnMua2VlcERpcnR5ICYmIHVuc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAhb3B0aW9ucy5rZWVwVG91Y2hlZCAmJiB1bnNldChfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAhX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlciAmJlxuICAgICAgICAgICAgICAgICFvcHRpb25zLmtlZXBEZWZhdWx0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICB1bnNldChfZGVmYXVsdFZhbHVlcywgZmllbGROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBfc3ViamVjdHMudmFsdWVzLm5leHQoe1xuICAgICAgICAgICAgdmFsdWVzOiB7IC4uLl9mb3JtVmFsdWVzIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgLi4uKCFvcHRpb25zLmtlZXBEaXJ0eSA/IHt9IDogeyBpc0RpcnR5OiBfZ2V0RGlydHkoKSB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgICFvcHRpb25zLmtlZXBJc1ZhbGlkICYmIF91cGRhdGVWYWxpZCgpO1xuICAgIH07XG4gICAgY29uc3QgX3VwZGF0ZURpc2FibGVkRmllbGQgPSAoeyBkaXNhYmxlZCwgbmFtZSwgZmllbGQsIGZpZWxkcywgdmFsdWUsIH0pID0+IHtcbiAgICAgICAgaWYgKGlzQm9vbGVhbihkaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBkaXNhYmxlZFxuICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgOiBpc1VuZGVmaW5lZCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBnZXRGaWVsZFZhbHVlKGZpZWxkID8gZmllbGQuX2YgOiBnZXQoZmllbGRzLCBuYW1lKS5fZilcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgICAgIHNldChfZm9ybVZhbHVlcywgbmFtZSwgaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICB1cGRhdGVUb3VjaEFuZERpcnR5KG5hbWUsIGlucHV0VmFsdWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlZ2lzdGVyID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBsZXQgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkSXNEZWZpbmVkID0gaXNCb29sZWFuKG9wdGlvbnMuZGlzYWJsZWQpO1xuICAgICAgICBzZXQoX2ZpZWxkcywgbmFtZSwge1xuICAgICAgICAgICAgLi4uKGZpZWxkIHx8IHt9KSxcbiAgICAgICAgICAgIF9mOiB7XG4gICAgICAgICAgICAgICAgLi4uKGZpZWxkICYmIGZpZWxkLl9mID8gZmllbGQuX2YgOiB7IHJlZjogeyBuYW1lIH0gfSksXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBtb3VudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIF9uYW1lcy5tb3VudC5hZGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgX3VwZGF0ZURpc2FibGVkRmllbGQoe1xuICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHRpb25zLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZVZhbGlkQW5kVmFsdWUobmFtZSwgdHJ1ZSwgb3B0aW9ucy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLihkaXNhYmxlZElzRGVmaW5lZCA/IHsgZGlzYWJsZWQ6IG9wdGlvbnMuZGlzYWJsZWQgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihfb3B0aW9ucy5wcm9ncmVzc2l2ZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogISFvcHRpb25zLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICBtaW46IGdldFJ1bGVWYWx1ZShvcHRpb25zLm1pbiksXG4gICAgICAgICAgICAgICAgICAgIG1heDogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWF4KSxcbiAgICAgICAgICAgICAgICAgICAgbWluTGVuZ3RoOiBnZXRSdWxlVmFsdWUob3B0aW9ucy5taW5MZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg6IGdldFJ1bGVWYWx1ZShvcHRpb25zLm1heExlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IGdldFJ1bGVWYWx1ZShvcHRpb25zLnBhdHRlcm4pLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBvbkNoYW5nZSxcbiAgICAgICAgICAgIG9uQmx1cjogb25DaGFuZ2UsXG4gICAgICAgICAgICByZWY6IChyZWYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKG5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRSZWYgPSBpc1VuZGVmaW5lZChyZWYudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlZi5xdWVyeVNlbGVjdG9yQWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZWYucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsc2VsZWN0LHRleHRhcmVhJylbMF0gfHwgcmVmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWZcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb09yQ2hlY2tib3ggPSBpc1JhZGlvT3JDaGVja2JveChmaWVsZFJlZik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZnMgPSBmaWVsZC5fZi5yZWZzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFkaW9PckNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlZnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24gPT09IGZpZWxkUmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZFJlZiA9PT0gZmllbGQuX2YucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0KF9maWVsZHMsIG5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZmllbGQuX2YsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJhZGlvT3JDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZWZzLmZpbHRlcihsaXZlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSA/IFt7fV0gOiBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiB7IHR5cGU6IGZpZWxkUmVmLnR5cGUsIG5hbWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgcmVmOiBmaWVsZFJlZiB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVWYWxpZEFuZFZhbHVlKG5hbWUsIGZhbHNlLCB1bmRlZmluZWQsIGZpZWxkUmVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZi5tb3VudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIChfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyIHx8IG9wdGlvbnMuc2hvdWxkVW5yZWdpc3RlcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICEoaXNOYW1lSW5GaWVsZEFycmF5KF9uYW1lcy5hcnJheSwgbmFtZSkgJiYgX3N0YXRlLmFjdGlvbikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lcy51bk1vdW50LmFkZChuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgX2ZvY3VzRXJyb3IgPSAoKSA9PiBfb3B0aW9ucy5zaG91bGRGb2N1c0Vycm9yICYmXG4gICAgICAgIGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihfZmllbGRzLCBfZm9jdXNJbnB1dCwgX25hbWVzLm1vdW50KTtcbiAgICBjb25zdCBfZGlzYWJsZUZvcm0gPSAoZGlzYWJsZWQpID0+IHtcbiAgICAgICAgaWYgKGlzQm9vbGVhbihkaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHsgZGlzYWJsZWQgfSk7XG4gICAgICAgICAgICBpdGVyYXRlRmllbGRzQnlBY3Rpb24oX2ZpZWxkcywgKHJlZiwgbmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZXF1aXJlZERpc2FibGVkU3RhdGUgPSBkaXNhYmxlZDtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZCAmJiBpc0Jvb2xlYW4oY3VycmVudEZpZWxkLl9mLmRpc2FibGVkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZERpc2FibGVkU3RhdGUgfHwgKHJlcXVpcmVkRGlzYWJsZWRTdGF0ZSA9IGN1cnJlbnRGaWVsZC5fZi5kaXNhYmxlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlZi5kaXNhYmxlZCA9IHJlcXVpcmVkRGlzYWJsZWRTdGF0ZTtcbiAgICAgICAgICAgIH0sIDAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlU3VibWl0ID0gKG9uVmFsaWQsIG9uSW52YWxpZCkgPT4gYXN5bmMgKGUpID0+IHtcbiAgICAgICAgbGV0IG9uVmFsaWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5wZXJzaXN0ICYmIGUucGVyc2lzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWVsZFZhbHVlcyA9IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICBjb25zdCB7IGVycm9ycywgdmFsdWVzIH0gPSBhd2FpdCBfZXhlY3V0ZVNjaGVtYSgpO1xuICAgICAgICAgICAgX2Zvcm1TdGF0ZS5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgICAgICBmaWVsZFZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgJ3Jvb3QnKTtcbiAgICAgICAgaWYgKGlzRW1wdHlPYmplY3QoX2Zvcm1TdGF0ZS5lcnJvcnMpKSB7XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvblZhbGlkKGZpZWxkVmFsdWVzLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG9uVmFsaWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9uSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uSW52YWxpZCh7IC4uLl9mb3JtU3RhdGUuZXJyb3JzIH0sIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZvY3VzRXJyb3IoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoX2ZvY3VzRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogaXNFbXB0eU9iamVjdChfZm9ybVN0YXRlLmVycm9ycykgJiYgIW9uVmFsaWRFcnJvcixcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBfZm9ybVN0YXRlLnN1Ym1pdENvdW50ICsgMSxcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob25WYWxpZEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBvblZhbGlkRXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlc2V0RmllbGQgPSAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2ZpZWxkcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBvcHRpb25zLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgc2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lLCBjbG9uZU9iamVjdChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmtlZXBUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRGlydHkpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmlzRGlydHkgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA/IF9nZXREaXJ0eShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSlcbiAgICAgICAgICAgICAgICAgICAgOiBfZ2V0RGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgJiYgX3VwZGF0ZVZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7IC4uLl9mb3JtU3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9yZXNldCA9IChmb3JtVmFsdWVzLCBrZWVwU3RhdGVPcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IGZvcm1WYWx1ZXMgPyBjbG9uZU9iamVjdChmb3JtVmFsdWVzKSA6IF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICBjb25zdCBjbG9uZVVwZGF0ZWRWYWx1ZXMgPSBjbG9uZU9iamVjdCh1cGRhdGVkVmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZm9ybVZhbHVlcyAmJiAhaXNFbXB0eU9iamVjdChmb3JtVmFsdWVzKVxuICAgICAgICAgICAgPyBjbG9uZVVwZGF0ZWRWYWx1ZXNcbiAgICAgICAgICAgIDogX2RlZmF1bHRWYWx1ZXM7XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcykge1xuICAgICAgICAgICAgX2RlZmF1bHRWYWx1ZXMgPSB1cGRhdGVkVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwVmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAoa2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBfbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIGZpZWxkTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0KHZhbHVlcywgZmllbGROYW1lLCBnZXQoX2Zvcm1WYWx1ZXMsIGZpZWxkTmFtZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHNldFZhbHVlKGZpZWxkTmFtZSwgZ2V0KHZhbHVlcywgZmllbGROYW1lKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzV2ViICYmIGlzVW5kZWZpbmVkKGZvcm1WYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBfbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRSZWZlcmVuY2UgPSBBcnJheS5pc0FycmF5KGZpZWxkLl9mLnJlZnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmllbGQuX2YucmVmc1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLl9mLnJlZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNIVE1MRWxlbWVudChmaWVsZFJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybSA9IGZpZWxkUmVmZXJlbmNlLmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0ucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9maWVsZHMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9mb3JtVmFsdWVzID0gcHJvcHMuc2hvdWxkVW5yZWdpc3RlclxuICAgICAgICAgICAgICAgID8ga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IGNsb25lT2JqZWN0KF9kZWZhdWx0VmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICA6IHt9XG4gICAgICAgICAgICAgICAgOiBjbG9uZU9iamVjdCh2YWx1ZXMpO1xuICAgICAgICAgICAgX3N1YmplY3RzLmFycmF5Lm5leHQoe1xuICAgICAgICAgICAgICAgIHZhbHVlczogeyAuLi52YWx1ZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX3N1YmplY3RzLnZhbHVlcy5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4udmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfbmFtZXMgPSB7XG4gICAgICAgICAgICBtb3VudDogbmV3IFNldCgpLFxuICAgICAgICAgICAgdW5Nb3VudDogbmV3IFNldCgpLFxuICAgICAgICAgICAgYXJyYXk6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIHdhdGNoOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB3YXRjaEFsbDogZmFsc2UsXG4gICAgICAgICAgICBmb2N1czogJycsXG4gICAgICAgIH07XG4gICAgICAgICFfc3RhdGUubW91bnQgJiYgZmx1c2hSb290UmVuZGVyKCk7XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9XG4gICAgICAgICAgICAhX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcElzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5VmFsdWVzO1xuICAgICAgICBfc3RhdGUud2F0Y2ggPSAhIXByb3BzLnNob3VsZFVucmVnaXN0ZXI7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBrZWVwU3RhdGVPcHRpb25zLmtlZXBTdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5zdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGlzRGlydHk6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5XG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLmlzRGlydHlcbiAgICAgICAgICAgICAgICA6ICEhKGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgIWRlZXBFcXVhbChmb3JtVmFsdWVzLCBfZGVmYXVsdFZhbHVlcykpLFxuICAgICAgICAgICAgaXNTdWJtaXR0ZWQ6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcElzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLmlzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGRpcnR5RmllbGRzOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVZhbHVlc1xuICAgICAgICAgICAgICAgID8ga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcyAmJiBfZm9ybVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBfZm9ybVZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgOiBfZm9ybVN0YXRlLmRpcnR5RmllbGRzXG4gICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEZWZhdWx0VmFsdWVzICYmIGZvcm1WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyBnZXREaXJ0eUZpZWxkcyhfZGVmYXVsdFZhbHVlcywgZm9ybVZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgOiB7fSxcbiAgICAgICAgICAgIHRvdWNoZWRGaWVsZHM6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcFRvdWNoZWRcbiAgICAgICAgICAgICAgICA/IF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkc1xuICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICBlcnJvcnM6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcEVycm9ycyA/IF9mb3JtU3RhdGUuZXJyb3JzIDoge30sXG4gICAgICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcElzU3VibWl0U3VjY2Vzc2Z1bFxuICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5pc1N1Ym1pdFN1Y2Nlc3NmdWxcbiAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCByZXNldCA9IChmb3JtVmFsdWVzLCBrZWVwU3RhdGVPcHRpb25zKSA9PiBfcmVzZXQoaXNGdW5jdGlvbihmb3JtVmFsdWVzKVxuICAgICAgICA/IGZvcm1WYWx1ZXMoX2Zvcm1WYWx1ZXMpXG4gICAgICAgIDogZm9ybVZhbHVlcywga2VlcFN0YXRlT3B0aW9ucyk7XG4gICAgY29uc3Qgc2V0Rm9jdXMgPSAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBmaWVsZFJlZmVyZW5jZSA9IGZpZWxkICYmIGZpZWxkLl9mO1xuICAgICAgICBpZiAoZmllbGRSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVmID0gZmllbGRSZWZlcmVuY2UucmVmc1xuICAgICAgICAgICAgICAgID8gZmllbGRSZWZlcmVuY2UucmVmc1swXVxuICAgICAgICAgICAgICAgIDogZmllbGRSZWZlcmVuY2UucmVmO1xuICAgICAgICAgICAgaWYgKGZpZWxkUmVmLmZvY3VzKSB7XG4gICAgICAgICAgICAgICAgZmllbGRSZWYuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3VsZFNlbGVjdCAmJiBmaWVsZFJlZi5zZWxlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3VwZGF0ZUZvcm1TdGF0ZSA9ICh1cGRhdGVkRm9ybVN0YXRlKSA9PiB7XG4gICAgICAgIF9mb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgLi4udXBkYXRlZEZvcm1TdGF0ZSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IF9yZXNldERlZmF1bHRWYWx1ZXMgPSAoKSA9PiBpc0Z1bmN0aW9uKF9vcHRpb25zLmRlZmF1bHRWYWx1ZXMpICYmXG4gICAgICAgIF9vcHRpb25zLmRlZmF1bHRWYWx1ZXMoKS50aGVuKCh2YWx1ZXMpID0+IHtcbiAgICAgICAgICAgIHJlc2V0KHZhbHVlcywgX29wdGlvbnMucmVzZXRPcHRpb25zKTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRyb2w6IHtcbiAgICAgICAgICAgIHJlZ2lzdGVyLFxuICAgICAgICAgICAgdW5yZWdpc3RlcixcbiAgICAgICAgICAgIGdldEZpZWxkU3RhdGUsXG4gICAgICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgICAgICBzZXRFcnJvcixcbiAgICAgICAgICAgIF9leGVjdXRlU2NoZW1hLFxuICAgICAgICAgICAgX2dldFdhdGNoLFxuICAgICAgICAgICAgX2dldERpcnR5LFxuICAgICAgICAgICAgX3VwZGF0ZVZhbGlkLFxuICAgICAgICAgICAgX3JlbW92ZVVubW91bnRlZCxcbiAgICAgICAgICAgIF91cGRhdGVGaWVsZEFycmF5LFxuICAgICAgICAgICAgX3VwZGF0ZURpc2FibGVkRmllbGQsXG4gICAgICAgICAgICBfZ2V0RmllbGRBcnJheSxcbiAgICAgICAgICAgIF9yZXNldCxcbiAgICAgICAgICAgIF9yZXNldERlZmF1bHRWYWx1ZXMsXG4gICAgICAgICAgICBfdXBkYXRlRm9ybVN0YXRlLFxuICAgICAgICAgICAgX2Rpc2FibGVGb3JtLFxuICAgICAgICAgICAgX3N1YmplY3RzLFxuICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLFxuICAgICAgICAgICAgX3NldEVycm9ycyxcbiAgICAgICAgICAgIGdldCBfZmllbGRzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZmllbGRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfZm9ybVZhbHVlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Zvcm1WYWx1ZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9zdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N0YXRlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCBfc3RhdGUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgX2RlZmF1bHRWYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfbmFtZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX25hbWVzKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX25hbWVzID0gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9mb3JtU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtU3RhdGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0IF9mb3JtU3RhdGUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9ybVN0YXRlID0gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9vcHRpb25zKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX29wdGlvbnModmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uX29wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0cmlnZ2VyLFxuICAgICAgICByZWdpc3RlcixcbiAgICAgICAgaGFuZGxlU3VibWl0LFxuICAgICAgICB3YXRjaCxcbiAgICAgICAgc2V0VmFsdWUsXG4gICAgICAgIGdldFZhbHVlcyxcbiAgICAgICAgcmVzZXQsXG4gICAgICAgIHJlc2V0RmllbGQsXG4gICAgICAgIGNsZWFyRXJyb3JzLFxuICAgICAgICB1bnJlZ2lzdGVyLFxuICAgICAgICBzZXRFcnJvcixcbiAgICAgICAgc2V0Rm9jdXMsXG4gICAgICAgIGdldEZpZWxkU3RhdGUsXG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byBtYW5hZ2UgdGhlIGVudGlyZSBmb3JtLlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vmb3JtKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tZ2V0LXN0YXJ0ZWQtdHMtNWtzbW0pIOKAoiBbVmlkZW9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9UmtYdjRBWFhDXzQpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gZm9ybSBjb25maWd1cmF0aW9uIGFuZCB2YWxpZGF0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMgbWV0aG9kcyAtIGluZGl2aWR1YWwgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9ybSBzdGF0ZS4ge0BsaW5rIFVzZUZvcm1SZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBoYW5kbGVTdWJtaXQsIHdhdGNoLCBmb3JtU3RhdGU6IHsgZXJyb3JzIH0gfSA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgY29uc29sZS5sb2cod2F0Y2goXCJleGFtcGxlXCIpKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdChvblN1Ym1pdCl9PlxuICogICAgICAgPGlucHV0IGRlZmF1bHRWYWx1ZT1cInRlc3RcIiB7Li4ucmVnaXN0ZXIoXCJleGFtcGxlXCIpfSAvPlxuICogICAgICAgPGlucHV0IHsuLi5yZWdpc3RlcihcImV4YW1wbGVSZXF1aXJlZFwiLCB7IHJlcXVpcmVkOiB0cnVlIH0pfSAvPlxuICogICAgICAge2Vycm9ycy5leGFtcGxlUmVxdWlyZWQgJiYgPHNwYW4+VGhpcyBmaWVsZCBpcyByZXF1aXJlZDwvc3Bhbj59XG4gKiAgICAgICA8YnV0dG9uPlN1Ym1pdDwvYnV0dG9uPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VGb3JtKHByb3BzID0ge30pIHtcbiAgICBjb25zdCBfZm9ybUNvbnRyb2wgPSBSZWFjdC51c2VSZWYoKTtcbiAgICBjb25zdCBfdmFsdWVzID0gUmVhY3QudXNlUmVmKCk7XG4gICAgY29uc3QgW2Zvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzTG9hZGluZzogaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKSxcbiAgICAgICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgc3VibWl0Q291bnQ6IDAsXG4gICAgICAgIGRpcnR5RmllbGRzOiB7fSxcbiAgICAgICAgdG91Y2hlZEZpZWxkczoge30sXG4gICAgICAgIGVycm9yczogcHJvcHMuZXJyb3JzIHx8IHt9LFxuICAgICAgICBkaXNhYmxlZDogcHJvcHMuZGlzYWJsZWQgfHwgZmFsc2UsXG4gICAgICAgIGRlZmF1bHRWYWx1ZXM6IGlzRnVuY3Rpb24ocHJvcHMuZGVmYXVsdFZhbHVlcylcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHByb3BzLmRlZmF1bHRWYWx1ZXMsXG4gICAgfSk7XG4gICAgaWYgKCFfZm9ybUNvbnRyb2wuY3VycmVudCkge1xuICAgICAgICBfZm9ybUNvbnRyb2wuY3VycmVudCA9IHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZUZvcm1Db250cm9sKHByb3BzLCAoKSA9PiB1cGRhdGVGb3JtU3RhdGUoKGZvcm1TdGF0ZSkgPT4gKHsgLi4uZm9ybVN0YXRlIH0pKSksXG4gICAgICAgICAgICBmb3JtU3RhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2wgPSBfZm9ybUNvbnRyb2wuY3VycmVudC5jb250cm9sO1xuICAgIGNvbnRyb2wuX29wdGlvbnMgPSBwcm9wcztcbiAgICB1c2VTdWJzY3JpYmUoe1xuICAgICAgICBzdWJqZWN0OiBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZSxcbiAgICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVuZGVyRm9ybVN0YXRlKHZhbHVlLCBjb250cm9sLl9wcm94eUZvcm1TdGF0ZSwgY29udHJvbC5fdXBkYXRlRm9ybVN0YXRlLCB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSh7IC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gY29udHJvbC5fZGlzYWJsZUZvcm0ocHJvcHMuZGlzYWJsZWQpLCBbY29udHJvbCwgcHJvcHMuZGlzYWJsZWRdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5fcHJveHlGb3JtU3RhdGUuaXNEaXJ0eSkge1xuICAgICAgICAgICAgY29uc3QgaXNEaXJ0eSA9IGNvbnRyb2wuX2dldERpcnR5KCk7XG4gICAgICAgICAgICBpZiAoaXNEaXJ0eSAhPT0gZm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJ0eSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtjb250cm9sLCBmb3JtU3RhdGUuaXNEaXJ0eV0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy52YWx1ZXMgJiYgIWRlZXBFcXVhbChwcm9wcy52YWx1ZXMsIF92YWx1ZXMuY3VycmVudCkpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3Jlc2V0KHByb3BzLnZhbHVlcywgY29udHJvbC5fb3B0aW9ucy5yZXNldE9wdGlvbnMpO1xuICAgICAgICAgICAgX3ZhbHVlcy5jdXJyZW50ID0gcHJvcHMudmFsdWVzO1xuICAgICAgICAgICAgdXBkYXRlRm9ybVN0YXRlKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29udHJvbC5fcmVzZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICB9LCBbcHJvcHMudmFsdWVzLCBjb250cm9sXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzLmVycm9ycykge1xuICAgICAgICAgICAgY29udHJvbC5fc2V0RXJyb3JzKHByb3BzLmVycm9ycyk7XG4gICAgICAgIH1cbiAgICB9LCBbcHJvcHMuZXJyb3JzLCBjb250cm9sXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFjb250cm9sLl9zdGF0ZS5tb3VudCkge1xuICAgICAgICAgICAgY29udHJvbC5fdXBkYXRlVmFsaWQoKTtcbiAgICAgICAgICAgIGNvbnRyb2wuX3N0YXRlLm1vdW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbC5fc3RhdGUud2F0Y2gpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3N0YXRlLndhdGNoID0gZmFsc2U7XG4gICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHsgLi4uY29udHJvbC5fZm9ybVN0YXRlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2wuX3JlbW92ZVVubW91bnRlZCgpO1xuICAgIH0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHByb3BzLnNob3VsZFVucmVnaXN0ZXIgJiZcbiAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnZhbHVlcy5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGNvbnRyb2wuX2dldFdhdGNoKCksXG4gICAgICAgICAgICB9KTtcbiAgICB9LCBbcHJvcHMuc2hvdWxkVW5yZWdpc3RlciwgY29udHJvbF0pO1xuICAgIF9mb3JtQ29udHJvbC5jdXJyZW50LmZvcm1TdGF0ZSA9IGdldFByb3h5Rm9ybVN0YXRlKGZvcm1TdGF0ZSwgY29udHJvbCk7XG4gICAgcmV0dXJuIF9mb3JtQ29udHJvbC5jdXJyZW50O1xufVxuXG5leHBvcnQgeyBDb250cm9sbGVyLCBGb3JtLCBGb3JtUHJvdmlkZXIsIGFwcGVuZEVycm9ycywgZ2V0LCBzZXQsIHVzZUNvbnRyb2xsZXIsIHVzZUZpZWxkQXJyYXksIHVzZUZvcm0sIHVzZUZvcm1Db250ZXh0LCB1c2VGb3JtU3RhdGUsIHVzZVdhdGNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20ubWpzLm1hcFxuIl0sIm5hbWVzIjpbIlJlYWN0IiwiaXNDaGVja0JveElucHV0IiwiZWxlbWVudCIsInR5cGUiLCJpc0RhdGVPYmplY3QiLCJ2YWx1ZSIsIkRhdGUiLCJpc051bGxPclVuZGVmaW5lZCIsImlzT2JqZWN0VHlwZSIsImlzT2JqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0RXZlbnRWYWx1ZSIsImV2ZW50IiwidGFyZ2V0IiwiY2hlY2tlZCIsImdldE5vZGVQYXJlbnROYW1lIiwibmFtZSIsInN1YnN0cmluZyIsInNlYXJjaCIsImlzTmFtZUluRmllbGRBcnJheSIsIm5hbWVzIiwiaGFzIiwiaXNQbGFpbk9iamVjdCIsInRlbXBPYmplY3QiLCJwcm90b3R5cGVDb3B5IiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImlzV2ViIiwid2luZG93IiwiSFRNTEVsZW1lbnQiLCJkb2N1bWVudCIsImNsb25lT2JqZWN0IiwiZGF0YSIsImNvcHkiLCJTZXQiLCJCbG9iIiwiRmlsZUxpc3QiLCJrZXkiLCJjb21wYWN0IiwiZmlsdGVyIiwiQm9vbGVhbiIsImlzVW5kZWZpbmVkIiwidmFsIiwidW5kZWZpbmVkIiwiZ2V0Iiwib2JqZWN0IiwicGF0aCIsImRlZmF1bHRWYWx1ZSIsInJlc3VsdCIsInNwbGl0IiwicmVkdWNlIiwiaXNCb29sZWFuIiwiRVZFTlRTIiwiQkxVUiIsIkZPQ1VTX09VVCIsIkNIQU5HRSIsIlZBTElEQVRJT05fTU9ERSIsIm9uQmx1ciIsIm9uQ2hhbmdlIiwib25TdWJtaXQiLCJvblRvdWNoZWQiLCJhbGwiLCJJTlBVVF9WQUxJREFUSU9OX1JVTEVTIiwibWF4IiwibWluIiwibWF4TGVuZ3RoIiwibWluTGVuZ3RoIiwicGF0dGVybiIsInJlcXVpcmVkIiwidmFsaWRhdGUiLCJIb29rRm9ybUNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidXNlRm9ybUNvbnRleHQiLCJ1c2VDb250ZXh0IiwiRm9ybVByb3ZpZGVyIiwicHJvcHMiLCJjaGlsZHJlbiIsImNyZWF0ZUVsZW1lbnQiLCJQcm92aWRlciIsImdldFByb3h5Rm9ybVN0YXRlIiwiZm9ybVN0YXRlIiwiY29udHJvbCIsImxvY2FsUHJveHlGb3JtU3RhdGUiLCJpc1Jvb3QiLCJkZWZhdWx0VmFsdWVzIiwiX2RlZmF1bHRWYWx1ZXMiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIl9rZXkiLCJfcHJveHlGb3JtU3RhdGUiLCJpc0VtcHR5T2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInNob3VsZFJlbmRlckZvcm1TdGF0ZSIsImZvcm1TdGF0ZURhdGEiLCJ1cGRhdGVGb3JtU3RhdGUiLCJmaW5kIiwiY29udmVydFRvQXJyYXlQYXlsb2FkIiwic2hvdWxkU3Vic2NyaWJlQnlOYW1lIiwic2lnbmFsTmFtZSIsImV4YWN0Iiwic29tZSIsImN1cnJlbnROYW1lIiwic3RhcnRzV2l0aCIsInVzZVN1YnNjcmliZSIsIl9wcm9wcyIsInVzZVJlZiIsImN1cnJlbnQiLCJ1c2VFZmZlY3QiLCJzdWJzY3JpcHRpb24iLCJkaXNhYmxlZCIsInN1YmplY3QiLCJzdWJzY3JpYmUiLCJuZXh0IiwidW5zdWJzY3JpYmUiLCJ1c2VGb3JtU3RhdGUiLCJtZXRob2RzIiwidXNlU3RhdGUiLCJfZm9ybVN0YXRlIiwiX21vdW50ZWQiLCJfbG9jYWxQcm94eUZvcm1TdGF0ZSIsImlzRGlydHkiLCJpc0xvYWRpbmciLCJkaXJ0eUZpZWxkcyIsInRvdWNoZWRGaWVsZHMiLCJpc1ZhbGlkYXRpbmciLCJpc1ZhbGlkIiwiZXJyb3JzIiwiX25hbWUiLCJfdXBkYXRlRm9ybVN0YXRlIiwiX3N1YmplY3RzIiwic3RhdGUiLCJfdXBkYXRlVmFsaWQiLCJpc1N0cmluZyIsImdlbmVyYXRlV2F0Y2hPdXRwdXQiLCJfbmFtZXMiLCJmb3JtVmFsdWVzIiwiaXNHbG9iYWwiLCJ3YXRjaCIsImFkZCIsIm1hcCIsImZpZWxkTmFtZSIsIndhdGNoQWxsIiwidXNlV2F0Y2giLCJ2YWx1ZXMiLCJ1cGRhdGVWYWx1ZSIsIl9mb3JtVmFsdWVzIiwiX2dldFdhdGNoIiwiX3JlbW92ZVVubW91bnRlZCIsImlzS2V5IiwidGVzdCIsInN0cmluZ1RvUGF0aCIsImlucHV0IiwicmVwbGFjZSIsInNldCIsImluZGV4IiwidGVtcFBhdGgiLCJsYXN0SW5kZXgiLCJuZXdWYWx1ZSIsIm9ialZhbHVlIiwiaXNOYU4iLCJ1c2VDb250cm9sbGVyIiwic2hvdWxkVW5yZWdpc3RlciIsImlzQXJyYXlGaWVsZCIsImFycmF5IiwiX3JlZ2lzdGVyUHJvcHMiLCJyZWdpc3RlciIsInJ1bGVzIiwiX3Nob3VsZFVucmVnaXN0ZXJGaWVsZCIsIl9vcHRpb25zIiwidXBkYXRlTW91bnRlZCIsImZpZWxkIiwiX2ZpZWxkcyIsIl9mIiwibW91bnQiLCJfc3RhdGUiLCJhY3Rpb24iLCJ1bnJlZ2lzdGVyIiwiX3VwZGF0ZURpc2FibGVkRmllbGQiLCJmaWVsZHMiLCJ1c2VDYWxsYmFjayIsInJlZiIsImVsbSIsImZvY3VzIiwic2VsZWN0Iiwic2V0Q3VzdG9tVmFsaWRpdHkiLCJtZXNzYWdlIiwicmVwb3J0VmFsaWRpdHkiLCJmaWVsZFN0YXRlIiwiZGVmaW5lUHJvcGVydGllcyIsImludmFsaWQiLCJlbnVtZXJhYmxlIiwiaXNUb3VjaGVkIiwiZXJyb3IiLCJDb250cm9sbGVyIiwicmVuZGVyIiwiUE9TVF9SRVFVRVNUIiwiRm9ybSIsIm1vdW50ZWQiLCJzZXRNb3VudGVkIiwibWV0aG9kIiwiaGVhZGVycyIsImVuY1R5cGUiLCJvbkVycm9yIiwib25TdWNjZXNzIiwidmFsaWRhdGVTdGF0dXMiLCJyZXN0Iiwic3VibWl0IiwiaGFzRXJyb3IiLCJoYW5kbGVTdWJtaXQiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiZm9ybURhdGFKc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9hIiwiYXBwZW5kIiwic2hvdWxkU3RyaW5naWZ5U3VibWlzc2lvbkRhdGEiLCJpbmNsdWRlcyIsInJlc3BvbnNlIiwiZmV0Y2giLCJib2R5Iiwic3RhdHVzIiwiU3RyaW5nIiwiaXNTdWJtaXRTdWNjZXNzZnVsIiwic2V0RXJyb3IiLCJGcmFnbWVudCIsIm5vVmFsaWRhdGUiLCJhcHBlbmRFcnJvcnMiLCJ2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEiLCJ0eXBlcyIsImdlbmVyYXRlSWQiLCJkIiwicGVyZm9ybWFuY2UiLCJub3ciLCJjIiwiciIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsImdldEZvY3VzRmllbGROYW1lIiwib3B0aW9ucyIsInNob3VsZEZvY3VzIiwiZm9jdXNOYW1lIiwiZm9jdXNJbmRleCIsImdldFZhbGlkYXRpb25Nb2RlcyIsIm1vZGUiLCJpc09uU3VibWl0IiwiaXNPbkJsdXIiLCJpc09uQ2hhbmdlIiwiaXNPbkFsbCIsImlzT25Ub3VjaCIsImlzV2F0Y2hlZCIsImlzQmx1ckV2ZW50Iiwid2F0Y2hOYW1lIiwic2xpY2UiLCJpdGVyYXRlRmllbGRzQnlBY3Rpb24iLCJmaWVsZHNOYW1lcyIsImFib3J0RWFybHkiLCJjdXJyZW50RmllbGQiLCJyZWZzIiwidXBkYXRlRmllbGRBcnJheVJvb3RFcnJvciIsImZpZWxkQXJyYXlFcnJvcnMiLCJpc0ZpbGVJbnB1dCIsImlzRnVuY3Rpb24iLCJpc0hUTUxFbGVtZW50Iiwib3duZXIiLCJvd25lckRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJpc01lc3NhZ2UiLCJpc1JhZGlvSW5wdXQiLCJpc1JlZ2V4IiwiUmVnRXhwIiwiZGVmYXVsdFJlc3VsdCIsInZhbGlkUmVzdWx0IiwiZ2V0Q2hlY2tib3hWYWx1ZSIsIm9wdGlvbiIsImF0dHJpYnV0ZXMiLCJkZWZhdWx0UmV0dXJuIiwiZ2V0UmFkaW9WYWx1ZSIsInByZXZpb3VzIiwiZ2V0VmFsaWRhdGVFcnJvciIsImV2ZXJ5IiwiZ2V0VmFsdWVBbmRNZXNzYWdlIiwidmFsaWRhdGlvbkRhdGEiLCJ2YWxpZGF0ZUZpZWxkIiwic2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiIsImlzRmllbGRBcnJheSIsInZhbHVlQXNOdW1iZXIiLCJpbnB1dFZhbHVlIiwiaW5wdXRSZWYiLCJpc1JhZGlvIiwiaXNDaGVja0JveCIsImlzUmFkaW9PckNoZWNrYm94IiwiaXNFbXB0eSIsImFwcGVuZEVycm9yc0N1cnJ5IiwiYmluZCIsImdldE1pbk1heE1lc3NhZ2UiLCJleGNlZWRNYXgiLCJtYXhMZW5ndGhNZXNzYWdlIiwibWluTGVuZ3RoTWVzc2FnZSIsIm1heFR5cGUiLCJtaW5UeXBlIiwiZXhjZWVkTWluIiwibWF4T3V0cHV0IiwibWluT3V0cHV0IiwidmFsdWVOdW1iZXIiLCJ2YWx1ZURhdGUiLCJ2YWx1ZUFzRGF0ZSIsImNvbnZlcnRUaW1lVG9EYXRlIiwidGltZSIsInRvRGF0ZVN0cmluZyIsImlzVGltZSIsImlzV2VlayIsIm1heExlbmd0aE91dHB1dCIsIm1pbkxlbmd0aE91dHB1dCIsInBhdHRlcm5WYWx1ZSIsIm1hdGNoIiwidmFsaWRhdGVFcnJvciIsInZhbGlkYXRpb25SZXN1bHQiLCJhcHBlbmRBdCIsImZpbGxFbXB0eUFycmF5IiwiaW5zZXJ0IiwibW92ZUFycmF5QXQiLCJmcm9tIiwidG8iLCJzcGxpY2UiLCJwcmVwZW5kQXQiLCJyZW1vdmVBdEluZGV4ZXMiLCJpbmRleGVzIiwiaSIsInRlbXAiLCJyZW1vdmVBcnJheUF0Iiwic29ydCIsImEiLCJiIiwic3dhcEFycmF5QXQiLCJpbmRleEEiLCJpbmRleEIiLCJiYXNlR2V0IiwidXBkYXRlUGF0aCIsImlzRW1wdHlBcnJheSIsIm9iaiIsInVuc2V0IiwicGF0aHMiLCJjaGlsZE9iamVjdCIsInVwZGF0ZUF0IiwiZmllbGRWYWx1ZXMiLCJ1c2VGaWVsZEFycmF5Iiwia2V5TmFtZSIsInNldEZpZWxkcyIsIl9nZXRGaWVsZEFycmF5IiwiaWRzIiwiX2ZpZWxkSWRzIiwiX2FjdGlvbmVkIiwiZmllbGRBcnJheU5hbWUiLCJ1cGRhdGVWYWx1ZXMiLCJ1cGRhdGVkRmllbGRBcnJheVZhbHVlcyIsIl91cGRhdGVGaWVsZEFycmF5IiwiYXBwZW5kVmFsdWUiLCJhcmdBIiwicHJlcGVuZCIsInByZXBlbmRWYWx1ZSIsInJlbW92ZSIsImluc2VydCQxIiwiaW5zZXJ0VmFsdWUiLCJhcmdCIiwic3dhcCIsIm1vdmUiLCJ1cGRhdGUiLCJpdGVtIiwiaXNTdWJtaXR0ZWQiLCJyZXNvbHZlciIsIl9leGVjdXRlU2NoZW1hIiwidGhlbiIsImV4aXN0aW5nRXJyb3IiLCJyZVZhbGlkYXRlTW9kZSIsImNyaXRlcmlhTW9kZSIsInVzZU1lbW8iLCJjcmVhdGVTdWJqZWN0IiwiX29ic2VydmVycyIsIm9ic2VydmVyIiwicHVzaCIsIm8iLCJvYnNlcnZlcnMiLCJpc1ByaW1pdGl2ZSIsImRlZXBFcXVhbCIsIm9iamVjdDEiLCJvYmplY3QyIiwiZ2V0VGltZSIsImtleXMxIiwia2V5czIiLCJ2YWwxIiwidmFsMiIsImlzTXVsdGlwbGVTZWxlY3QiLCJsaXZlIiwiaXNDb25uZWN0ZWQiLCJvYmplY3RIYXNGdW5jdGlvbiIsIm1hcmtGaWVsZHNEaXJ0eSIsImlzUGFyZW50Tm9kZUFycmF5IiwiZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyIsImRpcnR5RmllbGRzRnJvbVZhbHVlcyIsImdldERpcnR5RmllbGRzIiwiZ2V0RmllbGRWYWx1ZUFzIiwic2V0VmFsdWVBcyIsIk5hTiIsImdldEZpZWxkVmFsdWUiLCJmaWxlcyIsInNlbGVjdGVkT3B0aW9ucyIsImdldFJlc29sdmVyT3B0aW9ucyIsImdldFJ1bGVWYWx1ZSIsInJ1bGUiLCJzb3VyY2UiLCJoYXNWYWxpZGF0aW9uIiwic2NoZW1hRXJyb3JMb29rdXAiLCJqb2luIiwiZm91bmRFcnJvciIsInBvcCIsInNraXBWYWxpZGF0aW9uIiwidW5zZXRFbXB0eUFycmF5IiwiZGVmYXVsdE9wdGlvbnMiLCJzaG91bGRGb2N1c0Vycm9yIiwiY3JlYXRlRm9ybUNvbnRyb2wiLCJmbHVzaFJvb3RSZW5kZXIiLCJzdWJtaXRDb3VudCIsImlzU3VibWl0dGluZyIsInVuTW91bnQiLCJkZWxheUVycm9yQ2FsbGJhY2siLCJ0aW1lciIsInZhbGlkYXRpb25Nb2RlQmVmb3JlU3VibWl0IiwidmFsaWRhdGlvbk1vZGVBZnRlclN1Ym1pdCIsInNob3VsZERpc3BsYXlBbGxBc3NvY2lhdGVkRXJyb3JzIiwiZGVib3VuY2UiLCJjYWxsYmFjayIsIndhaXQiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0Iiwic2hvdWxkVXBkYXRlVmFsaWQiLCJleGVjdXRlQnVpbHRJblZhbGlkYXRpb24iLCJfdXBkYXRlSXNWYWxpZGF0aW5nIiwiYXJncyIsInNob3VsZFNldFZhbHVlcyIsInNob3VsZFVwZGF0ZUZpZWxkc0FuZFN0YXRlIiwiX2dldERpcnR5IiwidXBkYXRlRXJyb3JzIiwiX3NldEVycm9ycyIsInVwZGF0ZVZhbGlkQW5kVmFsdWUiLCJzaG91bGRTa2lwU2V0VmFsdWVBcyIsImRlZmF1bHRDaGVja2VkIiwic2V0RmllbGRWYWx1ZSIsInVwZGF0ZVRvdWNoQW5kRGlydHkiLCJmaWVsZFZhbHVlIiwic2hvdWxkRGlydHkiLCJzaG91bGRSZW5kZXIiLCJzaG91bGRVcGRhdGVGaWVsZCIsImlzUHJldmlvdXNEaXJ0eSIsIm91dHB1dCIsImRpc2FibGVkRmllbGQiLCJpc0N1cnJlbnRGaWVsZFByaXN0aW5lIiwiaXNQcmV2aW91c0ZpZWxkVG91Y2hlZCIsInNob3VsZFJlbmRlckJ5RXJyb3IiLCJwcmV2aW91c0ZpZWxkRXJyb3IiLCJkZWxheUVycm9yIiwidXBkYXRlZEZvcm1TdGF0ZSIsImNvbnRleHQiLCJleGVjdXRlU2NoZW1hQW5kVXBkYXRlU3RhdGUiLCJzaG91bGRPbmx5Q2hlY2tWYWxpZCIsInZhbGlkIiwiaXNGaWVsZEFycmF5Um9vdCIsImZpZWxkRXJyb3IiLCJnZXRWYWx1ZXMiLCJmaWVsZFJlZmVyZW5jZSIsImZvckVhY2giLCJvcHRpb25SZWYiLCJzZWxlY3RlZCIsImNoZWNrYm94UmVmIiwicmFkaW9SZWYiLCJzaG91bGRUb3VjaCIsInNob3VsZFZhbGlkYXRlIiwidHJpZ2dlciIsInNldFZhbHVlcyIsImZpZWxkS2V5Iiwic2V0VmFsdWUiLCJjbG9uZVZhbHVlIiwiaXNGaWVsZFZhbHVlVXBkYXRlZCIsImdldEN1cnJlbnRGaWVsZFZhbHVlIiwiX3VwZGF0ZUlzRmllbGRWYWx1ZVVwZGF0ZWQiLCJOdW1iZXIiLCJzaG91bGRTa2lwVmFsaWRhdGlvbiIsImRlcHMiLCJ3YXRjaGVkIiwicHJldmlvdXNFcnJvckxvb2t1cFJlc3VsdCIsImVycm9yTG9va3VwUmVzdWx0IiwiX2ZvY3VzSW5wdXQiLCJmaWVsZE5hbWVzIiwiUHJvbWlzZSIsImdldEZpZWxkU3RhdGUiLCJjbGVhckVycm9ycyIsImlucHV0TmFtZSIsInBheWxvYWQiLCJkZWxldGUiLCJrZWVwVmFsdWUiLCJrZWVwRXJyb3IiLCJrZWVwRGlydHkiLCJrZWVwVG91Y2hlZCIsImtlZXBEZWZhdWx0VmFsdWUiLCJrZWVwSXNWYWxpZCIsImRpc2FibGVkSXNEZWZpbmVkIiwicHJvZ3Jlc3NpdmUiLCJmaWVsZFJlZiIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJyYWRpb09yQ2hlY2tib3giLCJfZm9jdXNFcnJvciIsIl9kaXNhYmxlRm9ybSIsInJlcXVpcmVkRGlzYWJsZWRTdGF0ZSIsIm9uVmFsaWQiLCJvbkludmFsaWQiLCJlIiwib25WYWxpZEVycm9yIiwicHJldmVudERlZmF1bHQiLCJwZXJzaXN0IiwicmVzZXRGaWVsZCIsIl9yZXNldCIsImtlZXBTdGF0ZU9wdGlvbnMiLCJ1cGRhdGVkVmFsdWVzIiwiY2xvbmVVcGRhdGVkVmFsdWVzIiwia2VlcERlZmF1bHRWYWx1ZXMiLCJrZWVwVmFsdWVzIiwia2VlcERpcnR5VmFsdWVzIiwiZm9ybSIsImNsb3Nlc3QiLCJyZXNldCIsImtlZXBTdWJtaXRDb3VudCIsImtlZXBJc1N1Ym1pdHRlZCIsImtlZXBFcnJvcnMiLCJrZWVwSXNTdWJtaXRTdWNjZXNzZnVsIiwic2V0Rm9jdXMiLCJzaG91bGRTZWxlY3QiLCJfcmVzZXREZWZhdWx0VmFsdWVzIiwicmVzZXRPcHRpb25zIiwidXNlRm9ybSIsIl9mb3JtQ29udHJvbCIsIl92YWx1ZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/react-hook-form/dist/index.esm.mjs\n"); /***/ }) }; ;