"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/zod"; exports.ids = ["vendor-chunks/zod"]; exports.modules = { /***/ "(ssr)/./node_modules/zod/lib/index.mjs": /*!****************************************!*\ !*** ./node_modules/zod/lib/index.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 */ BRAND: () => (/* binding */ BRAND),\n/* harmony export */ DIRTY: () => (/* binding */ DIRTY),\n/* harmony export */ EMPTY_PATH: () => (/* binding */ EMPTY_PATH),\n/* harmony export */ INVALID: () => (/* binding */ INVALID),\n/* harmony export */ NEVER: () => (/* binding */ NEVER),\n/* harmony export */ OK: () => (/* binding */ OK),\n/* harmony export */ ParseStatus: () => (/* binding */ ParseStatus),\n/* harmony export */ Schema: () => (/* binding */ ZodType),\n/* harmony export */ ZodAny: () => (/* binding */ ZodAny),\n/* harmony export */ ZodArray: () => (/* binding */ ZodArray),\n/* harmony export */ ZodBigInt: () => (/* binding */ ZodBigInt),\n/* harmony export */ ZodBoolean: () => (/* binding */ ZodBoolean),\n/* harmony export */ ZodBranded: () => (/* binding */ ZodBranded),\n/* harmony export */ ZodCatch: () => (/* binding */ ZodCatch),\n/* harmony export */ ZodDate: () => (/* binding */ ZodDate),\n/* harmony export */ ZodDefault: () => (/* binding */ ZodDefault),\n/* harmony export */ ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion),\n/* harmony export */ ZodEffects: () => (/* binding */ ZodEffects),\n/* harmony export */ ZodEnum: () => (/* binding */ ZodEnum),\n/* harmony export */ ZodError: () => (/* binding */ ZodError),\n/* harmony export */ ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind),\n/* harmony export */ ZodFunction: () => (/* binding */ ZodFunction),\n/* harmony export */ ZodIntersection: () => (/* binding */ ZodIntersection),\n/* harmony export */ ZodIssueCode: () => (/* binding */ ZodIssueCode),\n/* harmony export */ ZodLazy: () => (/* binding */ ZodLazy),\n/* harmony export */ ZodLiteral: () => (/* binding */ ZodLiteral),\n/* harmony export */ ZodMap: () => (/* binding */ ZodMap),\n/* harmony export */ ZodNaN: () => (/* binding */ ZodNaN),\n/* harmony export */ ZodNativeEnum: () => (/* binding */ ZodNativeEnum),\n/* harmony export */ ZodNever: () => (/* binding */ ZodNever),\n/* harmony export */ ZodNull: () => (/* binding */ ZodNull),\n/* harmony export */ ZodNullable: () => (/* binding */ ZodNullable),\n/* harmony export */ ZodNumber: () => (/* binding */ ZodNumber),\n/* harmony export */ ZodObject: () => (/* binding */ ZodObject),\n/* harmony export */ ZodOptional: () => (/* binding */ ZodOptional),\n/* harmony export */ ZodParsedType: () => (/* binding */ ZodParsedType),\n/* harmony export */ ZodPipeline: () => (/* binding */ ZodPipeline),\n/* harmony export */ ZodPromise: () => (/* binding */ ZodPromise),\n/* harmony export */ ZodReadonly: () => (/* binding */ ZodReadonly),\n/* harmony export */ ZodRecord: () => (/* binding */ ZodRecord),\n/* harmony export */ ZodSchema: () => (/* binding */ ZodType),\n/* harmony export */ ZodSet: () => (/* binding */ ZodSet),\n/* harmony export */ ZodString: () => (/* binding */ ZodString),\n/* harmony export */ ZodSymbol: () => (/* binding */ ZodSymbol),\n/* harmony export */ ZodTransformer: () => (/* binding */ ZodEffects),\n/* harmony export */ ZodTuple: () => (/* binding */ ZodTuple),\n/* harmony export */ ZodType: () => (/* binding */ ZodType),\n/* harmony export */ ZodUndefined: () => (/* binding */ ZodUndefined),\n/* harmony export */ ZodUnion: () => (/* binding */ ZodUnion),\n/* harmony export */ ZodUnknown: () => (/* binding */ ZodUnknown),\n/* harmony export */ ZodVoid: () => (/* binding */ ZodVoid),\n/* harmony export */ addIssueToContext: () => (/* binding */ addIssueToContext),\n/* harmony export */ any: () => (/* binding */ anyType),\n/* harmony export */ array: () => (/* binding */ arrayType),\n/* harmony export */ bigint: () => (/* binding */ bigIntType),\n/* harmony export */ boolean: () => (/* binding */ booleanType),\n/* harmony export */ coerce: () => (/* binding */ coerce),\n/* harmony export */ custom: () => (/* binding */ custom),\n/* harmony export */ date: () => (/* binding */ dateType),\n/* harmony export */ \"default\": () => (/* binding */ z),\n/* harmony export */ defaultErrorMap: () => (/* binding */ errorMap),\n/* harmony export */ discriminatedUnion: () => (/* binding */ discriminatedUnionType),\n/* harmony export */ effect: () => (/* binding */ effectsType),\n/* harmony export */ \"enum\": () => (/* binding */ enumType),\n/* harmony export */ \"function\": () => (/* binding */ functionType),\n/* harmony export */ getErrorMap: () => (/* binding */ getErrorMap),\n/* harmony export */ getParsedType: () => (/* binding */ getParsedType),\n/* harmony export */ \"instanceof\": () => (/* binding */ instanceOfType),\n/* harmony export */ intersection: () => (/* binding */ intersectionType),\n/* harmony export */ isAborted: () => (/* binding */ isAborted),\n/* harmony export */ isAsync: () => (/* binding */ isAsync),\n/* harmony export */ isDirty: () => (/* binding */ isDirty),\n/* harmony export */ isValid: () => (/* binding */ isValid),\n/* harmony export */ late: () => (/* binding */ late),\n/* harmony export */ lazy: () => (/* binding */ lazyType),\n/* harmony export */ literal: () => (/* binding */ literalType),\n/* harmony export */ makeIssue: () => (/* binding */ makeIssue),\n/* harmony export */ map: () => (/* binding */ mapType),\n/* harmony export */ nan: () => (/* binding */ nanType),\n/* harmony export */ nativeEnum: () => (/* binding */ nativeEnumType),\n/* harmony export */ never: () => (/* binding */ neverType),\n/* harmony export */ \"null\": () => (/* binding */ nullType),\n/* harmony export */ nullable: () => (/* binding */ nullableType),\n/* harmony export */ number: () => (/* binding */ numberType),\n/* harmony export */ object: () => (/* binding */ objectType),\n/* harmony export */ objectUtil: () => (/* binding */ objectUtil),\n/* harmony export */ oboolean: () => (/* binding */ oboolean),\n/* harmony export */ onumber: () => (/* binding */ onumber),\n/* harmony export */ optional: () => (/* binding */ optionalType),\n/* harmony export */ ostring: () => (/* binding */ ostring),\n/* harmony export */ pipeline: () => (/* binding */ pipelineType),\n/* harmony export */ preprocess: () => (/* binding */ preprocessType),\n/* harmony export */ promise: () => (/* binding */ promiseType),\n/* harmony export */ quotelessJson: () => (/* binding */ quotelessJson),\n/* harmony export */ record: () => (/* binding */ recordType),\n/* harmony export */ set: () => (/* binding */ setType),\n/* harmony export */ setErrorMap: () => (/* binding */ setErrorMap),\n/* harmony export */ strictObject: () => (/* binding */ strictObjectType),\n/* harmony export */ string: () => (/* binding */ stringType),\n/* harmony export */ symbol: () => (/* binding */ symbolType),\n/* harmony export */ transformer: () => (/* binding */ effectsType),\n/* harmony export */ tuple: () => (/* binding */ tupleType),\n/* harmony export */ undefined: () => (/* binding */ undefinedType),\n/* harmony export */ union: () => (/* binding */ unionType),\n/* harmony export */ unknown: () => (/* binding */ unknownType),\n/* harmony export */ util: () => (/* binding */ util),\n/* harmony export */ \"void\": () => (/* binding */ voidType),\n/* harmony export */ z: () => (/* binding */ z)\n/* harmony export */ });\nvar util;\n(function(util) {\n util.assertEqual = (val)=>val;\n function assertIs(_arg) {}\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items)=>{\n const obj = {};\n for (const item of items){\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj)=>{\n const validKeys = util.objectKeys(obj).filter((k)=>typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys){\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj)=>{\n return util.objectKeys(obj).map(function(e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj)=>Object.keys(obj) // eslint-disable-line ban/ban\n : (object)=>{\n const keys = [];\n for(const key in object){\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker)=>{\n for (const item of arr){\n if (checker(item)) return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\" ? (val)=>Number.isInteger(val) // eslint-disable-line ban/ban\n : (val)=>typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val)=>typeof val === \"string\" ? `'${val}'` : val).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value)=>{\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function(objectUtil) {\n objectUtil.mergeShapes = (first, second)=>{\n return {\n ...first,\n ...second\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\"\n]);\nconst getParsedType = (data)=>{\n const t = typeof data;\n switch(t){\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\"\n]);\nconst quotelessJson = (obj)=>{\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n constructor(issues){\n super();\n this.issues = [];\n this.addIssue = (sub)=>{\n this.issues = [\n ...this.issues,\n sub\n ];\n };\n this.addIssues = (subs = [])=>{\n this.issues = [\n ...this.issues,\n ...subs\n ];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n } else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n get errors() {\n return this.issues;\n }\n format(_mapper) {\n const mapper = _mapper || function(issue) {\n return issue.message;\n };\n const fieldErrors = {\n _errors: []\n };\n const processError = (error)=>{\n for (const issue of error.issues){\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n } else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n } else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n } else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n } else {\n let curr = fieldErrors;\n let i = 0;\n while(i < issue.path.length){\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || {\n _errors: []\n };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n } else {\n curr[el] = curr[el] || {\n _errors: []\n };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue)=>issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues){\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n } else {\n formErrors.push(mapper(sub));\n }\n }\n return {\n formErrors,\n fieldErrors\n };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues)=>{\n const error = new ZodError(issues);\n return error;\n};\nconst errorMap = (issue, _ctx)=>{\n let message;\n switch(issue.code){\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n } else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n } else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n } else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n } else {\n util.assertNever(issue.validation);\n }\n } else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n } else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\") message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\") message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\") message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\") message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\") message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\") message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\") message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\") message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\") message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return {\n message\n };\n};\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\nconst makeIssue = (params)=>{\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [\n ...path,\n ...issueData.path || []\n ];\n const fullIssue = {\n ...issueData,\n path: fullPath\n };\n let errorMessage = \"\";\n const maps = errorMaps.filter((m)=>!!m).slice().reverse();\n for (const map of maps){\n errorMessage = map(fullIssue, {\n data,\n defaultError: errorMessage\n }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message || errorMessage\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap\n ].filter((x)=>!!x)\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor(){\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\") this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\") this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results){\n if (s.status === \"aborted\") return INVALID;\n if (s.status === \"dirty\") status.dirty();\n arrayValue.push(s.value);\n }\n return {\n status: status.value,\n value: arrayValue\n };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs){\n syncPairs.push({\n key: await pair.key,\n value: await pair.value\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs){\n const { key, value } = pair;\n if (key.status === \"aborted\") return INVALID;\n if (value.status === \"aborted\") return INVALID;\n if (key.status === \"dirty\") status.dirty();\n if (value.status === \"dirty\") status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return {\n status: status.value,\n value: finalObject\n };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\"\n});\nconst DIRTY = (value)=>({\n status: \"dirty\",\n value\n });\nconst OK = (value)=>({\n status: \"valid\",\n value\n });\nconst isAborted = (x)=>x.status === \"aborted\";\nconst isDirty = (x)=>x.status === \"dirty\";\nconst isValid = (x)=>x.status === \"valid\";\nconst isAsync = (x)=>typeof Promise !== \"undefined\" && x instanceof Promise;\nvar errorUtil;\n(function(errorUtil) {\n errorUtil.errToObj = (message)=>typeof message === \"string\" ? {\n message\n } : message || {};\n errorUtil.toString = (message)=>typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\nclass ParseInputLazyPath {\n constructor(parent, value, path, key){\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n } else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result)=>{\n if (isValid(result)) {\n return {\n success: true,\n data: result.value\n };\n } else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error () {\n if (this._error) return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n }\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params) return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap) return {\n errorMap: errorMap,\n description\n };\n const customMap = (iss, ctx)=>{\n if (iss.code !== \"invalid_type\") return {\n message: ctx.defaultError\n };\n if (typeof ctx.data === \"undefined\") {\n return {\n message: required_error !== null && required_error !== void 0 ? required_error : ctx.defaultError\n };\n }\n return {\n message: invalid_type_error !== null && invalid_type_error !== void 0 ? invalid_type_error : ctx.defaultError\n };\n };\n return {\n errorMap: customMap,\n description\n };\n}\nclass ZodType {\n constructor(def){\n /** Alias of safeParseAsync */ this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n }\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent\n };\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent\n }\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success) return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n const result = this._parseSync({\n data,\n path: ctx.path,\n parent: ctx\n });\n return handleResult(ctx, result);\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success) return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n const maybeAsyncResult = this._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val)=>{\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return {\n message\n };\n } else if (typeof message === \"function\") {\n return message(val);\n } else {\n return message;\n }\n };\n return this._refinement((val, ctx)=>{\n const result = check(val);\n const setError = ()=>ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val)\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data)=>{\n if (!data) {\n setError();\n return false;\n } else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n } else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx)=>{\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n } else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: {\n type: \"refinement\",\n refinement\n }\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this, this._def);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([\n this,\n option\n ], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: {\n type: \"transform\",\n transform\n }\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : ()=>def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def)\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : ()=>def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[a-z][a-z0-9]*$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_+-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\nconst ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/;\nconst ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\n// Adapted from https://stackoverflow.com/a/3143231\nconst datetimeRegex = (args)=>{\n if (args.precision) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n } else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}Z$`);\n }\n } else if (args.precision === 0) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n } else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}Z$`);\n }\n } else {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n } else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?Z$`);\n }\n }\n};\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks){\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message\n });\n } else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message\n });\n }\n status.dirty();\n }\n } else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n } catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n } else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: {\n includes: check.value,\n position: check.position\n },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n } else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n } else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: {\n startsWith: check.value\n },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: {\n endsWith: check.value\n },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: input.data\n };\n }\n _regex(regex, validation, message) {\n return this.refinement((data)=>regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message)\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n email(message) {\n return this._addCheck({\n kind: \"email\",\n ...errorUtil.errToObj(message)\n });\n }\n url(message) {\n return this._addCheck({\n kind: \"url\",\n ...errorUtil.errToObj(message)\n });\n }\n emoji(message) {\n return this._addCheck({\n kind: \"emoji\",\n ...errorUtil.errToObj(message)\n });\n }\n uuid(message) {\n return this._addCheck({\n kind: \"uuid\",\n ...errorUtil.errToObj(message)\n });\n }\n cuid(message) {\n return this._addCheck({\n kind: \"cuid\",\n ...errorUtil.errToObj(message)\n });\n }\n cuid2(message) {\n return this._addCheck({\n kind: \"cuid2\",\n ...errorUtil.errToObj(message)\n });\n }\n ulid(message) {\n return this._addCheck({\n kind: \"ulid\",\n ...errorUtil.errToObj(message)\n });\n }\n ip(options) {\n return this._addCheck({\n kind: \"ip\",\n ...errorUtil.errToObj(options)\n });\n }\n datetime(options) {\n var _a;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n message: options\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message)\n });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message)\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message)\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message)\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message)\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message)\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message)\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message)\n });\n }\n /**\n * @deprecated Use z.string().min(1) instead.\n * @see {@link ZodString.min}\n */ nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: \"trim\"\n }\n ]\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: \"toLowerCase\"\n }\n ]\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: \"toUpperCase\"\n }\n ]\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch)=>ch.kind === \"datetime\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch)=>ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch)=>ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch)=>ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch)=>ch.kind === \"uuid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch)=>ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch)=>ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch)=>ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch)=>ch.kind === \"ip\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params)=>{\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params)\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return valInt % stepInt / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor(){\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks){\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: input.data\n };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message)\n }\n ]\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message)\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message)\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message)\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message)\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message)\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch)=>ch.kind === \"int\" || ch.kind === \"multipleOf\" && util.isInteger(ch.value));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n } else if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n } else if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params)=>{\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params)\n });\n};\nclass ZodBigInt extends ZodType {\n constructor(){\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = BigInt(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks){\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: input.data\n };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message)\n }\n ]\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message)\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params)=>{\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params)\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params)=>{\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params)\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks){\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\"\n });\n status.dirty();\n }\n } else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\"\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime())\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [\n ...this._def.checks,\n check\n ]\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message)\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message)\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks){\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params)=>{\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params)\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params)=>{\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params)\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params)=>{\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params)\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params)=>{\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params)\n });\n};\nclass ZodAny extends ZodType {\n constructor(){\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params)=>{\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params)\n });\n};\nclass ZodUnknown extends ZodType {\n constructor(){\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params)=>{\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params)\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType\n });\n return INVALID;\n }\n}\nZodNever.create = (params)=>{\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params)\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params)=>{\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params)\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: tooSmall ? def.exactLength.value : undefined,\n maximum: tooBig ? def.exactLength.value : undefined,\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([\n ...ctx.data\n ].map((item, i)=>{\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result)=>{\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [\n ...ctx.data\n ].map((item, i)=>{\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: {\n value: minLength,\n message: errorUtil.toString(message)\n }\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: {\n value: maxLength,\n message: errorUtil.toString(message)\n }\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: {\n value: len,\n message: errorUtil.toString(message)\n }\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params)=>{\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params)\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for(const key in schema.shape){\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: ()=>newShape\n });\n } else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element)\n });\n } else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n } else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n } else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item)=>deepPartialify(item)));\n } else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor(){\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */ this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */ this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null) return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return this._cached = {\n shape,\n keys\n };\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for(const key in ctx.data){\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys){\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: {\n status: \"valid\",\n value: key\n },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys){\n pairs.push({\n key: {\n status: \"valid\",\n value: key\n },\n value: {\n status: \"valid\",\n value: ctx.data[key]\n }\n });\n }\n } else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys\n });\n status.dirty();\n }\n } else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n } else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys){\n const value = ctx.data[key];\n pairs.push({\n key: {\n status: \"valid\",\n value: key\n },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve().then(async ()=>{\n const syncPairs = [];\n for (const pair of pairs){\n const key = await pair.key;\n syncPairs.push({\n key,\n value: await pair.value,\n alwaysSet: pair.alwaysSet\n });\n }\n return syncPairs;\n }).then((syncPairs)=>{\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n } else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...message !== undefined ? {\n errorMap: (issue, ctx)=>{\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\") return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError\n };\n return {\n message: defaultError\n };\n }\n } : {}\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\"\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\"\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: ()=>({\n ...this._def.shape(),\n ...augmentation\n })\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */ merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: ()=>({\n ...this._def.shape(),\n ...merging._def.shape()\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({\n [key]: schema\n });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key)=>{\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>shape\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key)=>{\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>shape\n });\n }\n /**\n * @deprecated\n */ deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key)=>{\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n } else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>newShape\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key)=>{\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n } else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while(newField instanceof ZodOptional){\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: ()=>newShape\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params)=>{\n return new ZodObject({\n shape: ()=>shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n};\nZodObject.strictCreate = (shape, params)=>{\n return new ZodObject({\n shape: ()=>shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n};\nZodObject.lazycreate = (shape, params)=>{\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results){\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results){\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result)=>new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option)=>{\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n },\n parent: null\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx\n }),\n ctx: childCtx\n };\n })).then(handleResults);\n } else {\n let dirty = undefined;\n const issues = [];\n for (const option of options){\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n },\n parent: null\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx\n });\n if (result.status === \"valid\") {\n return result;\n } else if (result.status === \"dirty\" && !dirty) {\n dirty = {\n result,\n ctx: childCtx\n };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues)=>new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params)=>{\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params)\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type)=>{\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n } else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n } else if (type instanceof ZodLiteral) {\n return [\n type.value\n ];\n } else if (type instanceof ZodEnum) {\n return type.options;\n } else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return Object.keys(type.enum);\n } else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n } else if (type instanceof ZodUndefined) {\n return [\n undefined\n ];\n } else if (type instanceof ZodNull) {\n return [\n null\n ];\n } else {\n return null;\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [\n discriminator\n ]\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n } else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */ static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options){\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues){\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params)\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return {\n valid: true,\n data: a\n };\n } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key)=>bKeys.indexOf(key) !== -1);\n const newObj = {\n ...a,\n ...b\n };\n for (const key of sharedKeys){\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return {\n valid: false\n };\n }\n newObj[key] = sharedValue.data;\n }\n return {\n valid: true,\n data: newObj\n };\n } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return {\n valid: false\n };\n }\n const newArray = [];\n for(let index = 0; index < a.length; index++){\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return {\n valid: false\n };\n }\n newArray.push(sharedValue.data);\n }\n return {\n valid: true,\n data: newArray\n };\n } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return {\n valid: true,\n data: a\n };\n } else {\n return {\n valid: false\n };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight)=>{\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return {\n status: status.value,\n value: merged.data\n };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n })\n ]).then(([left, right])=>handleParsed(left, right));\n } else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params)=>{\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params)\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\"\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\"\n });\n status.dirty();\n }\n const items = [\n ...ctx.data\n ].map((item, itemIndex)=>{\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema) return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n }).filter((x)=>!!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results)=>{\n return ParseStatus.mergeArray(status, results);\n });\n } else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest\n });\n }\n}\nZodTuple.create = (schemas, params)=>{\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params)\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for(const key in ctx.data){\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key))\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n } else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third)\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second)\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [\n ...ctx.data.entries()\n ].map(([key, value], index)=>{\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [\n index,\n \"key\"\n ])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [\n index,\n \"value\"\n ]))\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async ()=>{\n for (const pair of pairs){\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return {\n status: status.value,\n value: finalMap\n };\n });\n } else {\n const finalMap = new Map();\n for (const pair of pairs){\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return {\n status: status.value,\n value: finalMap\n };\n }\n }\n}\nZodMap.create = (keyType, valueType, params)=>{\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params)\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements){\n if (element.status === \"aborted\") return INVALID;\n if (element.status === \"dirty\") status.dirty();\n parsedSet.add(element.value);\n }\n return {\n status: status.value,\n value: parsedSet\n };\n }\n const elements = [\n ...ctx.data.values()\n ].map((item, i)=>valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements)=>finalizeSet(elements));\n } else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: {\n value: minSize,\n message: errorUtil.toString(message)\n }\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: {\n value: maxSize,\n message: errorUtil.toString(message)\n }\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params)=>{\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params)\n });\n};\nclass ZodFunction extends ZodType {\n constructor(){\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap\n ].filter((x)=>!!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error\n }\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap\n ].filter((x)=>!!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error\n }\n });\n }\n const params = {\n errorMap: ctx.common.contextualErrorMap\n };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function(...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e)=>{\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e)=>{\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n } else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function(...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([\n makeArgsIssue(args, parsedArgs.error)\n ]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([\n makeReturnsIssue(result, parsedReturns.error)\n ]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create())\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params)\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n }\n}\nZodLazy.create = (getter, params)=>{\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params)\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value\n });\n return INVALID;\n }\n return {\n status: \"valid\",\n value: input.data\n };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params)=>{\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params)\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params)\n });\n}\nclass ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type\n });\n return INVALID;\n }\n if (this._def.values.indexOf(input.data) === -1) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values){\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values){\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values){\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values) {\n return ZodEnum.create(values);\n }\n exclude(values) {\n return ZodEnum.create(this.options.filter((opt)=>!values.includes(opt)));\n }\n}\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type\n });\n return INVALID;\n }\n if (nativeEnumValues.indexOf(input.data) === -1) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params)=>{\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params)\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data)=>{\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap\n });\n }));\n }\n}\nZodPromise.create = (schema, params)=>{\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params)\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg)=>{\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n } else {\n status.dirty();\n }\n },\n get path () {\n return ctx.path;\n }\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.issues.length) {\n return {\n status: \"dirty\",\n value: ctx.data\n };\n }\n if (ctx.common.async) {\n return Promise.resolve(processed).then((processed)=>{\n return this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx\n });\n });\n } else {\n return this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx\n });\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc)=>{\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inner.status === \"aborted\") return INVALID;\n if (inner.status === \"dirty\") status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return {\n status: status.value,\n value: inner.value\n };\n } else {\n return this._def.schema._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }).then((inner)=>{\n if (inner.status === \"aborted\") return INVALID;\n if (inner.status === \"dirty\") status.dirty();\n return executeRefinement(inner.value).then(()=>{\n return {\n status: status.value,\n value: inner.value\n };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (!isValid(base)) return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return {\n status: status.value,\n value: result\n };\n } else {\n return this._def.schema._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }).then((base)=>{\n if (!isValid(base)) return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result)=>({\n status: status.value,\n value: result\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params)=>{\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params)\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params)=>{\n return new ZodEffects({\n schema,\n effect: {\n type: \"preprocess\",\n transform: preprocess\n },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params)\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params)=>{\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params)\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params)=>{\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params)\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params)=>{\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : ()=>params.default,\n ...processCreateParams(params)\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n }\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx\n }\n });\n if (isAsync(result)) {\n return result.then((result)=>{\n return {\n status: \"valid\",\n value: result.status === \"valid\" ? result.value : this._def.catchValue({\n get error () {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data\n })\n };\n });\n } else {\n return {\n status: \"valid\",\n value: result.status === \"valid\" ? result.value : this._def.catchValue({\n get error () {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data\n })\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params)=>{\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : ()=>params.catch,\n ...processCreateParams(params)\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return {\n status: \"valid\",\n value: input.data\n };\n }\n}\nZodNaN.create = (params)=>{\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params)\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async ()=>{\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inResult.status === \"aborted\") return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n } else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx\n });\n }\n };\n return handleAsync();\n } else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inResult.status === \"aborted\") return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value\n };\n } else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n if (isValid(result)) {\n result.value = Object.freeze(result.value);\n }\n return result;\n }\n}\nZodReadonly.create = (type, params)=>{\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params)\n });\n};\nconst custom = (check, params = {}, /**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */ fatal)=>{\n if (check) return ZodAny.create().superRefine((data, ctx)=>{\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? {\n message: params\n } : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? {\n message: p\n } : p;\n ctx.addIssue({\n code: \"custom\",\n ...p2,\n fatal: _fatal\n });\n }\n });\n return ZodAny.create();\n};\nconst late = {\n object: ZodObject.lazycreate\n};\nvar ZodFirstPartyTypeKind;\n(function(ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`\n})=>custom((data)=>data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = ()=>stringType().optional();\nconst onumber = ()=>numberType().optional();\nconst oboolean = ()=>booleanType().optional();\nconst coerce = {\n string: (arg)=>ZodString.create({\n ...arg,\n coerce: true\n }),\n number: (arg)=>ZodNumber.create({\n ...arg,\n coerce: true\n }),\n boolean: (arg)=>ZodBoolean.create({\n ...arg,\n coerce: true\n }),\n bigint: (arg)=>ZodBigInt.create({\n ...arg,\n coerce: true\n }),\n date: (arg)=>ZodDate.create({\n ...arg,\n coerce: true\n })\n};\nconst NEVER = INVALID;\nvar z = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () {\n return util;\n },\n get objectUtil () {\n return objectUtil;\n },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () {\n return ZodFirstPartyTypeKind;\n },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n \"enum\": enumType,\n \"function\": functionType,\n \"instanceof\": instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n \"null\": nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n \"undefined\": undefinedType,\n union: unionType,\n unknown: unknownType,\n \"void\": voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUE7QUFDSCxVQUFVQSxJQUFJO0lBQ1hBLEtBQUtDLFdBQVcsR0FBRyxDQUFDQyxNQUFRQTtJQUM1QixTQUFTQyxTQUFTQyxJQUFJLEdBQUk7SUFDMUJKLEtBQUtHLFFBQVEsR0FBR0E7SUFDaEIsU0FBU0UsWUFBWUMsRUFBRTtRQUNuQixNQUFNLElBQUlDO0lBQ2Q7SUFDQVAsS0FBS0ssV0FBVyxHQUFHQTtJQUNuQkwsS0FBS1EsV0FBVyxHQUFHLENBQUNDO1FBQ2hCLE1BQU1DLE1BQU0sQ0FBQztRQUNiLEtBQUssTUFBTUMsUUFBUUYsTUFBTztZQUN0QkMsR0FBRyxDQUFDQyxLQUFLLEdBQUdBO1FBQ2hCO1FBQ0EsT0FBT0Q7SUFDWDtJQUNBVixLQUFLWSxrQkFBa0IsR0FBRyxDQUFDRjtRQUN2QixNQUFNRyxZQUFZYixLQUFLYyxVQUFVLENBQUNKLEtBQUtLLE1BQU0sQ0FBQyxDQUFDQyxJQUFNLE9BQU9OLEdBQUcsQ0FBQ0EsR0FBRyxDQUFDTSxFQUFFLENBQUMsS0FBSztRQUM1RSxNQUFNQyxXQUFXLENBQUM7UUFDbEIsS0FBSyxNQUFNRCxLQUFLSCxVQUFXO1lBQ3ZCSSxRQUFRLENBQUNELEVBQUUsR0FBR04sR0FBRyxDQUFDTSxFQUFFO1FBQ3hCO1FBQ0EsT0FBT2hCLEtBQUtrQixZQUFZLENBQUNEO0lBQzdCO0lBQ0FqQixLQUFLa0IsWUFBWSxHQUFHLENBQUNSO1FBQ2pCLE9BQU9WLEtBQUtjLFVBQVUsQ0FBQ0osS0FBS1MsR0FBRyxDQUFDLFNBQVVDLENBQUM7WUFDdkMsT0FBT1YsR0FBRyxDQUFDVSxFQUFFO1FBQ2pCO0lBQ0o7SUFDQXBCLEtBQUtjLFVBQVUsR0FBRyxPQUFPTyxPQUFPQyxJQUFJLEtBQUssV0FBVyw4QkFBOEI7T0FDNUUsQ0FBQ1osTUFBUVcsT0FBT0MsSUFBSSxDQUFDWixLQUFLLDhCQUE4QjtPQUN4RCxDQUFDYTtRQUNDLE1BQU1ELE9BQU8sRUFBRTtRQUNmLElBQUssTUFBTUUsT0FBT0QsT0FBUTtZQUN0QixJQUFJRixPQUFPSSxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDSixRQUFRQyxNQUFNO2dCQUNuREYsS0FBS00sSUFBSSxDQUFDSjtZQUNkO1FBQ0o7UUFDQSxPQUFPRjtJQUNYO0lBQ0p0QixLQUFLNkIsSUFBSSxHQUFHLENBQUNDLEtBQUtDO1FBQ2QsS0FBSyxNQUFNcEIsUUFBUW1CLElBQUs7WUFDcEIsSUFBSUMsUUFBUXBCLE9BQ1IsT0FBT0E7UUFDZjtRQUNBLE9BQU9xQjtJQUNYO0lBQ0FoQyxLQUFLaUMsU0FBUyxHQUFHLE9BQU9DLE9BQU9ELFNBQVMsS0FBSyxhQUN2QyxDQUFDL0IsTUFBUWdDLE9BQU9ELFNBQVMsQ0FBQy9CLEtBQUssOEJBQThCO09BQzdELENBQUNBLE1BQVEsT0FBT0EsUUFBUSxZQUFZaUMsU0FBU2pDLFFBQVFrQyxLQUFLQyxLQUFLLENBQUNuQyxTQUFTQTtJQUMvRSxTQUFTb0MsV0FBV0MsS0FBSyxFQUFFQyxZQUFZLEtBQUs7UUFDeEMsT0FBT0QsTUFDRnBCLEdBQUcsQ0FBQyxDQUFDakIsTUFBUyxPQUFPQSxRQUFRLFdBQVcsQ0FBQyxDQUFDLEVBQUVBLElBQUksQ0FBQyxDQUFDLEdBQUdBLEtBQ3JEdUMsSUFBSSxDQUFDRDtJQUNkO0lBQ0F4QyxLQUFLc0MsVUFBVSxHQUFHQTtJQUNsQnRDLEtBQUswQyxxQkFBcUIsR0FBRyxDQUFDQyxHQUFHQztRQUM3QixJQUFJLE9BQU9BLFVBQVUsVUFBVTtZQUMzQixPQUFPQSxNQUFNQyxRQUFRO1FBQ3pCO1FBQ0EsT0FBT0Q7SUFDWDtBQUNKLEdBQUc1QyxRQUFTQSxDQUFBQSxPQUFPLENBQUM7QUFDcEIsSUFBSThDO0FBQ0gsVUFBVUEsVUFBVTtJQUNqQkEsV0FBV0MsV0FBVyxHQUFHLENBQUNDLE9BQU9DO1FBQzdCLE9BQU87WUFDSCxHQUFHRCxLQUFLO1lBQ1IsR0FBR0MsTUFBTTtRQUNiO0lBQ0o7QUFDSixHQUFHSCxjQUFlQSxDQUFBQSxhQUFhLENBQUM7QUFDaEMsTUFBTUksZ0JBQWdCbEQsS0FBS1EsV0FBVyxDQUFDO0lBQ25DO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDSDtBQUNELE1BQU0yQyxnQkFBZ0IsQ0FBQ0M7SUFDbkIsTUFBTUMsSUFBSSxPQUFPRDtJQUNqQixPQUFRQztRQUNKLEtBQUs7WUFDRCxPQUFPSCxjQUFjbEIsU0FBUztRQUNsQyxLQUFLO1lBQ0QsT0FBT2tCLGNBQWNJLE1BQU07UUFDL0IsS0FBSztZQUNELE9BQU9DLE1BQU1ILFFBQVFGLGNBQWNNLEdBQUcsR0FBR04sY0FBY08sTUFBTTtRQUNqRSxLQUFLO1lBQ0QsT0FBT1AsY0FBY1EsT0FBTztRQUNoQyxLQUFLO1lBQ0QsT0FBT1IsY0FBY1MsUUFBUTtRQUNqQyxLQUFLO1lBQ0QsT0FBT1QsY0FBY1UsTUFBTTtRQUMvQixLQUFLO1lBQ0QsT0FBT1YsY0FBY1csTUFBTTtRQUMvQixLQUFLO1lBQ0QsSUFBSUMsTUFBTUMsT0FBTyxDQUFDWCxPQUFPO2dCQUNyQixPQUFPRixjQUFjWCxLQUFLO1lBQzlCO1lBQ0EsSUFBSWEsU0FBUyxNQUFNO2dCQUNmLE9BQU9GLGNBQWNjLElBQUk7WUFDN0I7WUFDQSxJQUFJWixLQUFLYSxJQUFJLElBQ1QsT0FBT2IsS0FBS2EsSUFBSSxLQUFLLGNBQ3JCYixLQUFLYyxLQUFLLElBQ1YsT0FBT2QsS0FBS2MsS0FBSyxLQUFLLFlBQVk7Z0JBQ2xDLE9BQU9oQixjQUFjaUIsT0FBTztZQUNoQztZQUNBLElBQUksT0FBT0MsUUFBUSxlQUFlaEIsZ0JBQWdCZ0IsS0FBSztnQkFDbkQsT0FBT2xCLGNBQWMvQixHQUFHO1lBQzVCO1lBQ0EsSUFBSSxPQUFPa0QsUUFBUSxlQUFlakIsZ0JBQWdCaUIsS0FBSztnQkFDbkQsT0FBT25CLGNBQWNvQixHQUFHO1lBQzVCO1lBQ0EsSUFBSSxPQUFPQyxTQUFTLGVBQWVuQixnQkFBZ0JtQixNQUFNO2dCQUNyRCxPQUFPckIsY0FBY3NCLElBQUk7WUFDN0I7WUFDQSxPQUFPdEIsY0FBYzNCLE1BQU07UUFDL0I7WUFDSSxPQUFPMkIsY0FBY3VCLE9BQU87SUFDcEM7QUFDSjtBQUVBLE1BQU1DLGVBQWUxRSxLQUFLUSxXQUFXLENBQUM7SUFDbEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDSDtBQUNELE1BQU1tRSxnQkFBZ0IsQ0FBQ2pFO0lBQ25CLE1BQU1rRSxPQUFPQyxLQUFLQyxTQUFTLENBQUNwRSxLQUFLLE1BQU07SUFDdkMsT0FBT2tFLEtBQUtHLE9BQU8sQ0FBQyxlQUFlO0FBQ3ZDO0FBQ0EsTUFBTUMsaUJBQWlCekU7SUFDbkIwRSxZQUFZQyxNQUFNLENBQUU7UUFDaEIsS0FBSztRQUNMLElBQUksQ0FBQ0EsTUFBTSxHQUFHLEVBQUU7UUFDaEIsSUFBSSxDQUFDQyxRQUFRLEdBQUcsQ0FBQ0M7WUFDYixJQUFJLENBQUNGLE1BQU0sR0FBRzttQkFBSSxJQUFJLENBQUNBLE1BQU07Z0JBQUVFO2FBQUk7UUFDdkM7UUFDQSxJQUFJLENBQUNDLFNBQVMsR0FBRyxDQUFDQyxPQUFPLEVBQUU7WUFDdkIsSUFBSSxDQUFDSixNQUFNLEdBQUc7bUJBQUksSUFBSSxDQUFDQSxNQUFNO21CQUFLSTthQUFLO1FBQzNDO1FBQ0EsTUFBTUMsY0FBYyxXQUFXOUQsU0FBUztRQUN4QyxJQUFJSixPQUFPbUUsY0FBYyxFQUFFO1lBQ3ZCLG1DQUFtQztZQUNuQ25FLE9BQU9tRSxjQUFjLENBQUMsSUFBSSxFQUFFRDtRQUNoQyxPQUNLO1lBQ0QsSUFBSSxDQUFDRSxTQUFTLEdBQUdGO1FBQ3JCO1FBQ0EsSUFBSSxDQUFDRyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNSLE1BQU0sR0FBR0E7SUFDbEI7SUFDQSxJQUFJUyxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUNULE1BQU07SUFDdEI7SUFDQVUsT0FBT0MsT0FBTyxFQUFFO1FBQ1osTUFBTUMsU0FBU0QsV0FDWCxTQUFVRSxLQUFLO1lBQ1gsT0FBT0EsTUFBTUMsT0FBTztRQUN4QjtRQUNKLE1BQU1DLGNBQWM7WUFBRUMsU0FBUyxFQUFFO1FBQUM7UUFDbEMsTUFBTUMsZUFBZSxDQUFDQztZQUNsQixLQUFLLE1BQU1MLFNBQVNLLE1BQU1sQixNQUFNLENBQUU7Z0JBQzlCLElBQUlhLE1BQU1NLElBQUksS0FBSyxpQkFBaUI7b0JBQ2hDTixNQUFNTyxXQUFXLENBQUNuRixHQUFHLENBQUNnRjtnQkFDMUIsT0FDSyxJQUFJSixNQUFNTSxJQUFJLEtBQUssdUJBQXVCO29CQUMzQ0YsYUFBYUosTUFBTVEsZUFBZTtnQkFDdEMsT0FDSyxJQUFJUixNQUFNTSxJQUFJLEtBQUsscUJBQXFCO29CQUN6Q0YsYUFBYUosTUFBTVMsY0FBYztnQkFDckMsT0FDSyxJQUFJVCxNQUFNVSxJQUFJLENBQUNDLE1BQU0sS0FBSyxHQUFHO29CQUM5QlQsWUFBWUMsT0FBTyxDQUFDdEUsSUFBSSxDQUFDa0UsT0FBT0M7Z0JBQ3BDLE9BQ0s7b0JBQ0QsSUFBSVksT0FBT1Y7b0JBQ1gsSUFBSVcsSUFBSTtvQkFDUixNQUFPQSxJQUFJYixNQUFNVSxJQUFJLENBQUNDLE1BQU0sQ0FBRTt3QkFDMUIsTUFBTUcsS0FBS2QsTUFBTVUsSUFBSSxDQUFDRyxFQUFFO3dCQUN4QixNQUFNRSxXQUFXRixNQUFNYixNQUFNVSxJQUFJLENBQUNDLE1BQU0sR0FBRzt3QkFDM0MsSUFBSSxDQUFDSSxVQUFVOzRCQUNYSCxJQUFJLENBQUNFLEdBQUcsR0FBR0YsSUFBSSxDQUFDRSxHQUFHLElBQUk7Z0NBQUVYLFNBQVMsRUFBRTs0QkFBQzt3QkFDckMsZ0NBQWdDO3dCQUNoQyw0Q0FBNEM7d0JBQzVDLHVDQUF1Qzt3QkFDdkMsZ0NBQWdDO3dCQUNoQyw2QkFBNkI7d0JBQzdCLHVDQUF1Qzt3QkFDdkMsSUFBSTt3QkFDUixPQUNLOzRCQUNEUyxJQUFJLENBQUNFLEdBQUcsR0FBR0YsSUFBSSxDQUFDRSxHQUFHLElBQUk7Z0NBQUVYLFNBQVMsRUFBRTs0QkFBQzs0QkFDckNTLElBQUksQ0FBQ0UsR0FBRyxDQUFDWCxPQUFPLENBQUN0RSxJQUFJLENBQUNrRSxPQUFPQzt3QkFDakM7d0JBQ0FZLE9BQU9BLElBQUksQ0FBQ0UsR0FBRzt3QkFDZkQ7b0JBQ0o7Z0JBQ0o7WUFDSjtRQUNKO1FBQ0FULGFBQWEsSUFBSTtRQUNqQixPQUFPRjtJQUNYO0lBQ0FwRCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUNtRCxPQUFPO0lBQ3ZCO0lBQ0EsSUFBSUEsVUFBVTtRQUNWLE9BQU9uQixLQUFLQyxTQUFTLENBQUMsSUFBSSxDQUFDSSxNQUFNLEVBQUVsRixLQUFLMEMscUJBQXFCLEVBQUU7SUFDbkU7SUFDQSxJQUFJcUUsVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDN0IsTUFBTSxDQUFDd0IsTUFBTSxLQUFLO0lBQ2xDO0lBQ0FNLFFBQVFsQixTQUFTLENBQUNDLFFBQVVBLE1BQU1DLE9BQU8sRUFBRTtRQUN2QyxNQUFNQyxjQUFjLENBQUM7UUFDckIsTUFBTWdCLGFBQWEsRUFBRTtRQUNyQixLQUFLLE1BQU03QixPQUFPLElBQUksQ0FBQ0YsTUFBTSxDQUFFO1lBQzNCLElBQUlFLElBQUlxQixJQUFJLENBQUNDLE1BQU0sR0FBRyxHQUFHO2dCQUNyQlQsV0FBVyxDQUFDYixJQUFJcUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHUixXQUFXLENBQUNiLElBQUlxQixJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRTtnQkFDekRSLFdBQVcsQ0FBQ2IsSUFBSXFCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzdFLElBQUksQ0FBQ2tFLE9BQU9WO1lBQ3pDLE9BQ0s7Z0JBQ0Q2QixXQUFXckYsSUFBSSxDQUFDa0UsT0FBT1Y7WUFDM0I7UUFDSjtRQUNBLE9BQU87WUFBRTZCO1lBQVloQjtRQUFZO0lBQ3JDO0lBQ0EsSUFBSWdCLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQ0QsT0FBTztJQUN2QjtBQUNKO0FBQ0FoQyxTQUFTa0MsTUFBTSxHQUFHLENBQUNoQztJQUNmLE1BQU1rQixRQUFRLElBQUlwQixTQUFTRTtJQUMzQixPQUFPa0I7QUFDWDtBQUVBLE1BQU1lLFdBQVcsQ0FBQ3BCLE9BQU9xQjtJQUNyQixJQUFJcEI7SUFDSixPQUFRRCxNQUFNTSxJQUFJO1FBQ2QsS0FBSzNCLGFBQWEyQyxZQUFZO1lBQzFCLElBQUl0QixNQUFNdUIsUUFBUSxLQUFLcEUsY0FBY2xCLFNBQVMsRUFBRTtnQkFDNUNnRSxVQUFVO1lBQ2QsT0FDSztnQkFDREEsVUFBVSxDQUFDLFNBQVMsRUFBRUQsTUFBTXdCLFFBQVEsQ0FBQyxXQUFXLEVBQUV4QixNQUFNdUIsUUFBUSxDQUFDLENBQUM7WUFDdEU7WUFDQTtRQUNKLEtBQUs1QyxhQUFhOEMsZUFBZTtZQUM3QnhCLFVBQVUsQ0FBQyxnQ0FBZ0MsRUFBRW5CLEtBQUtDLFNBQVMsQ0FBQ2lCLE1BQU13QixRQUFRLEVBQUV2SCxLQUFLMEMscUJBQXFCLEVBQUUsQ0FBQztZQUN6RztRQUNKLEtBQUtnQyxhQUFhK0MsaUJBQWlCO1lBQy9CekIsVUFBVSxDQUFDLCtCQUErQixFQUFFaEcsS0FBS3NDLFVBQVUsQ0FBQ3lELE1BQU16RSxJQUFJLEVBQUUsTUFBTSxDQUFDO1lBQy9FO1FBQ0osS0FBS29ELGFBQWFnRCxhQUFhO1lBQzNCMUIsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUN6QjtRQUNKLEtBQUt0QixhQUFhaUQsMkJBQTJCO1lBQ3pDM0IsVUFBVSxDQUFDLHNDQUFzQyxFQUFFaEcsS0FBS3NDLFVBQVUsQ0FBQ3lELE1BQU02QixPQUFPLEVBQUUsQ0FBQztZQUNuRjtRQUNKLEtBQUtsRCxhQUFhbUQsa0JBQWtCO1lBQ2hDN0IsVUFBVSxDQUFDLDZCQUE2QixFQUFFaEcsS0FBS3NDLFVBQVUsQ0FBQ3lELE1BQU02QixPQUFPLEVBQUUsWUFBWSxFQUFFN0IsTUFBTXVCLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDeEc7UUFDSixLQUFLNUMsYUFBYW9ELGlCQUFpQjtZQUMvQjlCLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQztZQUN0QztRQUNKLEtBQUt0QixhQUFhcUQsbUJBQW1CO1lBQ2pDL0IsVUFBVSxDQUFDLDRCQUE0QixDQUFDO1lBQ3hDO1FBQ0osS0FBS3RCLGFBQWFzRCxZQUFZO1lBQzFCaEMsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUN4QjtRQUNKLEtBQUt0QixhQUFhdUQsY0FBYztZQUM1QixJQUFJLE9BQU9sQyxNQUFNbUMsVUFBVSxLQUFLLFVBQVU7Z0JBQ3RDLElBQUksY0FBY25DLE1BQU1tQyxVQUFVLEVBQUU7b0JBQ2hDbEMsVUFBVSxDQUFDLDZCQUE2QixFQUFFRCxNQUFNbUMsVUFBVSxDQUFDQyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUN0RSxJQUFJLE9BQU9wQyxNQUFNbUMsVUFBVSxDQUFDRSxRQUFRLEtBQUssVUFBVTt3QkFDL0NwQyxVQUFVLENBQUMsRUFBRUEsUUFBUSxtREFBbUQsRUFBRUQsTUFBTW1DLFVBQVUsQ0FBQ0UsUUFBUSxDQUFDLENBQUM7b0JBQ3pHO2dCQUNKLE9BQ0ssSUFBSSxnQkFBZ0JyQyxNQUFNbUMsVUFBVSxFQUFFO29CQUN2Q2xDLFVBQVUsQ0FBQyxnQ0FBZ0MsRUFBRUQsTUFBTW1DLFVBQVUsQ0FBQ0csVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDL0UsT0FDSyxJQUFJLGNBQWN0QyxNQUFNbUMsVUFBVSxFQUFFO29CQUNyQ2xDLFVBQVUsQ0FBQyw4QkFBOEIsRUFBRUQsTUFBTW1DLFVBQVUsQ0FBQ0ksUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDM0UsT0FDSztvQkFDRHRJLEtBQUtLLFdBQVcsQ0FBQzBGLE1BQU1tQyxVQUFVO2dCQUNyQztZQUNKLE9BQ0ssSUFBSW5DLE1BQU1tQyxVQUFVLEtBQUssU0FBUztnQkFDbkNsQyxVQUFVLENBQUMsUUFBUSxFQUFFRCxNQUFNbUMsVUFBVSxDQUFDLENBQUM7WUFDM0MsT0FDSztnQkFDRGxDLFVBQVU7WUFDZDtZQUNBO1FBQ0osS0FBS3RCLGFBQWE2RCxTQUFTO1lBQ3ZCLElBQUl4QyxNQUFNeUMsSUFBSSxLQUFLLFNBQ2Z4QyxVQUFVLENBQUMsbUJBQW1CLEVBQUVELE1BQU0wQyxLQUFLLEdBQUcsWUFBWTFDLE1BQU0yQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTNDLE1BQU00QyxPQUFPLENBQUMsV0FBVyxDQUFDO2lCQUNqSSxJQUFJNUMsTUFBTXlDLElBQUksS0FBSyxVQUNwQnhDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRUQsTUFBTTBDLEtBQUssR0FBRyxZQUFZMUMsTUFBTTJDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFM0MsTUFBTTRDLE9BQU8sQ0FBQyxhQUFhLENBQUM7aUJBQy9ILElBQUk1QyxNQUFNeUMsSUFBSSxLQUFLLFVBQ3BCeEMsVUFBVSxDQUFDLGVBQWUsRUFBRUQsTUFBTTBDLEtBQUssR0FDakMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUNuQjFDLE1BQU0yQyxTQUFTLEdBQ1gsQ0FBQyx5QkFBeUIsQ0FBQyxHQUMzQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUzQyxNQUFNNEMsT0FBTyxDQUFDLENBQUM7aUJBQzFDLElBQUk1QyxNQUFNeUMsSUFBSSxLQUFLLFFBQ3BCeEMsVUFBVSxDQUFDLGFBQWEsRUFBRUQsTUFBTTBDLEtBQUssR0FDL0IsQ0FBQyxpQkFBaUIsQ0FBQyxHQUNuQjFDLE1BQU0yQyxTQUFTLEdBQ1gsQ0FBQyx5QkFBeUIsQ0FBQyxHQUMzQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsSUFBSW5FLEtBQUtyQyxPQUFPNkQsTUFBTTRDLE9BQU8sR0FBRyxDQUFDO2lCQUU3RDNDLFVBQVU7WUFDZDtRQUNKLEtBQUt0QixhQUFha0UsT0FBTztZQUNyQixJQUFJN0MsTUFBTXlDLElBQUksS0FBSyxTQUNmeEMsVUFBVSxDQUFDLG1CQUFtQixFQUFFRCxNQUFNMEMsS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcxQyxNQUFNMkMsU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUzQyxNQUFNOEMsT0FBTyxDQUFDLFdBQVcsQ0FBQztpQkFDaEksSUFBSTlDLE1BQU15QyxJQUFJLEtBQUssVUFDcEJ4QyxVQUFVLENBQUMsb0JBQW9CLEVBQUVELE1BQU0wQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRzFDLE1BQU0yQyxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTNDLE1BQU04QyxPQUFPLENBQUMsYUFBYSxDQUFDO2lCQUMvSCxJQUFJOUMsTUFBTXlDLElBQUksS0FBSyxVQUNwQnhDLFVBQVUsQ0FBQyxlQUFlLEVBQUVELE1BQU0wQyxLQUFLLEdBQ2pDLENBQUMsT0FBTyxDQUFDLEdBQ1QxQyxNQUFNMkMsU0FBUyxHQUNYLENBQUMscUJBQXFCLENBQUMsR0FDdkIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUzQyxNQUFNOEMsT0FBTyxDQUFDLENBQUM7aUJBQ3ZDLElBQUk5QyxNQUFNeUMsSUFBSSxLQUFLLFVBQ3BCeEMsVUFBVSxDQUFDLGVBQWUsRUFBRUQsTUFBTTBDLEtBQUssR0FDakMsQ0FBQyxPQUFPLENBQUMsR0FDVDFDLE1BQU0yQyxTQUFTLEdBQ1gsQ0FBQyxxQkFBcUIsQ0FBQyxHQUN2QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTNDLE1BQU04QyxPQUFPLENBQUMsQ0FBQztpQkFDdkMsSUFBSTlDLE1BQU15QyxJQUFJLEtBQUssUUFDcEJ4QyxVQUFVLENBQUMsYUFBYSxFQUFFRCxNQUFNMEMsS0FBSyxHQUMvQixDQUFDLE9BQU8sQ0FBQyxHQUNUMUMsTUFBTTJDLFNBQVMsR0FDWCxDQUFDLHdCQUF3QixDQUFDLEdBQzFCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUluRSxLQUFLckMsT0FBTzZELE1BQU04QyxPQUFPLEdBQUcsQ0FBQztpQkFFN0Q3QyxVQUFVO1lBQ2Q7UUFDSixLQUFLdEIsYUFBYW9FLE1BQU07WUFDcEI5QyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQ3pCO1FBQ0osS0FBS3RCLGFBQWFxRSwwQkFBMEI7WUFDeEMvQyxVQUFVLENBQUMsd0NBQXdDLENBQUM7WUFDcEQ7UUFDSixLQUFLdEIsYUFBYXNFLGVBQWU7WUFDN0JoRCxVQUFVLENBQUMsNkJBQTZCLEVBQUVELE1BQU1rRCxVQUFVLENBQUMsQ0FBQztZQUM1RDtRQUNKLEtBQUt2RSxhQUFhd0UsVUFBVTtZQUN4QmxELFVBQVU7WUFDVjtRQUNKO1lBQ0lBLFVBQVVvQixLQUFLK0IsWUFBWTtZQUMzQm5KLEtBQUtLLFdBQVcsQ0FBQzBGO0lBQ3pCO0lBQ0EsT0FBTztRQUFFQztJQUFRO0FBQ3JCO0FBRUEsSUFBSW9ELG1CQUFtQmpDO0FBQ3ZCLFNBQVNrQyxZQUFZbEksR0FBRztJQUNwQmlJLG1CQUFtQmpJO0FBQ3ZCO0FBQ0EsU0FBU21JO0lBQ0wsT0FBT0Y7QUFDWDtBQUVBLE1BQU1HLFlBQVksQ0FBQ0M7SUFDZixNQUFNLEVBQUVwRyxJQUFJLEVBQUVxRCxJQUFJLEVBQUVnRCxTQUFTLEVBQUVDLFNBQVMsRUFBRSxHQUFHRjtJQUM3QyxNQUFNRyxXQUFXO1dBQUlsRDtXQUFVaUQsVUFBVWpELElBQUksSUFBSSxFQUFFO0tBQUU7SUFDckQsTUFBTW1ELFlBQVk7UUFDZCxHQUFHRixTQUFTO1FBQ1pqRCxNQUFNa0Q7SUFDVjtJQUNBLElBQUlFLGVBQWU7SUFDbkIsTUFBTUMsT0FBT0wsVUFDUjFJLE1BQU0sQ0FBQyxDQUFDZ0osSUFBTSxDQUFDLENBQUNBLEdBQ2hCQyxLQUFLLEdBQ0xDLE9BQU87SUFDWixLQUFLLE1BQU05SSxPQUFPMkksS0FBTTtRQUNwQkQsZUFBZTFJLElBQUl5SSxXQUFXO1lBQUV4RztZQUFNK0YsY0FBY1U7UUFBYSxHQUFHN0QsT0FBTztJQUMvRTtJQUNBLE9BQU87UUFDSCxHQUFHMEQsU0FBUztRQUNaakQsTUFBTWtEO1FBQ04zRCxTQUFTMEQsVUFBVTFELE9BQU8sSUFBSTZEO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNSyxhQUFhLEVBQUU7QUFDckIsU0FBU0Msa0JBQWtCQyxHQUFHLEVBQUVWLFNBQVM7SUFDckMsTUFBTTNELFFBQVF3RCxVQUFVO1FBQ3BCRyxXQUFXQTtRQUNYdEcsTUFBTWdILElBQUloSCxJQUFJO1FBQ2RxRCxNQUFNMkQsSUFBSTNELElBQUk7UUFDZGdELFdBQVc7WUFDUFcsSUFBSUMsTUFBTSxDQUFDQyxrQkFBa0I7WUFDN0JGLElBQUlHLGNBQWM7WUFDbEJqQjtZQUNBbkM7U0FDSCxDQUFDcEcsTUFBTSxDQUFDLENBQUN5SixJQUFNLENBQUMsQ0FBQ0E7SUFDdEI7SUFDQUosSUFBSUMsTUFBTSxDQUFDbkYsTUFBTSxDQUFDdEQsSUFBSSxDQUFDbUU7QUFDM0I7QUFDQSxNQUFNMEU7SUFDRnhGLGFBQWM7UUFDVixJQUFJLENBQUNyQyxLQUFLLEdBQUc7SUFDakI7SUFDQThILFFBQVE7UUFDSixJQUFJLElBQUksQ0FBQzlILEtBQUssS0FBSyxTQUNmLElBQUksQ0FBQ0EsS0FBSyxHQUFHO0lBQ3JCO0lBQ0ErSCxRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMvSCxLQUFLLEtBQUssV0FDZixJQUFJLENBQUNBLEtBQUssR0FBRztJQUNyQjtJQUNBLE9BQU9nSSxXQUFXQyxNQUFNLEVBQUVDLE9BQU8sRUFBRTtRQUMvQixNQUFNQyxhQUFhLEVBQUU7UUFDckIsS0FBSyxNQUFNQyxLQUFLRixRQUFTO1lBQ3JCLElBQUlFLEVBQUVILE1BQU0sS0FBSyxXQUNiLE9BQU9JO1lBQ1gsSUFBSUQsRUFBRUgsTUFBTSxLQUFLLFNBQ2JBLE9BQU9ILEtBQUs7WUFDaEJLLFdBQVduSixJQUFJLENBQUNvSixFQUFFcEksS0FBSztRQUMzQjtRQUNBLE9BQU87WUFBRWlJLFFBQVFBLE9BQU9qSSxLQUFLO1lBQUVBLE9BQU9tSTtRQUFXO0lBQ3JEO0lBQ0EsYUFBYUcsaUJBQWlCTCxNQUFNLEVBQUVNLEtBQUssRUFBRTtRQUN6QyxNQUFNQyxZQUFZLEVBQUU7UUFDcEIsS0FBSyxNQUFNQyxRQUFRRixNQUFPO1lBQ3RCQyxVQUFVeEosSUFBSSxDQUFDO2dCQUNYSixLQUFLLE1BQU02SixLQUFLN0osR0FBRztnQkFDbkJvQixPQUFPLE1BQU15SSxLQUFLekksS0FBSztZQUMzQjtRQUNKO1FBQ0EsT0FBTzZILFlBQVlhLGVBQWUsQ0FBQ1QsUUFBUU87SUFDL0M7SUFDQSxPQUFPRSxnQkFBZ0JULE1BQU0sRUFBRU0sS0FBSyxFQUFFO1FBQ2xDLE1BQU1JLGNBQWMsQ0FBQztRQUNyQixLQUFLLE1BQU1GLFFBQVFGLE1BQU87WUFDdEIsTUFBTSxFQUFFM0osR0FBRyxFQUFFb0IsS0FBSyxFQUFFLEdBQUd5STtZQUN2QixJQUFJN0osSUFBSXFKLE1BQU0sS0FBSyxXQUNmLE9BQU9JO1lBQ1gsSUFBSXJJLE1BQU1pSSxNQUFNLEtBQUssV0FDakIsT0FBT0k7WUFDWCxJQUFJekosSUFBSXFKLE1BQU0sS0FBSyxTQUNmQSxPQUFPSCxLQUFLO1lBQ2hCLElBQUk5SCxNQUFNaUksTUFBTSxLQUFLLFNBQ2pCQSxPQUFPSCxLQUFLO1lBQ2hCLElBQUlsSixJQUFJb0IsS0FBSyxLQUFLLGVBQ2IsUUFBT0EsTUFBTUEsS0FBSyxLQUFLLGVBQWV5SSxLQUFLRyxTQUFTLEdBQUc7Z0JBQ3hERCxXQUFXLENBQUMvSixJQUFJb0IsS0FBSyxDQUFDLEdBQUdBLE1BQU1BLEtBQUs7WUFDeEM7UUFDSjtRQUNBLE9BQU87WUFBRWlJLFFBQVFBLE9BQU9qSSxLQUFLO1lBQUVBLE9BQU8ySTtRQUFZO0lBQ3REO0FBQ0o7QUFDQSxNQUFNTixVQUFVNUosT0FBT29LLE1BQU0sQ0FBQztJQUMxQlosUUFBUTtBQUNaO0FBQ0EsTUFBTWEsUUFBUSxDQUFDOUksUUFBVztRQUFFaUksUUFBUTtRQUFTakk7SUFBTTtBQUNuRCxNQUFNK0ksS0FBSyxDQUFDL0ksUUFBVztRQUFFaUksUUFBUTtRQUFTakk7SUFBTTtBQUNoRCxNQUFNZ0osWUFBWSxDQUFDcEIsSUFBTUEsRUFBRUssTUFBTSxLQUFLO0FBQ3RDLE1BQU1nQixVQUFVLENBQUNyQixJQUFNQSxFQUFFSyxNQUFNLEtBQUs7QUFDcEMsTUFBTWlCLFVBQVUsQ0FBQ3RCLElBQU1BLEVBQUVLLE1BQU0sS0FBSztBQUNwQyxNQUFNa0IsVUFBVSxDQUFDdkIsSUFBTSxPQUFPd0IsWUFBWSxlQUFleEIsYUFBYXdCO0FBRXRFLElBQUlDO0FBQ0gsVUFBVUEsU0FBUztJQUNoQkEsVUFBVUMsUUFBUSxHQUFHLENBQUNsRyxVQUFZLE9BQU9BLFlBQVksV0FBVztZQUFFQTtRQUFRLElBQUlBLFdBQVcsQ0FBQztJQUMxRmlHLFVBQVVwSixRQUFRLEdBQUcsQ0FBQ21ELFVBQVksT0FBT0EsWUFBWSxXQUFXQSxVQUFVQSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUUEsT0FBTztBQUMvSSxHQUFHaUcsYUFBY0EsQ0FBQUEsWUFBWSxDQUFDO0FBRTlCLE1BQU1FO0lBQ0ZsSCxZQUFZbUgsTUFBTSxFQUFFeEosS0FBSyxFQUFFNkQsSUFBSSxFQUFFakYsR0FBRyxDQUFFO1FBQ2xDLElBQUksQ0FBQzZLLFdBQVcsR0FBRyxFQUFFO1FBQ3JCLElBQUksQ0FBQ0QsTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ2hKLElBQUksR0FBR1I7UUFDWixJQUFJLENBQUMwSixLQUFLLEdBQUc3RjtRQUNiLElBQUksQ0FBQzhGLElBQUksR0FBRy9LO0lBQ2hCO0lBQ0EsSUFBSWlGLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDNEYsV0FBVyxDQUFDM0YsTUFBTSxFQUFFO1lBQzFCLElBQUksSUFBSSxDQUFDNkYsSUFBSSxZQUFZekksT0FBTztnQkFDNUIsSUFBSSxDQUFDdUksV0FBVyxDQUFDekssSUFBSSxJQUFJLElBQUksQ0FBQzBLLEtBQUssS0FBSyxJQUFJLENBQUNDLElBQUk7WUFDckQsT0FDSztnQkFDRCxJQUFJLENBQUNGLFdBQVcsQ0FBQ3pLLElBQUksSUFBSSxJQUFJLENBQUMwSyxLQUFLLEVBQUUsSUFBSSxDQUFDQyxJQUFJO1lBQ2xEO1FBQ0o7UUFDQSxPQUFPLElBQUksQ0FBQ0YsV0FBVztJQUMzQjtBQUNKO0FBQ0EsTUFBTUcsZUFBZSxDQUFDcEMsS0FBS3FDO0lBQ3ZCLElBQUlYLFFBQVFXLFNBQVM7UUFDakIsT0FBTztZQUFFQyxTQUFTO1lBQU10SixNQUFNcUosT0FBTzdKLEtBQUs7UUFBQztJQUMvQyxPQUNLO1FBQ0QsSUFBSSxDQUFDd0gsSUFBSUMsTUFBTSxDQUFDbkYsTUFBTSxDQUFDd0IsTUFBTSxFQUFFO1lBQzNCLE1BQU0sSUFBSW5HLE1BQU07UUFDcEI7UUFDQSxPQUFPO1lBQ0htTSxTQUFTO1lBQ1QsSUFBSXRHLFNBQVE7Z0JBQ1IsSUFBSSxJQUFJLENBQUN1RyxNQUFNLEVBQ1gsT0FBTyxJQUFJLENBQUNBLE1BQU07Z0JBQ3RCLE1BQU12RyxRQUFRLElBQUlwQixTQUFTb0YsSUFBSUMsTUFBTSxDQUFDbkYsTUFBTTtnQkFDNUMsSUFBSSxDQUFDeUgsTUFBTSxHQUFHdkc7Z0JBQ2QsT0FBTyxJQUFJLENBQUN1RyxNQUFNO1lBQ3RCO1FBQ0o7SUFDSjtBQUNKO0FBQ0EsU0FBU0Msb0JBQW9CcEQsTUFBTTtJQUMvQixJQUFJLENBQUNBLFFBQ0QsT0FBTyxDQUFDO0lBQ1osTUFBTSxFQUFFckMsUUFBUSxFQUFFMEYsa0JBQWtCLEVBQUVDLGNBQWMsRUFBRUMsV0FBVyxFQUFFLEdBQUd2RDtJQUN0RSxJQUFJckMsWUFBYTBGLENBQUFBLHNCQUFzQkMsY0FBYSxHQUFJO1FBQ3BELE1BQU0sSUFBSXZNLE1BQU0sQ0FBQyx3RkFBd0YsQ0FBQztJQUM5RztJQUNBLElBQUk0RyxVQUNBLE9BQU87UUFBRUEsVUFBVUE7UUFBVTRGO0lBQVk7SUFDN0MsTUFBTUMsWUFBWSxDQUFDQyxLQUFLN0M7UUFDcEIsSUFBSTZDLElBQUk1RyxJQUFJLEtBQUssZ0JBQ2IsT0FBTztZQUFFTCxTQUFTb0UsSUFBSWpCLFlBQVk7UUFBQztRQUN2QyxJQUFJLE9BQU9pQixJQUFJaEgsSUFBSSxLQUFLLGFBQWE7WUFDakMsT0FBTztnQkFBRTRDLFNBQVM4RyxtQkFBbUIsUUFBUUEsbUJBQW1CLEtBQUssSUFBSUEsaUJBQWlCMUMsSUFBSWpCLFlBQVk7WUFBQztRQUMvRztRQUNBLE9BQU87WUFBRW5ELFNBQVM2Ryx1QkFBdUIsUUFBUUEsdUJBQXVCLEtBQUssSUFBSUEscUJBQXFCekMsSUFBSWpCLFlBQVk7UUFBQztJQUMzSDtJQUNBLE9BQU87UUFBRWhDLFVBQVU2RjtRQUFXRDtJQUFZO0FBQzlDO0FBQ0EsTUFBTUc7SUFDRmpJLFlBQVlrSSxHQUFHLENBQUU7UUFDYiw0QkFBNEIsR0FDNUIsSUFBSSxDQUFDQyxHQUFHLEdBQUcsSUFBSSxDQUFDQyxjQUFjO1FBQzlCLElBQUksQ0FBQ0MsSUFBSSxHQUFHSDtRQUNaLElBQUksQ0FBQ0ksS0FBSyxHQUFHLElBQUksQ0FBQ0EsS0FBSyxDQUFDQyxJQUFJLENBQUMsSUFBSTtRQUNqQyxJQUFJLENBQUNDLFNBQVMsR0FBRyxJQUFJLENBQUNBLFNBQVMsQ0FBQ0QsSUFBSSxDQUFDLElBQUk7UUFDekMsSUFBSSxDQUFDRSxVQUFVLEdBQUcsSUFBSSxDQUFDQSxVQUFVLENBQUNGLElBQUksQ0FBQyxJQUFJO1FBQzNDLElBQUksQ0FBQ0gsY0FBYyxHQUFHLElBQUksQ0FBQ0EsY0FBYyxDQUFDRyxJQUFJLENBQUMsSUFBSTtRQUNuRCxJQUFJLENBQUNKLEdBQUcsR0FBRyxJQUFJLENBQUNBLEdBQUcsQ0FBQ0ksSUFBSSxDQUFDLElBQUk7UUFDN0IsSUFBSSxDQUFDRyxNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNLENBQUNILElBQUksQ0FBQyxJQUFJO1FBQ25DLElBQUksQ0FBQ0ksVUFBVSxHQUFHLElBQUksQ0FBQ0EsVUFBVSxDQUFDSixJQUFJLENBQUMsSUFBSTtRQUMzQyxJQUFJLENBQUNLLFdBQVcsR0FBRyxJQUFJLENBQUNBLFdBQVcsQ0FBQ0wsSUFBSSxDQUFDLElBQUk7UUFDN0MsSUFBSSxDQUFDTSxRQUFRLEdBQUcsSUFBSSxDQUFDQSxRQUFRLENBQUNOLElBQUksQ0FBQyxJQUFJO1FBQ3ZDLElBQUksQ0FBQ08sUUFBUSxHQUFHLElBQUksQ0FBQ0EsUUFBUSxDQUFDUCxJQUFJLENBQUMsSUFBSTtRQUN2QyxJQUFJLENBQUNRLE9BQU8sR0FBRyxJQUFJLENBQUNBLE9BQU8sQ0FBQ1IsSUFBSSxDQUFDLElBQUk7UUFDckMsSUFBSSxDQUFDakwsS0FBSyxHQUFHLElBQUksQ0FBQ0EsS0FBSyxDQUFDaUwsSUFBSSxDQUFDLElBQUk7UUFDakMsSUFBSSxDQUFDckosT0FBTyxHQUFHLElBQUksQ0FBQ0EsT0FBTyxDQUFDcUosSUFBSSxDQUFDLElBQUk7UUFDckMsSUFBSSxDQUFDUyxFQUFFLEdBQUcsSUFBSSxDQUFDQSxFQUFFLENBQUNULElBQUksQ0FBQyxJQUFJO1FBQzNCLElBQUksQ0FBQ1UsR0FBRyxHQUFHLElBQUksQ0FBQ0EsR0FBRyxDQUFDVixJQUFJLENBQUMsSUFBSTtRQUM3QixJQUFJLENBQUNXLFNBQVMsR0FBRyxJQUFJLENBQUNBLFNBQVMsQ0FBQ1gsSUFBSSxDQUFDLElBQUk7UUFDekMsSUFBSSxDQUFDWSxLQUFLLEdBQUcsSUFBSSxDQUFDQSxLQUFLLENBQUNaLElBQUksQ0FBQyxJQUFJO1FBQ2pDLElBQUksQ0FBQ2EsT0FBTyxHQUFHLElBQUksQ0FBQ0EsT0FBTyxDQUFDYixJQUFJLENBQUMsSUFBSTtRQUNyQyxJQUFJLENBQUN0SixLQUFLLEdBQUcsSUFBSSxDQUFDQSxLQUFLLENBQUNzSixJQUFJLENBQUMsSUFBSTtRQUNqQyxJQUFJLENBQUNjLFFBQVEsR0FBRyxJQUFJLENBQUNBLFFBQVEsQ0FBQ2QsSUFBSSxDQUFDLElBQUk7UUFDdkMsSUFBSSxDQUFDZSxJQUFJLEdBQUcsSUFBSSxDQUFDQSxJQUFJLENBQUNmLElBQUksQ0FBQyxJQUFJO1FBQy9CLElBQUksQ0FBQ2dCLFFBQVEsR0FBRyxJQUFJLENBQUNBLFFBQVEsQ0FBQ2hCLElBQUksQ0FBQyxJQUFJO1FBQ3ZDLElBQUksQ0FBQ2lCLFVBQVUsR0FBRyxJQUFJLENBQUNBLFVBQVUsQ0FBQ2pCLElBQUksQ0FBQyxJQUFJO1FBQzNDLElBQUksQ0FBQ2tCLFVBQVUsR0FBRyxJQUFJLENBQUNBLFVBQVUsQ0FBQ2xCLElBQUksQ0FBQyxJQUFJO0lBQy9DO0lBQ0EsSUFBSVQsY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDTyxJQUFJLENBQUNQLFdBQVc7SUFDaEM7SUFDQTRCLFNBQVNDLEtBQUssRUFBRTtRQUNaLE9BQU96TCxjQUFjeUwsTUFBTXhMLElBQUk7SUFDbkM7SUFDQXlMLGdCQUFnQkQsS0FBSyxFQUFFeEUsR0FBRyxFQUFFO1FBQ3hCLE9BQVFBLE9BQU87WUFDWEMsUUFBUXVFLE1BQU14QyxNQUFNLENBQUMvQixNQUFNO1lBQzNCakgsTUFBTXdMLE1BQU14TCxJQUFJO1lBQ2hCMEwsWUFBWTNMLGNBQWN5TCxNQUFNeEwsSUFBSTtZQUNwQ21ILGdCQUFnQixJQUFJLENBQUMrQyxJQUFJLENBQUNuRyxRQUFRO1lBQ2xDVixNQUFNbUksTUFBTW5JLElBQUk7WUFDaEIyRixRQUFRd0MsTUFBTXhDLE1BQU07UUFDeEI7SUFDSjtJQUNBMkMsb0JBQW9CSCxLQUFLLEVBQUU7UUFDdkIsT0FBTztZQUNIL0QsUUFBUSxJQUFJSjtZQUNaTCxLQUFLO2dCQUNEQyxRQUFRdUUsTUFBTXhDLE1BQU0sQ0FBQy9CLE1BQU07Z0JBQzNCakgsTUFBTXdMLE1BQU14TCxJQUFJO2dCQUNoQjBMLFlBQVkzTCxjQUFjeUwsTUFBTXhMLElBQUk7Z0JBQ3BDbUgsZ0JBQWdCLElBQUksQ0FBQytDLElBQUksQ0FBQ25HLFFBQVE7Z0JBQ2xDVixNQUFNbUksTUFBTW5JLElBQUk7Z0JBQ2hCMkYsUUFBUXdDLE1BQU14QyxNQUFNO1lBQ3hCO1FBQ0o7SUFDSjtJQUNBNEMsV0FBV0osS0FBSyxFQUFFO1FBQ2QsTUFBTW5DLFNBQVMsSUFBSSxDQUFDd0MsTUFBTSxDQUFDTDtRQUMzQixJQUFJN0MsUUFBUVUsU0FBUztZQUNqQixNQUFNLElBQUlsTSxNQUFNO1FBQ3BCO1FBQ0EsT0FBT2tNO0lBQ1g7SUFDQXlDLFlBQVlOLEtBQUssRUFBRTtRQUNmLE1BQU1uQyxTQUFTLElBQUksQ0FBQ3dDLE1BQU0sQ0FBQ0w7UUFDM0IsT0FBTzVDLFFBQVFtRCxPQUFPLENBQUMxQztJQUMzQjtJQUNBYyxNQUFNbkssSUFBSSxFQUFFb0csTUFBTSxFQUFFO1FBQ2hCLE1BQU1pRCxTQUFTLElBQUksQ0FBQ2dCLFNBQVMsQ0FBQ3JLLE1BQU1vRztRQUNwQyxJQUFJaUQsT0FBT0MsT0FBTyxFQUNkLE9BQU9ELE9BQU9ySixJQUFJO1FBQ3RCLE1BQU1xSixPQUFPckcsS0FBSztJQUN0QjtJQUNBcUgsVUFBVXJLLElBQUksRUFBRW9HLE1BQU0sRUFBRTtRQUNwQixJQUFJNEY7UUFDSixNQUFNaEYsTUFBTTtZQUNSQyxRQUFRO2dCQUNKbkYsUUFBUSxFQUFFO2dCQUNWbUssT0FBTyxDQUFDRCxLQUFLNUYsV0FBVyxRQUFRQSxXQUFXLEtBQUssSUFBSSxLQUFLLElBQUlBLE9BQU82RixLQUFLLE1BQU0sUUFBUUQsT0FBTyxLQUFLLElBQUlBLEtBQUs7Z0JBQzVHOUUsb0JBQW9CZCxXQUFXLFFBQVFBLFdBQVcsS0FBSyxJQUFJLEtBQUssSUFBSUEsT0FBT3JDLFFBQVE7WUFDdkY7WUFDQVYsTUFBTSxDQUFDK0MsV0FBVyxRQUFRQSxXQUFXLEtBQUssSUFBSSxLQUFLLElBQUlBLE9BQU8vQyxJQUFJLEtBQUssRUFBRTtZQUN6RThELGdCQUFnQixJQUFJLENBQUMrQyxJQUFJLENBQUNuRyxRQUFRO1lBQ2xDaUYsUUFBUTtZQUNSaEo7WUFDQTBMLFlBQVkzTCxjQUFjQztRQUM5QjtRQUNBLE1BQU1xSixTQUFTLElBQUksQ0FBQ3VDLFVBQVUsQ0FBQztZQUFFNUw7WUFBTXFELE1BQU0yRCxJQUFJM0QsSUFBSTtZQUFFMkYsUUFBUWhDO1FBQUk7UUFDbkUsT0FBT29DLGFBQWFwQyxLQUFLcUM7SUFDN0I7SUFDQSxNQUFNaUIsV0FBV3RLLElBQUksRUFBRW9HLE1BQU0sRUFBRTtRQUMzQixNQUFNaUQsU0FBUyxNQUFNLElBQUksQ0FBQ1ksY0FBYyxDQUFDakssTUFBTW9HO1FBQy9DLElBQUlpRCxPQUFPQyxPQUFPLEVBQ2QsT0FBT0QsT0FBT3JKLElBQUk7UUFDdEIsTUFBTXFKLE9BQU9yRyxLQUFLO0lBQ3RCO0lBQ0EsTUFBTWlILGVBQWVqSyxJQUFJLEVBQUVvRyxNQUFNLEVBQUU7UUFDL0IsTUFBTVksTUFBTTtZQUNSQyxRQUFRO2dCQUNKbkYsUUFBUSxFQUFFO2dCQUNWb0Ysb0JBQW9CZCxXQUFXLFFBQVFBLFdBQVcsS0FBSyxJQUFJLEtBQUssSUFBSUEsT0FBT3JDLFFBQVE7Z0JBQ25Ga0ksT0FBTztZQUNYO1lBQ0E1SSxNQUFNLENBQUMrQyxXQUFXLFFBQVFBLFdBQVcsS0FBSyxJQUFJLEtBQUssSUFBSUEsT0FBTy9DLElBQUksS0FBSyxFQUFFO1lBQ3pFOEQsZ0JBQWdCLElBQUksQ0FBQytDLElBQUksQ0FBQ25HLFFBQVE7WUFDbENpRixRQUFRO1lBQ1JoSjtZQUNBMEwsWUFBWTNMLGNBQWNDO1FBQzlCO1FBQ0EsTUFBTWtNLG1CQUFtQixJQUFJLENBQUNMLE1BQU0sQ0FBQztZQUFFN0w7WUFBTXFELE1BQU0yRCxJQUFJM0QsSUFBSTtZQUFFMkYsUUFBUWhDO1FBQUk7UUFDekUsTUFBTXFDLFNBQVMsTUFBT1YsQ0FBQUEsUUFBUXVELG9CQUN4QkEsbUJBQ0F0RCxRQUFRbUQsT0FBTyxDQUFDRyxpQkFBZ0I7UUFDdEMsT0FBTzlDLGFBQWFwQyxLQUFLcUM7SUFDN0I7SUFDQWtCLE9BQU80QixLQUFLLEVBQUV2SixPQUFPLEVBQUU7UUFDbkIsTUFBTXdKLHFCQUFxQixDQUFDdFA7WUFDeEIsSUFBSSxPQUFPOEYsWUFBWSxZQUFZLE9BQU9BLFlBQVksYUFBYTtnQkFDL0QsT0FBTztvQkFBRUE7Z0JBQVE7WUFDckIsT0FDSyxJQUFJLE9BQU9BLFlBQVksWUFBWTtnQkFDcEMsT0FBT0EsUUFBUTlGO1lBQ25CLE9BQ0s7Z0JBQ0QsT0FBTzhGO1lBQ1g7UUFDSjtRQUNBLE9BQU8sSUFBSSxDQUFDeUosV0FBVyxDQUFDLENBQUN2UCxLQUFLa0s7WUFDMUIsTUFBTXFDLFNBQVM4QyxNQUFNclA7WUFDckIsTUFBTXdQLFdBQVcsSUFBTXRGLElBQUlqRixRQUFRLENBQUM7b0JBQ2hDa0IsTUFBTTNCLGFBQWFvRSxNQUFNO29CQUN6QixHQUFHMEcsbUJBQW1CdFAsSUFBSTtnQkFDOUI7WUFDQSxJQUFJLE9BQU84TCxZQUFZLGVBQWVTLGtCQUFrQlQsU0FBUztnQkFDN0QsT0FBT1MsT0FBT3hJLElBQUksQ0FBQyxDQUFDYjtvQkFDaEIsSUFBSSxDQUFDQSxNQUFNO3dCQUNQc007d0JBQ0EsT0FBTztvQkFDWCxPQUNLO3dCQUNELE9BQU87b0JBQ1g7Z0JBQ0o7WUFDSjtZQUNBLElBQUksQ0FBQ2pELFFBQVE7Z0JBQ1RpRDtnQkFDQSxPQUFPO1lBQ1gsT0FDSztnQkFDRCxPQUFPO1lBQ1g7UUFDSjtJQUNKO0lBQ0E5QixXQUFXMkIsS0FBSyxFQUFFSSxjQUFjLEVBQUU7UUFDOUIsT0FBTyxJQUFJLENBQUNGLFdBQVcsQ0FBQyxDQUFDdlAsS0FBS2tLO1lBQzFCLElBQUksQ0FBQ21GLE1BQU1yUCxNQUFNO2dCQUNia0ssSUFBSWpGLFFBQVEsQ0FBQyxPQUFPd0ssbUJBQW1CLGFBQ2pDQSxlQUFlelAsS0FBS2tLLE9BQ3BCdUY7Z0JBQ04sT0FBTztZQUNYLE9BQ0s7Z0JBQ0QsT0FBTztZQUNYO1FBQ0o7SUFDSjtJQUNBRixZQUFZN0IsVUFBVSxFQUFFO1FBQ3BCLE9BQU8sSUFBSWdDLFdBQVc7WUFDbEJDLFFBQVEsSUFBSTtZQUNaQyxVQUFVQyxzQkFBc0JILFVBQVU7WUFDMUNJLFFBQVE7Z0JBQUV4SCxNQUFNO2dCQUFjb0Y7WUFBVztRQUM3QztJQUNKO0lBQ0FDLFlBQVlELFVBQVUsRUFBRTtRQUNwQixPQUFPLElBQUksQ0FBQzZCLFdBQVcsQ0FBQzdCO0lBQzVCO0lBQ0FFLFdBQVc7UUFDUCxPQUFPbUMsWUFBWS9JLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDb0csSUFBSTtJQUM3QztJQUNBUyxXQUFXO1FBQ1AsT0FBT21DLFlBQVloSixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQ29HLElBQUk7SUFDN0M7SUFDQVUsVUFBVTtRQUNOLE9BQU8sSUFBSSxDQUFDRCxRQUFRLEdBQUdELFFBQVE7SUFDbkM7SUFDQXZMLFFBQVE7UUFDSixPQUFPNE4sU0FBU2pKLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDb0csSUFBSTtJQUMxQztJQUNBbkosVUFBVTtRQUNOLE9BQU9pTSxXQUFXbEosTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUNvRyxJQUFJO0lBQzVDO0lBQ0FXLEdBQUdvQyxNQUFNLEVBQUU7UUFDUCxPQUFPQyxTQUFTcEosTUFBTSxDQUFDO1lBQUMsSUFBSTtZQUFFbUo7U0FBTyxFQUFFLElBQUksQ0FBQy9DLElBQUk7SUFDcEQ7SUFDQVksSUFBSXFDLFFBQVEsRUFBRTtRQUNWLE9BQU9DLGdCQUFnQnRKLE1BQU0sQ0FBQyxJQUFJLEVBQUVxSixVQUFVLElBQUksQ0FBQ2pELElBQUk7SUFDM0Q7SUFDQWEsVUFBVUEsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sSUFBSXlCLFdBQVc7WUFDbEIsR0FBR2hELG9CQUFvQixJQUFJLENBQUNVLElBQUksQ0FBQztZQUNqQ3VDLFFBQVEsSUFBSTtZQUNaQyxVQUFVQyxzQkFBc0JILFVBQVU7WUFDMUNJLFFBQVE7Z0JBQUV4SCxNQUFNO2dCQUFhMkY7WUFBVTtRQUMzQztJQUNKO0lBQ0FFLFFBQVFsQixHQUFHLEVBQUU7UUFDVCxNQUFNc0QsbUJBQW1CLE9BQU90RCxRQUFRLGFBQWFBLE1BQU0sSUFBTUE7UUFDakUsT0FBTyxJQUFJdUQsV0FBVztZQUNsQixHQUFHOUQsb0JBQW9CLElBQUksQ0FBQ1UsSUFBSSxDQUFDO1lBQ2pDcUQsV0FBVyxJQUFJO1lBQ2ZDLGNBQWNIO1lBQ2RYLFVBQVVDLHNCQUFzQlcsVUFBVTtRQUM5QztJQUNKO0lBQ0F0QyxRQUFRO1FBQ0osT0FBTyxJQUFJeUMsV0FBVztZQUNsQmYsVUFBVUMsc0JBQXNCYyxVQUFVO1lBQzFDckksTUFBTSxJQUFJO1lBQ1YsR0FBR29FLG9CQUFvQixJQUFJLENBQUNVLElBQUksQ0FBQztRQUNyQztJQUNKO0lBQ0FwSixNQUFNaUosR0FBRyxFQUFFO1FBQ1AsTUFBTTJELGlCQUFpQixPQUFPM0QsUUFBUSxhQUFhQSxNQUFNLElBQU1BO1FBQy9ELE9BQU8sSUFBSTRELFNBQVM7WUFDaEIsR0FBR25FLG9CQUFvQixJQUFJLENBQUNVLElBQUksQ0FBQztZQUNqQ3FELFdBQVcsSUFBSTtZQUNmSyxZQUFZRjtZQUNaaEIsVUFBVUMsc0JBQXNCZ0IsUUFBUTtRQUM1QztJQUNKO0lBQ0F6QyxTQUFTdkIsV0FBVyxFQUFFO1FBQ2xCLE1BQU1rRSxPQUFPLElBQUksQ0FBQ2hNLFdBQVc7UUFDN0IsT0FBTyxJQUFJZ00sS0FBSztZQUNaLEdBQUcsSUFBSSxDQUFDM0QsSUFBSTtZQUNaUDtRQUNKO0lBQ0o7SUFDQXdCLEtBQUsyQyxNQUFNLEVBQUU7UUFDVCxPQUFPQyxZQUFZakssTUFBTSxDQUFDLElBQUksRUFBRWdLO0lBQ3BDO0lBQ0ExQyxXQUFXO1FBQ1AsT0FBTzRDLFlBQVlsSyxNQUFNLENBQUMsSUFBSTtJQUNsQztJQUNBd0gsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDakIsU0FBUyxDQUFDekwsV0FBVzBLLE9BQU87SUFDNUM7SUFDQStCLGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQ2hCLFNBQVMsQ0FBQyxNQUFNZixPQUFPO0lBQ3ZDO0FBQ0o7QUFDQSxNQUFNMkUsWUFBWTtBQUNsQixNQUFNQyxhQUFhO0FBQ25CLE1BQU1DLFlBQVk7QUFDbEIsb0JBQW9CO0FBQ3BCLG1IQUFtSDtBQUNuSCxNQUFNQyxZQUFZO0FBQ2xCLGlEQUFpRDtBQUNqRCxnREFBZ0Q7QUFDaEQsZzZCQUFnNkI7QUFDaDZCLGlCQUFpQjtBQUNqQiwySkFBMko7QUFDM0osMkJBQTJCO0FBQzNCLHFCQUFxQjtBQUNyQiw0bkJBQTRuQjtBQUM1bkIscUJBQXFCO0FBQ3JCLGdLQUFnSztBQUNoSyxxQkFBcUI7QUFDckIscWJBQXFiO0FBQ3JiLE1BQU1DLGFBQWE7QUFDbkIscUJBQXFCO0FBQ3JCLHFFQUFxRTtBQUNyRSxvRkFBb0Y7QUFDcEYsTUFBTUMsY0FBYyxDQUFDLG9EQUFvRCxDQUFDO0FBQzFFLElBQUlDO0FBQ0osTUFBTUMsWUFBWTtBQUNsQixNQUFNQyxZQUFZO0FBQ2xCLG1EQUFtRDtBQUNuRCxNQUFNQyxnQkFBZ0IsQ0FBQ0M7SUFDbkIsSUFBSUEsS0FBS0MsU0FBUyxFQUFFO1FBQ2hCLElBQUlELEtBQUtFLE1BQU0sRUFBRTtZQUNiLE9BQU8sSUFBSUMsT0FBTyxDQUFDLGlEQUFpRCxFQUFFSCxLQUFLQyxTQUFTLENBQUMsNkJBQTZCLENBQUM7UUFDdkgsT0FDSztZQUNELE9BQU8sSUFBSUUsT0FBTyxDQUFDLGlEQUFpRCxFQUFFSCxLQUFLQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQzdGO0lBQ0osT0FDSyxJQUFJRCxLQUFLQyxTQUFTLEtBQUssR0FBRztRQUMzQixJQUFJRCxLQUFLRSxNQUFNLEVBQUU7WUFDYixPQUFPLElBQUlDLE9BQU8sQ0FBQyxzRUFBc0UsQ0FBQztRQUM5RixPQUNLO1lBQ0QsT0FBTyxJQUFJQSxPQUFPLENBQUMsNENBQTRDLENBQUM7UUFDcEU7SUFDSixPQUNLO1FBQ0QsSUFBSUgsS0FBS0UsTUFBTSxFQUFFO1lBQ2IsT0FBTyxJQUFJQyxPQUFPLENBQUMsZ0ZBQWdGLENBQUM7UUFDeEcsT0FDSztZQUNELE9BQU8sSUFBSUEsT0FBTyxDQUFDLHNEQUFzRCxDQUFDO1FBQzlFO0lBQ0o7QUFDSjtBQUNBLFNBQVNDLFVBQVVDLEVBQUUsRUFBRUMsT0FBTztJQUMxQixJQUFJLENBQUNBLFlBQVksUUFBUSxDQUFDQSxPQUFNLEtBQU1ULFVBQVVVLElBQUksQ0FBQ0YsS0FBSztRQUN0RCxPQUFPO0lBQ1g7SUFDQSxJQUFJLENBQUNDLFlBQVksUUFBUSxDQUFDQSxPQUFNLEtBQU1SLFVBQVVTLElBQUksQ0FBQ0YsS0FBSztRQUN0RCxPQUFPO0lBQ1g7SUFDQSxPQUFPO0FBQ1g7QUFDQSxNQUFNRyxrQkFBa0JyRjtJQUNwQitCLE9BQU9MLEtBQUssRUFBRTtRQUNWLElBQUksSUFBSSxDQUFDdEIsSUFBSSxDQUFDa0YsTUFBTSxFQUFFO1lBQ2xCNUQsTUFBTXhMLElBQUksR0FBR3FQLE9BQU83RCxNQUFNeEwsSUFBSTtRQUNsQztRQUNBLE1BQU0wTCxhQUFhLElBQUksQ0FBQ0gsUUFBUSxDQUFDQztRQUNqQyxJQUFJRSxlQUFlNUwsY0FBY0ksTUFBTSxFQUFFO1lBQ3JDLE1BQU04RyxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNJLE1BQU07Z0JBQzlCZ0UsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBR0EsT0FBTzdEO1FBQ1g7UUFDQSxNQUFNSixTQUFTLElBQUlKO1FBQ25CLElBQUlMLE1BQU1wSTtRQUNWLEtBQUssTUFBTXVOLFNBQVMsSUFBSSxDQUFDakMsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQ2xDLElBQUluRCxNQUFNb0QsSUFBSSxLQUFLLE9BQU87Z0JBQ3RCLElBQUkvRCxNQUFNeEwsSUFBSSxDQUFDc0QsTUFBTSxHQUFHNkksTUFBTTNNLEtBQUssRUFBRTtvQkFDakN3SCxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhNkQsU0FBUzt3QkFDNUJJLFNBQVM0RyxNQUFNM00sS0FBSzt3QkFDcEI0RixNQUFNO3dCQUNORSxXQUFXO3dCQUNYRCxPQUFPO3dCQUNQekMsU0FBU3VKLE1BQU12SixPQUFPO29CQUMxQjtvQkFDQTZFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSyxJQUFJNkUsTUFBTW9ELElBQUksS0FBSyxPQUFPO2dCQUMzQixJQUFJL0QsTUFBTXhMLElBQUksQ0FBQ3NELE1BQU0sR0FBRzZJLE1BQU0zTSxLQUFLLEVBQUU7b0JBQ2pDd0gsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNELE9BQU94RTtvQkFDbENELGtCQUFrQkMsS0FBSzt3QkFDbkIvRCxNQUFNM0IsYUFBYWtFLE9BQU87d0JBQzFCQyxTQUFTMEcsTUFBTTNNLEtBQUs7d0JBQ3BCNEYsTUFBTTt3QkFDTkUsV0FBVzt3QkFDWEQsT0FBTzt3QkFDUHpDLFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssVUFBVTtnQkFDOUIsTUFBTUMsU0FBU2hFLE1BQU14TCxJQUFJLENBQUNzRCxNQUFNLEdBQUc2SSxNQUFNM00sS0FBSztnQkFDOUMsTUFBTWlRLFdBQVdqRSxNQUFNeEwsSUFBSSxDQUFDc0QsTUFBTSxHQUFHNkksTUFBTTNNLEtBQUs7Z0JBQ2hELElBQUlnUSxVQUFVQyxVQUFVO29CQUNwQnpJLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDLElBQUl3SSxRQUFRO3dCQUNSekksa0JBQWtCQyxLQUFLOzRCQUNuQi9ELE1BQU0zQixhQUFha0UsT0FBTzs0QkFDMUJDLFNBQVMwRyxNQUFNM00sS0FBSzs0QkFDcEI0RixNQUFNOzRCQUNORSxXQUFXOzRCQUNYRCxPQUFPOzRCQUNQekMsU0FBU3VKLE1BQU12SixPQUFPO3dCQUMxQjtvQkFDSixPQUNLLElBQUk2TSxVQUFVO3dCQUNmMUksa0JBQWtCQyxLQUFLOzRCQUNuQi9ELE1BQU0zQixhQUFhNkQsU0FBUzs0QkFDNUJJLFNBQVM0RyxNQUFNM00sS0FBSzs0QkFDcEI0RixNQUFNOzRCQUNORSxXQUFXOzRCQUNYRCxPQUFPOzRCQUNQekMsU0FBU3VKLE1BQU12SixPQUFPO3dCQUMxQjtvQkFDSjtvQkFDQTZFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSyxJQUFJNkUsTUFBTW9ELElBQUksS0FBSyxTQUFTO2dCQUM3QixJQUFJLENBQUNsQixXQUFXYSxJQUFJLENBQUMxRCxNQUFNeEwsSUFBSSxHQUFHO29CQUM5QmdILE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CbEMsWUFBWTt3QkFDWjdCLE1BQU0zQixhQUFhdUQsY0FBYzt3QkFDakNqQyxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLFNBQVM7Z0JBQzdCLElBQUksQ0FBQ2hCLFlBQVk7b0JBQ2JBLGFBQWEsSUFBSU8sT0FBT1IsYUFBYTtnQkFDekM7Z0JBQ0EsSUFBSSxDQUFDQyxXQUFXVyxJQUFJLENBQUMxRCxNQUFNeEwsSUFBSSxHQUFHO29CQUM5QmdILE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CbEMsWUFBWTt3QkFDWjdCLE1BQU0zQixhQUFhdUQsY0FBYzt3QkFDakNqQyxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLFFBQVE7Z0JBQzVCLElBQUksQ0FBQ25CLFVBQVVjLElBQUksQ0FBQzFELE1BQU14TCxJQUFJLEdBQUc7b0JBQzdCZ0gsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNELE9BQU94RTtvQkFDbENELGtCQUFrQkMsS0FBSzt3QkFDbkJsQyxZQUFZO3dCQUNaN0IsTUFBTTNCLGFBQWF1RCxjQUFjO3dCQUNqQ2pDLFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssUUFBUTtnQkFDNUIsSUFBSSxDQUFDdEIsVUFBVWlCLElBQUksQ0FBQzFELE1BQU14TCxJQUFJLEdBQUc7b0JBQzdCZ0gsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNELE9BQU94RTtvQkFDbENELGtCQUFrQkMsS0FBSzt3QkFDbkJsQyxZQUFZO3dCQUNaN0IsTUFBTTNCLGFBQWF1RCxjQUFjO3dCQUNqQ2pDLFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssU0FBUztnQkFDN0IsSUFBSSxDQUFDckIsV0FBV2dCLElBQUksQ0FBQzFELE1BQU14TCxJQUFJLEdBQUc7b0JBQzlCZ0gsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNELE9BQU94RTtvQkFDbENELGtCQUFrQkMsS0FBSzt3QkFDbkJsQyxZQUFZO3dCQUNaN0IsTUFBTTNCLGFBQWF1RCxjQUFjO3dCQUNqQ2pDLFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssUUFBUTtnQkFDNUIsSUFBSSxDQUFDcEIsVUFBVWUsSUFBSSxDQUFDMUQsTUFBTXhMLElBQUksR0FBRztvQkFDN0JnSCxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQmxDLFlBQVk7d0JBQ1o3QixNQUFNM0IsYUFBYXVELGNBQWM7d0JBQ2pDakMsU0FBU3VKLE1BQU12SixPQUFPO29CQUMxQjtvQkFDQTZFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSyxJQUFJNkUsTUFBTW9ELElBQUksS0FBSyxPQUFPO2dCQUMzQixJQUFJO29CQUNBLElBQUlHLElBQUlsRSxNQUFNeEwsSUFBSTtnQkFDdEIsRUFDQSxPQUFPZ00sSUFBSTtvQkFDUGhGLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CbEMsWUFBWTt3QkFDWjdCLE1BQU0zQixhQUFhdUQsY0FBYzt3QkFDakNqQyxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLFNBQVM7Z0JBQzdCcEQsTUFBTXdELEtBQUssQ0FBQ0MsU0FBUyxHQUFHO2dCQUN4QixNQUFNQyxhQUFhMUQsTUFBTXdELEtBQUssQ0FBQ1QsSUFBSSxDQUFDMUQsTUFBTXhMLElBQUk7Z0JBQzlDLElBQUksQ0FBQzZQLFlBQVk7b0JBQ2I3SSxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQmxDLFlBQVk7d0JBQ1o3QixNQUFNM0IsYUFBYXVELGNBQWM7d0JBQ2pDakMsU0FBU3VKLE1BQU12SixPQUFPO29CQUMxQjtvQkFDQTZFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSyxJQUFJNkUsTUFBTW9ELElBQUksS0FBSyxRQUFRO2dCQUM1Qi9ELE1BQU14TCxJQUFJLEdBQUd3TCxNQUFNeEwsSUFBSSxDQUFDOFAsSUFBSTtZQUNoQyxPQUNLLElBQUkzRCxNQUFNb0QsSUFBSSxLQUFLLFlBQVk7Z0JBQ2hDLElBQUksQ0FBQy9ELE1BQU14TCxJQUFJLENBQUMrRSxRQUFRLENBQUNvSCxNQUFNM00sS0FBSyxFQUFFMk0sTUFBTW5ILFFBQVEsR0FBRztvQkFDbkRnQyxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhdUQsY0FBYzt3QkFDakNDLFlBQVk7NEJBQUVDLFVBQVVvSCxNQUFNM00sS0FBSzs0QkFBRXdGLFVBQVVtSCxNQUFNbkgsUUFBUTt3QkFBQzt3QkFDOURwQyxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLGVBQWU7Z0JBQ25DL0QsTUFBTXhMLElBQUksR0FBR3dMLE1BQU14TCxJQUFJLENBQUMrUCxXQUFXO1lBQ3ZDLE9BQ0ssSUFBSTVELE1BQU1vRCxJQUFJLEtBQUssZUFBZTtnQkFDbkMvRCxNQUFNeEwsSUFBSSxHQUFHd0wsTUFBTXhMLElBQUksQ0FBQ2dRLFdBQVc7WUFDdkMsT0FDSyxJQUFJN0QsTUFBTW9ELElBQUksS0FBSyxjQUFjO2dCQUNsQyxJQUFJLENBQUMvRCxNQUFNeEwsSUFBSSxDQUFDaUYsVUFBVSxDQUFDa0gsTUFBTTNNLEtBQUssR0FBRztvQkFDckN3SCxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhdUQsY0FBYzt3QkFDakNDLFlBQVk7NEJBQUVHLFlBQVlrSCxNQUFNM00sS0FBSzt3QkFBQzt3QkFDdENvRCxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLFlBQVk7Z0JBQ2hDLElBQUksQ0FBQy9ELE1BQU14TCxJQUFJLENBQUNrRixRQUFRLENBQUNpSCxNQUFNM00sS0FBSyxHQUFHO29CQUNuQ3dILE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CL0QsTUFBTTNCLGFBQWF1RCxjQUFjO3dCQUNqQ0MsWUFBWTs0QkFBRUksVUFBVWlILE1BQU0zTSxLQUFLO3dCQUFDO3dCQUNwQ29ELFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssWUFBWTtnQkFDaEMsTUFBTUksUUFBUWpCLGNBQWN2QztnQkFDNUIsSUFBSSxDQUFDd0QsTUFBTVQsSUFBSSxDQUFDMUQsTUFBTXhMLElBQUksR0FBRztvQkFDekJnSCxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhdUQsY0FBYzt3QkFDakNDLFlBQVk7d0JBQ1psQyxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLE1BQU07Z0JBQzFCLElBQUksQ0FBQ1IsVUFBVXZELE1BQU14TCxJQUFJLEVBQUVtTSxNQUFNOEMsT0FBTyxHQUFHO29CQUN2Q2pJLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CbEMsWUFBWTt3QkFDWjdCLE1BQU0zQixhQUFhdUQsY0FBYzt3QkFDakNqQyxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLO2dCQUNEMUssS0FBS0ssV0FBVyxDQUFDa1A7WUFDckI7UUFDSjtRQUNBLE9BQU87WUFBRTFFLFFBQVFBLE9BQU9qSSxLQUFLO1lBQUVBLE9BQU9nTSxNQUFNeEwsSUFBSTtRQUFDO0lBQ3JEO0lBQ0FpUSxPQUFPTixLQUFLLEVBQUU3SyxVQUFVLEVBQUVsQyxPQUFPLEVBQUU7UUFDL0IsT0FBTyxJQUFJLENBQUM0SCxVQUFVLENBQUMsQ0FBQ3hLLE9BQVMyUCxNQUFNVCxJQUFJLENBQUNsUCxPQUFPO1lBQy9DOEU7WUFDQTdCLE1BQU0zQixhQUFhdUQsY0FBYztZQUNqQyxHQUFHZ0UsVUFBVUMsUUFBUSxDQUFDbEcsUUFBUTtRQUNsQztJQUNKO0lBQ0FzTixVQUFVL0QsS0FBSyxFQUFFO1FBQ2IsT0FBTyxJQUFJZ0QsVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQ2pGLElBQUk7WUFDWm9GLFFBQVE7bUJBQUksSUFBSSxDQUFDcEYsSUFBSSxDQUFDb0YsTUFBTTtnQkFBRW5EO2FBQU07UUFDeEM7SUFDSjtJQUNBZ0UsTUFBTXZOLE9BQU8sRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQUVYLE1BQU07WUFBUyxHQUFHMUcsVUFBVUMsUUFBUSxDQUFDbEcsUUFBUTtRQUFDO0lBQzFFO0lBQ0F3TixJQUFJeE4sT0FBTyxFQUFFO1FBQ1QsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFBRVgsTUFBTTtZQUFPLEdBQUcxRyxVQUFVQyxRQUFRLENBQUNsRyxRQUFRO1FBQUM7SUFDeEU7SUFDQXlOLE1BQU16TixPQUFPLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQ3NOLFNBQVMsQ0FBQztZQUFFWCxNQUFNO1lBQVMsR0FBRzFHLFVBQVVDLFFBQVEsQ0FBQ2xHLFFBQVE7UUFBQztJQUMxRTtJQUNBME4sS0FBSzFOLE9BQU8sRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQUVYLE1BQU07WUFBUSxHQUFHMUcsVUFBVUMsUUFBUSxDQUFDbEcsUUFBUTtRQUFDO0lBQ3pFO0lBQ0EyTixLQUFLM04sT0FBTyxFQUFFO1FBQ1YsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFBRVgsTUFBTTtZQUFRLEdBQUcxRyxVQUFVQyxRQUFRLENBQUNsRyxRQUFRO1FBQUM7SUFDekU7SUFDQTROLE1BQU01TixPQUFPLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQ3NOLFNBQVMsQ0FBQztZQUFFWCxNQUFNO1lBQVMsR0FBRzFHLFVBQVVDLFFBQVEsQ0FBQ2xHLFFBQVE7UUFBQztJQUMxRTtJQUNBNk4sS0FBSzdOLE9BQU8sRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQUVYLE1BQU07WUFBUSxHQUFHMUcsVUFBVUMsUUFBUSxDQUFDbEcsUUFBUTtRQUFDO0lBQ3pFO0lBQ0FvTSxHQUFHeEssT0FBTyxFQUFFO1FBQ1IsT0FBTyxJQUFJLENBQUMwTCxTQUFTLENBQUM7WUFBRVgsTUFBTTtZQUFNLEdBQUcxRyxVQUFVQyxRQUFRLENBQUN0RSxRQUFRO1FBQUM7SUFDdkU7SUFDQWtNLFNBQVNsTSxPQUFPLEVBQUU7UUFDZCxJQUFJd0g7UUFDSixJQUFJLE9BQU94SCxZQUFZLFVBQVU7WUFDN0IsT0FBTyxJQUFJLENBQUMwTCxTQUFTLENBQUM7Z0JBQ2xCWCxNQUFNO2dCQUNOWCxXQUFXO2dCQUNYQyxRQUFRO2dCQUNSak0sU0FBUzRCO1lBQ2I7UUFDSjtRQUNBLE9BQU8sSUFBSSxDQUFDMEwsU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ05YLFdBQVcsT0FBUXBLLENBQUFBLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRb0ssU0FBUyxNQUFNLGNBQWMsT0FBT3BLLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRb0ssU0FBUztZQUNwTEMsUUFBUSxDQUFDN0MsS0FBS3hILFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRcUssTUFBTSxNQUFNLFFBQVE3QyxPQUFPLEtBQUssSUFBSUEsS0FBSztZQUNqSCxHQUFHbkQsVUFBVUMsUUFBUSxDQUFDdEUsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVE1QixPQUFPLENBQUM7UUFDNUY7SUFDSjtJQUNBK00sTUFBTUEsS0FBSyxFQUFFL00sT0FBTyxFQUFFO1FBQ2xCLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ05JLE9BQU9BO1lBQ1AsR0FBRzlHLFVBQVVDLFFBQVEsQ0FBQ2xHLFFBQVE7UUFDbEM7SUFDSjtJQUNBbUMsU0FBU3ZGLEtBQUssRUFBRWdGLE9BQU8sRUFBRTtRQUNyQixPQUFPLElBQUksQ0FBQzBMLFNBQVMsQ0FBQztZQUNsQlgsTUFBTTtZQUNOL1AsT0FBT0E7WUFDUHdGLFVBQVVSLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRUSxRQUFRO1lBQzVFLEdBQUc2RCxVQUFVQyxRQUFRLENBQUN0RSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUTVCLE9BQU8sQ0FBQztRQUM1RjtJQUNKO0lBQ0FxQyxXQUFXekYsS0FBSyxFQUFFb0QsT0FBTyxFQUFFO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ04vUCxPQUFPQTtZQUNQLEdBQUdxSixVQUFVQyxRQUFRLENBQUNsRyxRQUFRO1FBQ2xDO0lBQ0o7SUFDQXNDLFNBQVMxRixLQUFLLEVBQUVvRCxPQUFPLEVBQUU7UUFDckIsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QLE9BQU9BO1lBQ1AsR0FBR3FKLFVBQVVDLFFBQVEsQ0FBQ2xHLFFBQVE7UUFDbEM7SUFDSjtJQUNBK04sSUFBSUMsU0FBUyxFQUFFaE8sT0FBTyxFQUFFO1FBQ3BCLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ04vUCxPQUFPb1I7WUFDUCxHQUFHL0gsVUFBVUMsUUFBUSxDQUFDbEcsUUFBUTtRQUNsQztJQUNKO0lBQ0FpTyxJQUFJQyxTQUFTLEVBQUVsTyxPQUFPLEVBQUU7UUFDcEIsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QLE9BQU9zUjtZQUNQLEdBQUdqSSxVQUFVQyxRQUFRLENBQUNsRyxRQUFRO1FBQ2xDO0lBQ0o7SUFDQVUsT0FBT3lOLEdBQUcsRUFBRW5PLE9BQU8sRUFBRTtRQUNqQixPQUFPLElBQUksQ0FBQ3NOLFNBQVMsQ0FBQztZQUNsQlgsTUFBTTtZQUNOL1AsT0FBT3VSO1lBQ1AsR0FBR2xJLFVBQVVDLFFBQVEsQ0FBQ2xHLFFBQVE7UUFDbEM7SUFDSjtJQUNBOzs7S0FHQyxHQUNEb08sU0FBU3BPLE9BQU8sRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFDK04sR0FBRyxDQUFDLEdBQUc5SCxVQUFVQyxRQUFRLENBQUNsRztJQUMxQztJQUNBa04sT0FBTztRQUNILE9BQU8sSUFBSVgsVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQ2pGLElBQUk7WUFDWm9GLFFBQVE7bUJBQUksSUFBSSxDQUFDcEYsSUFBSSxDQUFDb0YsTUFBTTtnQkFBRTtvQkFBRUMsTUFBTTtnQkFBTzthQUFFO1FBQ25EO0lBQ0o7SUFDQVEsY0FBYztRQUNWLE9BQU8sSUFBSVosVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQ2pGLElBQUk7WUFDWm9GLFFBQVE7bUJBQUksSUFBSSxDQUFDcEYsSUFBSSxDQUFDb0YsTUFBTTtnQkFBRTtvQkFBRUMsTUFBTTtnQkFBYzthQUFFO1FBQzFEO0lBQ0o7SUFDQVMsY0FBYztRQUNWLE9BQU8sSUFBSWIsVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQ2pGLElBQUk7WUFDWm9GLFFBQVE7bUJBQUksSUFBSSxDQUFDcEYsSUFBSSxDQUFDb0YsTUFBTTtnQkFBRTtvQkFBRUMsTUFBTTtnQkFBYzthQUFFO1FBQzFEO0lBQ0o7SUFDQSxJQUFJMEIsYUFBYTtRQUNiLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQy9HLElBQUksQ0FBQ29GLE1BQU0sQ0FBQzdRLElBQUksQ0FBQyxDQUFDeVMsS0FBT0EsR0FBRzNCLElBQUksS0FBSztJQUN2RDtJQUNBLElBQUk0QixVQUFVO1FBQ1YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDakgsSUFBSSxDQUFDb0YsTUFBTSxDQUFDN1EsSUFBSSxDQUFDLENBQUN5UyxLQUFPQSxHQUFHM0IsSUFBSSxLQUFLO0lBQ3ZEO0lBQ0EsSUFBSTZCLFFBQVE7UUFDUixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUNsSCxJQUFJLENBQUNvRixNQUFNLENBQUM3USxJQUFJLENBQUMsQ0FBQ3lTLEtBQU9BLEdBQUczQixJQUFJLEtBQUs7SUFDdkQ7SUFDQSxJQUFJOEIsVUFBVTtRQUNWLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQ25ILElBQUksQ0FBQ29GLE1BQU0sQ0FBQzdRLElBQUksQ0FBQyxDQUFDeVMsS0FBT0EsR0FBRzNCLElBQUksS0FBSztJQUN2RDtJQUNBLElBQUkrQixTQUFTO1FBQ1QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDcEgsSUFBSSxDQUFDb0YsTUFBTSxDQUFDN1EsSUFBSSxDQUFDLENBQUN5UyxLQUFPQSxHQUFHM0IsSUFBSSxLQUFLO0lBQ3ZEO0lBQ0EsSUFBSWdDLFNBQVM7UUFDVCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUNySCxJQUFJLENBQUNvRixNQUFNLENBQUM3USxJQUFJLENBQUMsQ0FBQ3lTLEtBQU9BLEdBQUczQixJQUFJLEtBQUs7SUFDdkQ7SUFDQSxJQUFJaUMsVUFBVTtRQUNWLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQ3RILElBQUksQ0FBQ29GLE1BQU0sQ0FBQzdRLElBQUksQ0FBQyxDQUFDeVMsS0FBT0EsR0FBRzNCLElBQUksS0FBSztJQUN2RDtJQUNBLElBQUlrQyxTQUFTO1FBQ1QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDdkgsSUFBSSxDQUFDb0YsTUFBTSxDQUFDN1EsSUFBSSxDQUFDLENBQUN5UyxLQUFPQSxHQUFHM0IsSUFBSSxLQUFLO0lBQ3ZEO0lBQ0EsSUFBSW1DLE9BQU87UUFDUCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUN4SCxJQUFJLENBQUNvRixNQUFNLENBQUM3USxJQUFJLENBQUMsQ0FBQ3lTLEtBQU9BLEdBQUczQixJQUFJLEtBQUs7SUFDdkQ7SUFDQSxJQUFJcUIsWUFBWTtRQUNaLElBQUlELE1BQU07UUFDVixLQUFLLE1BQU1PLE1BQU0sSUFBSSxDQUFDaEgsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQy9CLElBQUk0QixHQUFHM0IsSUFBSSxLQUFLLE9BQU87Z0JBQ25CLElBQUlvQixRQUFRLFFBQVFPLEdBQUcxUixLQUFLLEdBQUdtUixLQUMzQkEsTUFBTU8sR0FBRzFSLEtBQUs7WUFDdEI7UUFDSjtRQUNBLE9BQU9tUjtJQUNYO0lBQ0EsSUFBSUcsWUFBWTtRQUNaLElBQUlELE1BQU07UUFDVixLQUFLLE1BQU1LLE1BQU0sSUFBSSxDQUFDaEgsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQy9CLElBQUk0QixHQUFHM0IsSUFBSSxLQUFLLE9BQU87Z0JBQ25CLElBQUlzQixRQUFRLFFBQVFLLEdBQUcxUixLQUFLLEdBQUdxUixLQUMzQkEsTUFBTUssR0FBRzFSLEtBQUs7WUFDdEI7UUFDSjtRQUNBLE9BQU9xUjtJQUNYO0FBQ0o7QUFDQTFCLFVBQVVyTCxNQUFNLEdBQUcsQ0FBQ3NDO0lBQ2hCLElBQUk0RjtJQUNKLE9BQU8sSUFBSW1ELFVBQVU7UUFDakJHLFFBQVEsRUFBRTtRQUNWNUMsVUFBVUMsc0JBQXNCd0MsU0FBUztRQUN6Q0MsUUFBUSxDQUFDcEQsS0FBSzVGLFdBQVcsUUFBUUEsV0FBVyxLQUFLLElBQUksS0FBSyxJQUFJQSxPQUFPZ0osTUFBTSxNQUFNLFFBQVFwRCxPQUFPLEtBQUssSUFBSUEsS0FBSztRQUM5RyxHQUFHeEMsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsaUlBQWlJO0FBQ2pJLFNBQVN1TCxtQkFBbUI3VSxHQUFHLEVBQUU4VSxJQUFJO0lBQ2pDLE1BQU1DLGNBQWMsQ0FBQy9VLElBQUkyQyxRQUFRLEdBQUdxUyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFDLEVBQUd4TyxNQUFNO0lBQy9ELE1BQU15TyxlQUFlLENBQUNILEtBQUtuUyxRQUFRLEdBQUdxUyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFDLEVBQUd4TyxNQUFNO0lBQ2pFLE1BQU0wTyxXQUFXSCxjQUFjRSxlQUFlRixjQUFjRTtJQUM1RCxNQUFNRSxTQUFTQyxTQUFTcFYsSUFBSXFWLE9BQU8sQ0FBQ0gsVUFBVXJRLE9BQU8sQ0FBQyxLQUFLO0lBQzNELE1BQU15USxVQUFVRixTQUFTTixLQUFLTyxPQUFPLENBQUNILFVBQVVyUSxPQUFPLENBQUMsS0FBSztJQUM3RCxPQUFPLFNBQVV5USxVQUFXcFQsS0FBS3FULEdBQUcsQ0FBQyxJQUFJTDtBQUM3QztBQUNBLE1BQU1NLGtCQUFrQnhJO0lBQ3BCakksYUFBYztRQUNWLEtBQUssSUFBSTBRO1FBQ1QsSUFBSSxDQUFDNUIsR0FBRyxHQUFHLElBQUksQ0FBQzZCLEdBQUc7UUFDbkIsSUFBSSxDQUFDM0IsR0FBRyxHQUFHLElBQUksQ0FBQzRCLEdBQUc7UUFDbkIsSUFBSSxDQUFDYixJQUFJLEdBQUcsSUFBSSxDQUFDL0wsVUFBVTtJQUMvQjtJQUNBZ0csT0FBT0wsS0FBSyxFQUFFO1FBQ1YsSUFBSSxJQUFJLENBQUN0QixJQUFJLENBQUNrRixNQUFNLEVBQUU7WUFDbEI1RCxNQUFNeEwsSUFBSSxHQUFHbEIsT0FBTzBNLE1BQU14TCxJQUFJO1FBQ2xDO1FBQ0EsTUFBTTBMLGFBQWEsSUFBSSxDQUFDSCxRQUFRLENBQUNDO1FBQ2pDLElBQUlFLGVBQWU1TCxjQUFjTyxNQUFNLEVBQUU7WUFDckMsTUFBTTJHLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRDtZQUNqQ3pFLGtCQUFrQkMsS0FBSztnQkFDbkIvRCxNQUFNM0IsYUFBYTJDLFlBQVk7Z0JBQy9CRSxVQUFVckUsY0FBY08sTUFBTTtnQkFDOUI2RCxVQUFVOEMsSUFBSTBFLFVBQVU7WUFDNUI7WUFDQSxPQUFPN0Q7UUFDWDtRQUNBLElBQUliLE1BQU1wSTtRQUNWLE1BQU02SSxTQUFTLElBQUlKO1FBQ25CLEtBQUssTUFBTThFLFNBQVMsSUFBSSxDQUFDakMsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQ2xDLElBQUluRCxNQUFNb0QsSUFBSSxLQUFLLE9BQU87Z0JBQ3RCLElBQUksQ0FBQzNTLEtBQUtpQyxTQUFTLENBQUMyTSxNQUFNeEwsSUFBSSxHQUFHO29CQUM3QmdILE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO3dCQUMvQkUsVUFBVTt3QkFDVkQsVUFBVTt3QkFDVnRCLFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssT0FBTztnQkFDM0IsTUFBTUUsV0FBV3RELE1BQU03RyxTQUFTLEdBQzFCa0csTUFBTXhMLElBQUksR0FBR21NLE1BQU0zTSxLQUFLLEdBQ3hCZ00sTUFBTXhMLElBQUksSUFBSW1NLE1BQU0zTSxLQUFLO2dCQUMvQixJQUFJaVEsVUFBVTtvQkFDVnpJLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CL0QsTUFBTTNCLGFBQWE2RCxTQUFTO3dCQUM1QkksU0FBUzRHLE1BQU0zTSxLQUFLO3dCQUNwQjRGLE1BQU07d0JBQ05FLFdBQVc2RyxNQUFNN0csU0FBUzt3QkFDMUJELE9BQU87d0JBQ1B6QyxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLE9BQU87Z0JBQzNCLE1BQU1DLFNBQVNyRCxNQUFNN0csU0FBUyxHQUN4QmtHLE1BQU14TCxJQUFJLEdBQUdtTSxNQUFNM00sS0FBSyxHQUN4QmdNLE1BQU14TCxJQUFJLElBQUltTSxNQUFNM00sS0FBSztnQkFDL0IsSUFBSWdRLFFBQVE7b0JBQ1J4SSxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFha0UsT0FBTzt3QkFDMUJDLFNBQVMwRyxNQUFNM00sS0FBSzt3QkFDcEI0RixNQUFNO3dCQUNORSxXQUFXNkcsTUFBTTdHLFNBQVM7d0JBQzFCRCxPQUFPO3dCQUNQekMsU0FBU3VKLE1BQU12SixPQUFPO29CQUMxQjtvQkFDQTZFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSyxJQUFJNkUsTUFBTW9ELElBQUksS0FBSyxjQUFjO2dCQUNsQyxJQUFJb0MsbUJBQW1CbkcsTUFBTXhMLElBQUksRUFBRW1NLE1BQU0zTSxLQUFLLE1BQU0sR0FBRztvQkFDbkR3SCxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhc0UsZUFBZTt3QkFDbENDLFlBQVlzRyxNQUFNM00sS0FBSzt3QkFDdkJvRCxTQUFTdUosTUFBTXZKLE9BQU87b0JBQzFCO29CQUNBNkUsT0FBT0gsS0FBSztnQkFDaEI7WUFDSixPQUNLLElBQUk2RSxNQUFNb0QsSUFBSSxLQUFLLFVBQVU7Z0JBQzlCLElBQUksQ0FBQ3pRLE9BQU9DLFFBQVEsQ0FBQ3lNLE1BQU14TCxJQUFJLEdBQUc7b0JBQzlCZ0gsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNELE9BQU94RTtvQkFDbENELGtCQUFrQkMsS0FBSzt3QkFDbkIvRCxNQUFNM0IsYUFBYXdFLFVBQVU7d0JBQzdCbEQsU0FBU3VKLE1BQU12SixPQUFPO29CQUMxQjtvQkFDQTZFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSztnQkFDRDFLLEtBQUtLLFdBQVcsQ0FBQ2tQO1lBQ3JCO1FBQ0o7UUFDQSxPQUFPO1lBQUUxRSxRQUFRQSxPQUFPakksS0FBSztZQUFFQSxPQUFPZ00sTUFBTXhMLElBQUk7UUFBQztJQUNyRDtJQUNBd1MsSUFBSWhULEtBQUssRUFBRW9ELE9BQU8sRUFBRTtRQUNoQixPQUFPLElBQUksQ0FBQzhQLFFBQVEsQ0FBQyxPQUFPbFQsT0FBTyxNQUFNcUosVUFBVXBKLFFBQVEsQ0FBQ21EO0lBQ2hFO0lBQ0ErUCxHQUFHblQsS0FBSyxFQUFFb0QsT0FBTyxFQUFFO1FBQ2YsT0FBTyxJQUFJLENBQUM4UCxRQUFRLENBQUMsT0FBT2xULE9BQU8sT0FBT3FKLFVBQVVwSixRQUFRLENBQUNtRDtJQUNqRTtJQUNBNlAsSUFBSWpULEtBQUssRUFBRW9ELE9BQU8sRUFBRTtRQUNoQixPQUFPLElBQUksQ0FBQzhQLFFBQVEsQ0FBQyxPQUFPbFQsT0FBTyxNQUFNcUosVUFBVXBKLFFBQVEsQ0FBQ21EO0lBQ2hFO0lBQ0FnUSxHQUFHcFQsS0FBSyxFQUFFb0QsT0FBTyxFQUFFO1FBQ2YsT0FBTyxJQUFJLENBQUM4UCxRQUFRLENBQUMsT0FBT2xULE9BQU8sT0FBT3FKLFVBQVVwSixRQUFRLENBQUNtRDtJQUNqRTtJQUNBOFAsU0FBU25ELElBQUksRUFBRS9QLEtBQUssRUFBRThGLFNBQVMsRUFBRTFDLE9BQU8sRUFBRTtRQUN0QyxPQUFPLElBQUkwUCxVQUFVO1lBQ2pCLEdBQUcsSUFBSSxDQUFDcEksSUFBSTtZQUNab0YsUUFBUTttQkFDRCxJQUFJLENBQUNwRixJQUFJLENBQUNvRixNQUFNO2dCQUNuQjtvQkFDSUM7b0JBQ0EvUDtvQkFDQThGO29CQUNBMUMsU0FBU2lHLFVBQVVwSixRQUFRLENBQUNtRDtnQkFDaEM7YUFDSDtRQUNMO0lBQ0o7SUFDQXNOLFVBQVUvRCxLQUFLLEVBQUU7UUFDYixPQUFPLElBQUltRyxVQUFVO1lBQ2pCLEdBQUcsSUFBSSxDQUFDcEksSUFBSTtZQUNab0YsUUFBUTttQkFBSSxJQUFJLENBQUNwRixJQUFJLENBQUNvRixNQUFNO2dCQUFFbkQ7YUFBTTtRQUN4QztJQUNKO0lBQ0EwRyxJQUFJalEsT0FBTyxFQUFFO1FBQ1QsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTjNNLFNBQVNpRyxVQUFVcEosUUFBUSxDQUFDbUQ7UUFDaEM7SUFDSjtJQUNBa1EsU0FBU2xRLE9BQU8sRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ04vUCxPQUFPO1lBQ1A4RixXQUFXO1lBQ1gxQyxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1FBQ2hDO0lBQ0o7SUFDQW1RLFNBQVNuUSxPQUFPLEVBQUU7UUFDZCxPQUFPLElBQUksQ0FBQ3NOLFNBQVMsQ0FBQztZQUNsQlgsTUFBTTtZQUNOL1AsT0FBTztZQUNQOEYsV0FBVztZQUNYMUMsU0FBU2lHLFVBQVVwSixRQUFRLENBQUNtRDtRQUNoQztJQUNKO0lBQ0FvUSxZQUFZcFEsT0FBTyxFQUFFO1FBQ2pCLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ04vUCxPQUFPO1lBQ1A4RixXQUFXO1lBQ1gxQyxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1FBQ2hDO0lBQ0o7SUFDQXFRLFlBQVlyUSxPQUFPLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QLE9BQU87WUFDUDhGLFdBQVc7WUFDWDFDLFNBQVNpRyxVQUFVcEosUUFBUSxDQUFDbUQ7UUFDaEM7SUFDSjtJQUNBaUQsV0FBV3JHLEtBQUssRUFBRW9ELE9BQU8sRUFBRTtRQUN2QixPQUFPLElBQUksQ0FBQ3NOLFNBQVMsQ0FBQztZQUNsQlgsTUFBTTtZQUNOL1AsT0FBT0E7WUFDUG9ELFNBQVNpRyxVQUFVcEosUUFBUSxDQUFDbUQ7UUFDaEM7SUFDSjtJQUNBc1EsT0FBT3RRLE9BQU8sRUFBRTtRQUNaLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ04zTSxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1FBQ2hDO0lBQ0o7SUFDQXVRLEtBQUt2USxPQUFPLEVBQUU7UUFDVixPQUFPLElBQUksQ0FBQ3NOLFNBQVMsQ0FBQztZQUNsQlgsTUFBTTtZQUNOakssV0FBVztZQUNYOUYsT0FBT1YsT0FBT3NVLGdCQUFnQjtZQUM5QnhRLFNBQVNpRyxVQUFVcEosUUFBUSxDQUFDbUQ7UUFDaEMsR0FBR3NOLFNBQVMsQ0FBQztZQUNUWCxNQUFNO1lBQ05qSyxXQUFXO1lBQ1g5RixPQUFPVixPQUFPdVUsZ0JBQWdCO1lBQzlCelEsU0FBU2lHLFVBQVVwSixRQUFRLENBQUNtRDtRQUNoQztJQUNKO0lBQ0EsSUFBSTBRLFdBQVc7UUFDWCxJQUFJM0MsTUFBTTtRQUNWLEtBQUssTUFBTU8sTUFBTSxJQUFJLENBQUNoSCxJQUFJLENBQUNvRixNQUFNLENBQUU7WUFDL0IsSUFBSTRCLEdBQUczQixJQUFJLEtBQUssT0FBTztnQkFDbkIsSUFBSW9CLFFBQVEsUUFBUU8sR0FBRzFSLEtBQUssR0FBR21SLEtBQzNCQSxNQUFNTyxHQUFHMVIsS0FBSztZQUN0QjtRQUNKO1FBQ0EsT0FBT21SO0lBQ1g7SUFDQSxJQUFJNEMsV0FBVztRQUNYLElBQUkxQyxNQUFNO1FBQ1YsS0FBSyxNQUFNSyxNQUFNLElBQUksQ0FBQ2hILElBQUksQ0FBQ29GLE1BQU0sQ0FBRTtZQUMvQixJQUFJNEIsR0FBRzNCLElBQUksS0FBSyxPQUFPO2dCQUNuQixJQUFJc0IsUUFBUSxRQUFRSyxHQUFHMVIsS0FBSyxHQUFHcVIsS0FDM0JBLE1BQU1LLEdBQUcxUixLQUFLO1lBQ3RCO1FBQ0o7UUFDQSxPQUFPcVI7SUFDWDtJQUNBLElBQUkyQyxRQUFRO1FBQ1IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDdEosSUFBSSxDQUFDb0YsTUFBTSxDQUFDN1EsSUFBSSxDQUFDLENBQUN5UyxLQUFPQSxHQUFHM0IsSUFBSSxLQUFLLFNBQzlDMkIsR0FBRzNCLElBQUksS0FBSyxnQkFBZ0IzUyxLQUFLaUMsU0FBUyxDQUFDcVMsR0FBRzFSLEtBQUs7SUFDNUQ7SUFDQSxJQUFJVCxXQUFXO1FBQ1gsSUFBSThSLE1BQU0sTUFBTUYsTUFBTTtRQUN0QixLQUFLLE1BQU1PLE1BQU0sSUFBSSxDQUFDaEgsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQy9CLElBQUk0QixHQUFHM0IsSUFBSSxLQUFLLFlBQ1oyQixHQUFHM0IsSUFBSSxLQUFLLFNBQ1oyQixHQUFHM0IsSUFBSSxLQUFLLGNBQWM7Z0JBQzFCLE9BQU87WUFDWCxPQUNLLElBQUkyQixHQUFHM0IsSUFBSSxLQUFLLE9BQU87Z0JBQ3hCLElBQUlvQixRQUFRLFFBQVFPLEdBQUcxUixLQUFLLEdBQUdtUixLQUMzQkEsTUFBTU8sR0FBRzFSLEtBQUs7WUFDdEIsT0FDSyxJQUFJMFIsR0FBRzNCLElBQUksS0FBSyxPQUFPO2dCQUN4QixJQUFJc0IsUUFBUSxRQUFRSyxHQUFHMVIsS0FBSyxHQUFHcVIsS0FDM0JBLE1BQU1LLEdBQUcxUixLQUFLO1lBQ3RCO1FBQ0o7UUFDQSxPQUFPVixPQUFPQyxRQUFRLENBQUM0UixRQUFRN1IsT0FBT0MsUUFBUSxDQUFDOFI7SUFDbkQ7QUFDSjtBQUNBeUIsVUFBVXhPLE1BQU0sR0FBRyxDQUFDc0M7SUFDaEIsT0FBTyxJQUFJa00sVUFBVTtRQUNqQmhELFFBQVEsRUFBRTtRQUNWNUMsVUFBVUMsc0JBQXNCMkYsU0FBUztRQUN6Q2xELFFBQVEsQ0FBQ2hKLFdBQVcsUUFBUUEsV0FBVyxLQUFLLElBQUksS0FBSyxJQUFJQSxPQUFPZ0osTUFBTSxLQUFLO1FBQzNFLEdBQUc1RixvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNcU4sa0JBQWtCM0o7SUFDcEJqSSxhQUFjO1FBQ1YsS0FBSyxJQUFJMFE7UUFDVCxJQUFJLENBQUM1QixHQUFHLEdBQUcsSUFBSSxDQUFDNkIsR0FBRztRQUNuQixJQUFJLENBQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDNEIsR0FBRztJQUN2QjtJQUNBNUcsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsSUFBSSxJQUFJLENBQUN0QixJQUFJLENBQUNrRixNQUFNLEVBQUU7WUFDbEI1RCxNQUFNeEwsSUFBSSxHQUFHMFQsT0FBT2xJLE1BQU14TCxJQUFJO1FBQ2xDO1FBQ0EsTUFBTTBMLGFBQWEsSUFBSSxDQUFDSCxRQUFRLENBQUNDO1FBQ2pDLElBQUlFLGVBQWU1TCxjQUFjVSxNQUFNLEVBQUU7WUFDckMsTUFBTXdHLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRDtZQUNqQ3pFLGtCQUFrQkMsS0FBSztnQkFDbkIvRCxNQUFNM0IsYUFBYTJDLFlBQVk7Z0JBQy9CRSxVQUFVckUsY0FBY1UsTUFBTTtnQkFDOUIwRCxVQUFVOEMsSUFBSTBFLFVBQVU7WUFDNUI7WUFDQSxPQUFPN0Q7UUFDWDtRQUNBLElBQUliLE1BQU1wSTtRQUNWLE1BQU02SSxTQUFTLElBQUlKO1FBQ25CLEtBQUssTUFBTThFLFNBQVMsSUFBSSxDQUFDakMsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQ2xDLElBQUluRCxNQUFNb0QsSUFBSSxLQUFLLE9BQU87Z0JBQ3RCLE1BQU1FLFdBQVd0RCxNQUFNN0csU0FBUyxHQUMxQmtHLE1BQU14TCxJQUFJLEdBQUdtTSxNQUFNM00sS0FBSyxHQUN4QmdNLE1BQU14TCxJQUFJLElBQUltTSxNQUFNM00sS0FBSztnQkFDL0IsSUFBSWlRLFVBQVU7b0JBQ1Z6SSxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhNkQsU0FBUzt3QkFDNUJDLE1BQU07d0JBQ05HLFNBQVM0RyxNQUFNM00sS0FBSzt3QkFDcEI4RixXQUFXNkcsTUFBTTdHLFNBQVM7d0JBQzFCMUMsU0FBU3VKLE1BQU12SixPQUFPO29CQUMxQjtvQkFDQTZFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSyxJQUFJNkUsTUFBTW9ELElBQUksS0FBSyxPQUFPO2dCQUMzQixNQUFNQyxTQUFTckQsTUFBTTdHLFNBQVMsR0FDeEJrRyxNQUFNeEwsSUFBSSxHQUFHbU0sTUFBTTNNLEtBQUssR0FDeEJnTSxNQUFNeEwsSUFBSSxJQUFJbU0sTUFBTTNNLEtBQUs7Z0JBQy9CLElBQUlnUSxRQUFRO29CQUNSeEksTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNELE9BQU94RTtvQkFDbENELGtCQUFrQkMsS0FBSzt3QkFDbkIvRCxNQUFNM0IsYUFBYWtFLE9BQU87d0JBQzFCSixNQUFNO3dCQUNOSyxTQUFTMEcsTUFBTTNNLEtBQUs7d0JBQ3BCOEYsV0FBVzZHLE1BQU03RyxTQUFTO3dCQUMxQjFDLFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssY0FBYztnQkFDbEMsSUFBSS9ELE1BQU14TCxJQUFJLEdBQUdtTSxNQUFNM00sS0FBSyxLQUFLa1UsT0FBTyxJQUFJO29CQUN4QzFNLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CL0QsTUFBTTNCLGFBQWFzRSxlQUFlO3dCQUNsQ0MsWUFBWXNHLE1BQU0zTSxLQUFLO3dCQUN2Qm9ELFNBQVN1SixNQUFNdkosT0FBTztvQkFDMUI7b0JBQ0E2RSxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0s7Z0JBQ0QxSyxLQUFLSyxXQUFXLENBQUNrUDtZQUNyQjtRQUNKO1FBQ0EsT0FBTztZQUFFMUUsUUFBUUEsT0FBT2pJLEtBQUs7WUFBRUEsT0FBT2dNLE1BQU14TCxJQUFJO1FBQUM7SUFDckQ7SUFDQXdTLElBQUloVCxLQUFLLEVBQUVvRCxPQUFPLEVBQUU7UUFDaEIsT0FBTyxJQUFJLENBQUM4UCxRQUFRLENBQUMsT0FBT2xULE9BQU8sTUFBTXFKLFVBQVVwSixRQUFRLENBQUNtRDtJQUNoRTtJQUNBK1AsR0FBR25ULEtBQUssRUFBRW9ELE9BQU8sRUFBRTtRQUNmLE9BQU8sSUFBSSxDQUFDOFAsUUFBUSxDQUFDLE9BQU9sVCxPQUFPLE9BQU9xSixVQUFVcEosUUFBUSxDQUFDbUQ7SUFDakU7SUFDQTZQLElBQUlqVCxLQUFLLEVBQUVvRCxPQUFPLEVBQUU7UUFDaEIsT0FBTyxJQUFJLENBQUM4UCxRQUFRLENBQUMsT0FBT2xULE9BQU8sTUFBTXFKLFVBQVVwSixRQUFRLENBQUNtRDtJQUNoRTtJQUNBZ1EsR0FBR3BULEtBQUssRUFBRW9ELE9BQU8sRUFBRTtRQUNmLE9BQU8sSUFBSSxDQUFDOFAsUUFBUSxDQUFDLE9BQU9sVCxPQUFPLE9BQU9xSixVQUFVcEosUUFBUSxDQUFDbUQ7SUFDakU7SUFDQThQLFNBQVNuRCxJQUFJLEVBQUUvUCxLQUFLLEVBQUU4RixTQUFTLEVBQUUxQyxPQUFPLEVBQUU7UUFDdEMsT0FBTyxJQUFJNlEsVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQ3ZKLElBQUk7WUFDWm9GLFFBQVE7bUJBQ0QsSUFBSSxDQUFDcEYsSUFBSSxDQUFDb0YsTUFBTTtnQkFDbkI7b0JBQ0lDO29CQUNBL1A7b0JBQ0E4RjtvQkFDQTFDLFNBQVNpRyxVQUFVcEosUUFBUSxDQUFDbUQ7Z0JBQ2hDO2FBQ0g7UUFDTDtJQUNKO0lBQ0FzTixVQUFVL0QsS0FBSyxFQUFFO1FBQ2IsT0FBTyxJQUFJc0gsVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQ3ZKLElBQUk7WUFDWm9GLFFBQVE7bUJBQUksSUFBSSxDQUFDcEYsSUFBSSxDQUFDb0YsTUFBTTtnQkFBRW5EO2FBQU07UUFDeEM7SUFDSjtJQUNBMkcsU0FBU2xRLE9BQU8sRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ04vUCxPQUFPa1UsT0FBTztZQUNkcE8sV0FBVztZQUNYMUMsU0FBU2lHLFVBQVVwSixRQUFRLENBQUNtRDtRQUNoQztJQUNKO0lBQ0FtUSxTQUFTblEsT0FBTyxFQUFFO1FBQ2QsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QLE9BQU9rVSxPQUFPO1lBQ2RwTyxXQUFXO1lBQ1gxQyxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1FBQ2hDO0lBQ0o7SUFDQW9RLFlBQVlwUSxPQUFPLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QLE9BQU9rVSxPQUFPO1lBQ2RwTyxXQUFXO1lBQ1gxQyxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1FBQ2hDO0lBQ0o7SUFDQXFRLFlBQVlyUSxPQUFPLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QLE9BQU9rVSxPQUFPO1lBQ2RwTyxXQUFXO1lBQ1gxQyxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1FBQ2hDO0lBQ0o7SUFDQWlELFdBQVdyRyxLQUFLLEVBQUVvRCxPQUFPLEVBQUU7UUFDdkIsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QO1lBQ0FvRCxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1FBQ2hDO0lBQ0o7SUFDQSxJQUFJMFEsV0FBVztRQUNYLElBQUkzQyxNQUFNO1FBQ1YsS0FBSyxNQUFNTyxNQUFNLElBQUksQ0FBQ2hILElBQUksQ0FBQ29GLE1BQU0sQ0FBRTtZQUMvQixJQUFJNEIsR0FBRzNCLElBQUksS0FBSyxPQUFPO2dCQUNuQixJQUFJb0IsUUFBUSxRQUFRTyxHQUFHMVIsS0FBSyxHQUFHbVIsS0FDM0JBLE1BQU1PLEdBQUcxUixLQUFLO1lBQ3RCO1FBQ0o7UUFDQSxPQUFPbVI7SUFDWDtJQUNBLElBQUk0QyxXQUFXO1FBQ1gsSUFBSTFDLE1BQU07UUFDVixLQUFLLE1BQU1LLE1BQU0sSUFBSSxDQUFDaEgsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQy9CLElBQUk0QixHQUFHM0IsSUFBSSxLQUFLLE9BQU87Z0JBQ25CLElBQUlzQixRQUFRLFFBQVFLLEdBQUcxUixLQUFLLEdBQUdxUixLQUMzQkEsTUFBTUssR0FBRzFSLEtBQUs7WUFDdEI7UUFDSjtRQUNBLE9BQU9xUjtJQUNYO0FBQ0o7QUFDQTRDLFVBQVUzUCxNQUFNLEdBQUcsQ0FBQ3NDO0lBQ2hCLElBQUk0RjtJQUNKLE9BQU8sSUFBSXlILFVBQVU7UUFDakJuRSxRQUFRLEVBQUU7UUFDVjVDLFVBQVVDLHNCQUFzQjhHLFNBQVM7UUFDekNyRSxRQUFRLENBQUNwRCxLQUFLNUYsV0FBVyxRQUFRQSxXQUFXLEtBQUssSUFBSSxLQUFLLElBQUlBLE9BQU9nSixNQUFNLE1BQU0sUUFBUXBELE9BQU8sS0FBSyxJQUFJQSxLQUFLO1FBQzlHLEdBQUd4QyxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNdU4sbUJBQW1CN0o7SUFDckIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixJQUFJLElBQUksQ0FBQ3RCLElBQUksQ0FBQ2tGLE1BQU0sRUFBRTtZQUNsQjVELE1BQU14TCxJQUFJLEdBQUc0VCxRQUFRcEksTUFBTXhMLElBQUk7UUFDbkM7UUFDQSxNQUFNMEwsYUFBYSxJQUFJLENBQUNILFFBQVEsQ0FBQ0M7UUFDakMsSUFBSUUsZUFBZTVMLGNBQWNRLE9BQU8sRUFBRTtZQUN0QyxNQUFNMEcsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNEO1lBQ2pDekUsa0JBQWtCQyxLQUFLO2dCQUNuQi9ELE1BQU0zQixhQUFhMkMsWUFBWTtnQkFDL0JFLFVBQVVyRSxjQUFjUSxPQUFPO2dCQUMvQjRELFVBQVU4QyxJQUFJMEUsVUFBVTtZQUM1QjtZQUNBLE9BQU83RDtRQUNYO1FBQ0EsT0FBT1UsR0FBR2lELE1BQU14TCxJQUFJO0lBQ3hCO0FBQ0o7QUFDQTJULFdBQVc3UCxNQUFNLEdBQUcsQ0FBQ3NDO0lBQ2pCLE9BQU8sSUFBSXVOLFdBQVc7UUFDbEJqSCxVQUFVQyxzQkFBc0JnSCxVQUFVO1FBQzFDdkUsUUFBUSxDQUFDaEosV0FBVyxRQUFRQSxXQUFXLEtBQUssSUFBSSxLQUFLLElBQUlBLE9BQU9nSixNQUFNLEtBQUs7UUFDM0UsR0FBRzVGLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU15TixnQkFBZ0IvSjtJQUNsQitCLE9BQU9MLEtBQUssRUFBRTtRQUNWLElBQUksSUFBSSxDQUFDdEIsSUFBSSxDQUFDa0YsTUFBTSxFQUFFO1lBQ2xCNUQsTUFBTXhMLElBQUksR0FBRyxJQUFJbUIsS0FBS3FLLE1BQU14TCxJQUFJO1FBQ3BDO1FBQ0EsTUFBTTBMLGFBQWEsSUFBSSxDQUFDSCxRQUFRLENBQUNDO1FBQ2pDLElBQUlFLGVBQWU1TCxjQUFjc0IsSUFBSSxFQUFFO1lBQ25DLE1BQU00RixNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNzQixJQUFJO2dCQUM1QjhDLFVBQVU4QyxJQUFJMEUsVUFBVTtZQUM1QjtZQUNBLE9BQU83RDtRQUNYO1FBQ0EsSUFBSTFILE1BQU1xTCxNQUFNeEwsSUFBSSxDQUFDOFQsT0FBTyxLQUFLO1lBQzdCLE1BQU05TSxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWFzRCxZQUFZO1lBQ25DO1lBQ0EsT0FBT2lEO1FBQ1g7UUFDQSxNQUFNSixTQUFTLElBQUlKO1FBQ25CLElBQUlMLE1BQU1wSTtRQUNWLEtBQUssTUFBTXVOLFNBQVMsSUFBSSxDQUFDakMsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQ2xDLElBQUluRCxNQUFNb0QsSUFBSSxLQUFLLE9BQU87Z0JBQ3RCLElBQUkvRCxNQUFNeEwsSUFBSSxDQUFDOFQsT0FBTyxLQUFLM0gsTUFBTTNNLEtBQUssRUFBRTtvQkFDcEN3SCxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0QsT0FBT3hFO29CQUNsQ0Qsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhNkQsU0FBUzt3QkFDNUJ2QyxTQUFTdUosTUFBTXZKLE9BQU87d0JBQ3RCMEMsV0FBVzt3QkFDWEQsT0FBTzt3QkFDUEUsU0FBUzRHLE1BQU0zTSxLQUFLO3dCQUNwQjRGLE1BQU07b0JBQ1Y7b0JBQ0FxQyxPQUFPSCxLQUFLO2dCQUNoQjtZQUNKLE9BQ0ssSUFBSTZFLE1BQU1vRCxJQUFJLEtBQUssT0FBTztnQkFDM0IsSUFBSS9ELE1BQU14TCxJQUFJLENBQUM4VCxPQUFPLEtBQUszSCxNQUFNM00sS0FBSyxFQUFFO29CQUNwQ3dILE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRCxPQUFPeEU7b0JBQ2xDRCxrQkFBa0JDLEtBQUs7d0JBQ25CL0QsTUFBTTNCLGFBQWFrRSxPQUFPO3dCQUMxQjVDLFNBQVN1SixNQUFNdkosT0FBTzt3QkFDdEIwQyxXQUFXO3dCQUNYRCxPQUFPO3dCQUNQSSxTQUFTMEcsTUFBTTNNLEtBQUs7d0JBQ3BCNEYsTUFBTTtvQkFDVjtvQkFDQXFDLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSztnQkFDRDFLLEtBQUtLLFdBQVcsQ0FBQ2tQO1lBQ3JCO1FBQ0o7UUFDQSxPQUFPO1lBQ0gxRSxRQUFRQSxPQUFPakksS0FBSztZQUNwQkEsT0FBTyxJQUFJMkIsS0FBS3FLLE1BQU14TCxJQUFJLENBQUM4VCxPQUFPO1FBQ3RDO0lBQ0o7SUFDQTVELFVBQVUvRCxLQUFLLEVBQUU7UUFDYixPQUFPLElBQUkwSCxRQUFRO1lBQ2YsR0FBRyxJQUFJLENBQUMzSixJQUFJO1lBQ1pvRixRQUFRO21CQUFJLElBQUksQ0FBQ3BGLElBQUksQ0FBQ29GLE1BQU07Z0JBQUVuRDthQUFNO1FBQ3hDO0lBQ0o7SUFDQXdFLElBQUlvRCxPQUFPLEVBQUVuUixPQUFPLEVBQUU7UUFDbEIsT0FBTyxJQUFJLENBQUNzTixTQUFTLENBQUM7WUFDbEJYLE1BQU07WUFDTi9QLE9BQU91VSxRQUFRRCxPQUFPO1lBQ3RCbFIsU0FBU2lHLFVBQVVwSixRQUFRLENBQUNtRDtRQUNoQztJQUNKO0lBQ0FpTyxJQUFJbUQsT0FBTyxFQUFFcFIsT0FBTyxFQUFFO1FBQ2xCLE9BQU8sSUFBSSxDQUFDc04sU0FBUyxDQUFDO1lBQ2xCWCxNQUFNO1lBQ04vUCxPQUFPd1UsUUFBUUYsT0FBTztZQUN0QmxSLFNBQVNpRyxVQUFVcEosUUFBUSxDQUFDbUQ7UUFDaEM7SUFDSjtJQUNBLElBQUltUixVQUFVO1FBQ1YsSUFBSXBELE1BQU07UUFDVixLQUFLLE1BQU1PLE1BQU0sSUFBSSxDQUFDaEgsSUFBSSxDQUFDb0YsTUFBTSxDQUFFO1lBQy9CLElBQUk0QixHQUFHM0IsSUFBSSxLQUFLLE9BQU87Z0JBQ25CLElBQUlvQixRQUFRLFFBQVFPLEdBQUcxUixLQUFLLEdBQUdtUixLQUMzQkEsTUFBTU8sR0FBRzFSLEtBQUs7WUFDdEI7UUFDSjtRQUNBLE9BQU9tUixPQUFPLE9BQU8sSUFBSXhQLEtBQUt3UCxPQUFPO0lBQ3pDO0lBQ0EsSUFBSXFELFVBQVU7UUFDVixJQUFJbkQsTUFBTTtRQUNWLEtBQUssTUFBTUssTUFBTSxJQUFJLENBQUNoSCxJQUFJLENBQUNvRixNQUFNLENBQUU7WUFDL0IsSUFBSTRCLEdBQUczQixJQUFJLEtBQUssT0FBTztnQkFDbkIsSUFBSXNCLFFBQVEsUUFBUUssR0FBRzFSLEtBQUssR0FBR3FSLEtBQzNCQSxNQUFNSyxHQUFHMVIsS0FBSztZQUN0QjtRQUNKO1FBQ0EsT0FBT3FSLE9BQU8sT0FBTyxJQUFJMVAsS0FBSzBQLE9BQU87SUFDekM7QUFDSjtBQUNBZ0QsUUFBUS9QLE1BQU0sR0FBRyxDQUFDc0M7SUFDZCxPQUFPLElBQUl5TixRQUFRO1FBQ2Z2RSxRQUFRLEVBQUU7UUFDVkYsUUFBUSxDQUFDaEosV0FBVyxRQUFRQSxXQUFXLEtBQUssSUFBSSxLQUFLLElBQUlBLE9BQU9nSixNQUFNLEtBQUs7UUFDM0UxQyxVQUFVQyxzQkFBc0JrSCxPQUFPO1FBQ3ZDLEdBQUdySyxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNNk4sa0JBQWtCbks7SUFDcEIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNRSxhQUFhLElBQUksQ0FBQ0gsUUFBUSxDQUFDQztRQUNqQyxJQUFJRSxlQUFlNUwsY0FBY1csTUFBTSxFQUFFO1lBQ3JDLE1BQU11RyxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNXLE1BQU07Z0JBQzlCeUQsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxPQUFPVSxHQUFHaUQsTUFBTXhMLElBQUk7SUFDeEI7QUFDSjtBQUNBaVUsVUFBVW5RLE1BQU0sR0FBRyxDQUFDc0M7SUFDaEIsT0FBTyxJQUFJNk4sVUFBVTtRQUNqQnZILFVBQVVDLHNCQUFzQnNILFNBQVM7UUFDekMsR0FBR3pLLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU04TixxQkFBcUJwSztJQUN2QitCLE9BQU9MLEtBQUssRUFBRTtRQUNWLE1BQU1FLGFBQWEsSUFBSSxDQUFDSCxRQUFRLENBQUNDO1FBQ2pDLElBQUlFLGVBQWU1TCxjQUFjbEIsU0FBUyxFQUFFO1lBQ3hDLE1BQU1vSSxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNsQixTQUFTO2dCQUNqQ3NGLFVBQVU4QyxJQUFJMEUsVUFBVTtZQUM1QjtZQUNBLE9BQU83RDtRQUNYO1FBQ0EsT0FBT1UsR0FBR2lELE1BQU14TCxJQUFJO0lBQ3hCO0FBQ0o7QUFDQWtVLGFBQWFwUSxNQUFNLEdBQUcsQ0FBQ3NDO0lBQ25CLE9BQU8sSUFBSThOLGFBQWE7UUFDcEJ4SCxVQUFVQyxzQkFBc0J1SCxZQUFZO1FBQzVDLEdBQUcxSyxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNK04sZ0JBQWdCcks7SUFDbEIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNRSxhQUFhLElBQUksQ0FBQ0gsUUFBUSxDQUFDQztRQUNqQyxJQUFJRSxlQUFlNUwsY0FBY2MsSUFBSSxFQUFFO1lBQ25DLE1BQU1vRyxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNjLElBQUk7Z0JBQzVCc0QsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxPQUFPVSxHQUFHaUQsTUFBTXhMLElBQUk7SUFDeEI7QUFDSjtBQUNBbVUsUUFBUXJRLE1BQU0sR0FBRyxDQUFDc0M7SUFDZCxPQUFPLElBQUkrTixRQUFRO1FBQ2Z6SCxVQUFVQyxzQkFBc0J3SCxPQUFPO1FBQ3ZDLEdBQUczSyxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNZ08sZUFBZXRLO0lBQ2pCakksYUFBYztRQUNWLEtBQUssSUFBSTBRO1FBQ1QsOEdBQThHO1FBQzlHLElBQUksQ0FBQzhCLElBQUksR0FBRztJQUNoQjtJQUNBeEksT0FBT0wsS0FBSyxFQUFFO1FBQ1YsT0FBT2pELEdBQUdpRCxNQUFNeEwsSUFBSTtJQUN4QjtBQUNKO0FBQ0FvVSxPQUFPdFEsTUFBTSxHQUFHLENBQUNzQztJQUNiLE9BQU8sSUFBSWdPLE9BQU87UUFDZDFILFVBQVVDLHNCQUFzQnlILE1BQU07UUFDdEMsR0FBRzVLLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU1rTyxtQkFBbUJ4SztJQUNyQmpJLGFBQWM7UUFDVixLQUFLLElBQUkwUTtRQUNULFdBQVc7UUFDWCxJQUFJLENBQUNnQyxRQUFRLEdBQUc7SUFDcEI7SUFDQTFJLE9BQU9MLEtBQUssRUFBRTtRQUNWLE9BQU9qRCxHQUFHaUQsTUFBTXhMLElBQUk7SUFDeEI7QUFDSjtBQUNBc1UsV0FBV3hRLE1BQU0sR0FBRyxDQUFDc0M7SUFDakIsT0FBTyxJQUFJa08sV0FBVztRQUNsQjVILFVBQVVDLHNCQUFzQjJILFVBQVU7UUFDMUMsR0FBRzlLLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU1vTyxpQkFBaUIxSztJQUNuQitCLE9BQU9MLEtBQUssRUFBRTtRQUNWLE1BQU14RSxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7UUFDakN6RSxrQkFBa0JDLEtBQUs7WUFDbkIvRCxNQUFNM0IsYUFBYTJDLFlBQVk7WUFDL0JFLFVBQVVyRSxjQUFjMlUsS0FBSztZQUM3QnZRLFVBQVU4QyxJQUFJMEUsVUFBVTtRQUM1QjtRQUNBLE9BQU83RDtJQUNYO0FBQ0o7QUFDQTJNLFNBQVMxUSxNQUFNLEdBQUcsQ0FBQ3NDO0lBQ2YsT0FBTyxJQUFJb08sU0FBUztRQUNoQjlILFVBQVVDLHNCQUFzQjZILFFBQVE7UUFDeEMsR0FBR2hMLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU1zTyxnQkFBZ0I1SztJQUNsQitCLE9BQU9MLEtBQUssRUFBRTtRQUNWLE1BQU1FLGFBQWEsSUFBSSxDQUFDSCxRQUFRLENBQUNDO1FBQ2pDLElBQUlFLGVBQWU1TCxjQUFjbEIsU0FBUyxFQUFFO1lBQ3hDLE1BQU1vSSxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWM2VSxJQUFJO2dCQUM1QnpRLFVBQVU4QyxJQUFJMEUsVUFBVTtZQUM1QjtZQUNBLE9BQU83RDtRQUNYO1FBQ0EsT0FBT1UsR0FBR2lELE1BQU14TCxJQUFJO0lBQ3hCO0FBQ0o7QUFDQTBVLFFBQVE1USxNQUFNLEdBQUcsQ0FBQ3NDO0lBQ2QsT0FBTyxJQUFJc08sUUFBUTtRQUNmaEksVUFBVUMsc0JBQXNCK0gsT0FBTztRQUN2QyxHQUFHbEwsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsTUFBTTJHLGlCQUFpQmpEO0lBQ25CK0IsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTSxFQUFFeEUsR0FBRyxFQUFFUyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUNrRSxtQkFBbUIsQ0FBQ0g7UUFDakQsTUFBTXpCLE1BQU0sSUFBSSxDQUFDRyxJQUFJO1FBQ3JCLElBQUlsRCxJQUFJMEUsVUFBVSxLQUFLNUwsY0FBY1gsS0FBSyxFQUFFO1lBQ3hDNEgsa0JBQWtCQyxLQUFLO2dCQUNuQi9ELE1BQU0zQixhQUFhMkMsWUFBWTtnQkFDL0JFLFVBQVVyRSxjQUFjWCxLQUFLO2dCQUM3QitFLFVBQVU4QyxJQUFJMEUsVUFBVTtZQUM1QjtZQUNBLE9BQU83RDtRQUNYO1FBQ0EsSUFBSWtDLElBQUk2SyxXQUFXLEtBQUssTUFBTTtZQUMxQixNQUFNcEYsU0FBU3hJLElBQUloSCxJQUFJLENBQUNzRCxNQUFNLEdBQUd5RyxJQUFJNkssV0FBVyxDQUFDcFYsS0FBSztZQUN0RCxNQUFNaVEsV0FBV3pJLElBQUloSCxJQUFJLENBQUNzRCxNQUFNLEdBQUd5RyxJQUFJNkssV0FBVyxDQUFDcFYsS0FBSztZQUN4RCxJQUFJZ1EsVUFBVUMsVUFBVTtnQkFDcEIxSSxrQkFBa0JDLEtBQUs7b0JBQ25CL0QsTUFBTXVNLFNBQVNsTyxhQUFha0UsT0FBTyxHQUFHbEUsYUFBYTZELFNBQVM7b0JBQzVESSxTQUFVa0ssV0FBVzFGLElBQUk2SyxXQUFXLENBQUNwVixLQUFLLEdBQUdaO29CQUM3QzZHLFNBQVUrSixTQUFTekYsSUFBSTZLLFdBQVcsQ0FBQ3BWLEtBQUssR0FBR1o7b0JBQzNDd0csTUFBTTtvQkFDTkUsV0FBVztvQkFDWEQsT0FBTztvQkFDUHpDLFNBQVNtSCxJQUFJNkssV0FBVyxDQUFDaFMsT0FBTztnQkFDcEM7Z0JBQ0E2RSxPQUFPSCxLQUFLO1lBQ2hCO1FBQ0o7UUFDQSxJQUFJeUMsSUFBSTZHLFNBQVMsS0FBSyxNQUFNO1lBQ3hCLElBQUk1SixJQUFJaEgsSUFBSSxDQUFDc0QsTUFBTSxHQUFHeUcsSUFBSTZHLFNBQVMsQ0FBQ3BSLEtBQUssRUFBRTtnQkFDdkN1SCxrQkFBa0JDLEtBQUs7b0JBQ25CL0QsTUFBTTNCLGFBQWE2RCxTQUFTO29CQUM1QkksU0FBU3dFLElBQUk2RyxTQUFTLENBQUNwUixLQUFLO29CQUM1QjRGLE1BQU07b0JBQ05FLFdBQVc7b0JBQ1hELE9BQU87b0JBQ1B6QyxTQUFTbUgsSUFBSTZHLFNBQVMsQ0FBQ2hPLE9BQU87Z0JBQ2xDO2dCQUNBNkUsT0FBT0gsS0FBSztZQUNoQjtRQUNKO1FBQ0EsSUFBSXlDLElBQUkrRyxTQUFTLEtBQUssTUFBTTtZQUN4QixJQUFJOUosSUFBSWhILElBQUksQ0FBQ3NELE1BQU0sR0FBR3lHLElBQUkrRyxTQUFTLENBQUN0UixLQUFLLEVBQUU7Z0JBQ3ZDdUgsa0JBQWtCQyxLQUFLO29CQUNuQi9ELE1BQU0zQixhQUFha0UsT0FBTztvQkFDMUJDLFNBQVNzRSxJQUFJK0csU0FBUyxDQUFDdFIsS0FBSztvQkFDNUI0RixNQUFNO29CQUNORSxXQUFXO29CQUNYRCxPQUFPO29CQUNQekMsU0FBU21ILElBQUkrRyxTQUFTLENBQUNsTyxPQUFPO2dCQUNsQztnQkFDQTZFLE9BQU9ILEtBQUs7WUFDaEI7UUFDSjtRQUNBLElBQUlOLElBQUlDLE1BQU0sQ0FBQ2dGLEtBQUssRUFBRTtZQUNsQixPQUFPckQsUUFBUWlNLEdBQUcsQ0FBQzttQkFBSTdOLElBQUloSCxJQUFJO2FBQUMsQ0FBQ2pDLEdBQUcsQ0FBQyxDQUFDUixNQUFNaUc7Z0JBQ3hDLE9BQU91RyxJQUFJM0UsSUFBSSxDQUFDMEcsV0FBVyxDQUFDLElBQUkvQyxtQkFBbUIvQixLQUFLekosTUFBTXlKLElBQUkzRCxJQUFJLEVBQUVHO1lBQzVFLElBQUkzQyxJQUFJLENBQUMsQ0FBQ3dJO2dCQUNOLE9BQU9oQyxZQUFZRyxVQUFVLENBQUNDLFFBQVE0QjtZQUMxQztRQUNKO1FBQ0EsTUFBTUEsU0FBUztlQUFJckMsSUFBSWhILElBQUk7U0FBQyxDQUFDakMsR0FBRyxDQUFDLENBQUNSLE1BQU1pRztZQUNwQyxPQUFPdUcsSUFBSTNFLElBQUksQ0FBQ3dHLFVBQVUsQ0FBQyxJQUFJN0MsbUJBQW1CL0IsS0FBS3pKLE1BQU15SixJQUFJM0QsSUFBSSxFQUFFRztRQUMzRTtRQUNBLE9BQU82RCxZQUFZRyxVQUFVLENBQUNDLFFBQVE0QjtJQUMxQztJQUNBLElBQUl5TCxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUM1SyxJQUFJLENBQUM5RSxJQUFJO0lBQ3pCO0lBQ0F1TCxJQUFJQyxTQUFTLEVBQUVoTyxPQUFPLEVBQUU7UUFDcEIsT0FBTyxJQUFJbUssU0FBUztZQUNoQixHQUFHLElBQUksQ0FBQzdDLElBQUk7WUFDWjBHLFdBQVc7Z0JBQUVwUixPQUFPb1I7Z0JBQVdoTyxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1lBQVM7UUFDeEU7SUFDSjtJQUNBaU8sSUFBSUMsU0FBUyxFQUFFbE8sT0FBTyxFQUFFO1FBQ3BCLE9BQU8sSUFBSW1LLFNBQVM7WUFDaEIsR0FBRyxJQUFJLENBQUM3QyxJQUFJO1lBQ1o0RyxXQUFXO2dCQUFFdFIsT0FBT3NSO2dCQUFXbE8sU0FBU2lHLFVBQVVwSixRQUFRLENBQUNtRDtZQUFTO1FBQ3hFO0lBQ0o7SUFDQVUsT0FBT3lOLEdBQUcsRUFBRW5PLE9BQU8sRUFBRTtRQUNqQixPQUFPLElBQUltSyxTQUFTO1lBQ2hCLEdBQUcsSUFBSSxDQUFDN0MsSUFBSTtZQUNaMEssYUFBYTtnQkFBRXBWLE9BQU91UjtnQkFBS25PLFNBQVNpRyxVQUFVcEosUUFBUSxDQUFDbUQ7WUFBUztRQUNwRTtJQUNKO0lBQ0FvTyxTQUFTcE8sT0FBTyxFQUFFO1FBQ2QsT0FBTyxJQUFJLENBQUMrTixHQUFHLENBQUMsR0FBRy9OO0lBQ3ZCO0FBQ0o7QUFDQW1LLFNBQVNqSixNQUFNLEdBQUcsQ0FBQzJJLFFBQVFyRztJQUN2QixPQUFPLElBQUkyRyxTQUFTO1FBQ2hCM0gsTUFBTXFIO1FBQ05tRSxXQUFXO1FBQ1hFLFdBQVc7UUFDWDhELGFBQWE7UUFDYmxJLFVBQVVDLHNCQUFzQkksUUFBUTtRQUN4QyxHQUFHdkQsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsU0FBUzJPLGVBQWV0SSxNQUFNO0lBQzFCLElBQUlBLGtCQUFrQnVJLFdBQVc7UUFDN0IsTUFBTUMsV0FBVyxDQUFDO1FBQ2xCLElBQUssTUFBTTdXLE9BQU9xTyxPQUFPeUksS0FBSyxDQUFFO1lBQzVCLE1BQU1DLGNBQWMxSSxPQUFPeUksS0FBSyxDQUFDOVcsSUFBSTtZQUNyQzZXLFFBQVEsQ0FBQzdXLElBQUksR0FBR3lPLFlBQVkvSSxNQUFNLENBQUNpUixlQUFlSTtRQUN0RDtRQUNBLE9BQU8sSUFBSUgsVUFBVTtZQUNqQixHQUFHdkksT0FBT3ZDLElBQUk7WUFDZGdMLE9BQU8sSUFBTUQ7UUFDakI7SUFDSixPQUNLLElBQUl4SSxrQkFBa0JNLFVBQVU7UUFDakMsT0FBTyxJQUFJQSxTQUFTO1lBQ2hCLEdBQUdOLE9BQU92QyxJQUFJO1lBQ2Q5RSxNQUFNMlAsZUFBZXRJLE9BQU9xSSxPQUFPO1FBQ3ZDO0lBQ0osT0FDSyxJQUFJckksa0JBQWtCSSxhQUFhO1FBQ3BDLE9BQU9BLFlBQVkvSSxNQUFNLENBQUNpUixlQUFldEksT0FBTzJJLE1BQU07SUFDMUQsT0FDSyxJQUFJM0ksa0JBQWtCSyxhQUFhO1FBQ3BDLE9BQU9BLFlBQVloSixNQUFNLENBQUNpUixlQUFldEksT0FBTzJJLE1BQU07SUFDMUQsT0FDSyxJQUFJM0ksa0JBQWtCNEksVUFBVTtRQUNqQyxPQUFPQSxTQUFTdlIsTUFBTSxDQUFDMkksT0FBT3BQLEtBQUssQ0FBQ1UsR0FBRyxDQUFDLENBQUNSLE9BQVN3WCxlQUFleFg7SUFDckUsT0FDSztRQUNELE9BQU9rUDtJQUNYO0FBQ0o7QUFDQSxNQUFNdUksa0JBQWtCbEw7SUFDcEJqSSxhQUFjO1FBQ1YsS0FBSyxJQUFJMFE7UUFDVCxJQUFJLENBQUMrQyxPQUFPLEdBQUc7UUFDZjs7O1NBR0MsR0FDRCxJQUFJLENBQUNDLFNBQVMsR0FBRyxJQUFJLENBQUNDLFdBQVc7UUFDakMsVUFBVTtRQUNWLHNDQUFzQztRQUN0QyxxQ0FBcUM7UUFDckMsNkVBQTZFO1FBQzdFLHFDQUFxQztRQUNyQyxpQ0FBaUM7UUFDakMsb0JBQW9CO1FBQ3BCLGlCQUFpQjtRQUNqQixRQUFRO1FBQ1Isb0NBQW9DO1FBQ3BDLDRFQUE0RTtRQUM1RSxvQ0FBb0M7UUFDcEMsZ0NBQWdDO1FBQ2hDLG1CQUFtQjtRQUNuQixpQkFBaUI7UUFDakIsT0FBTztRQUNQLEtBQUs7UUFDTCwrQkFBK0I7UUFDL0IsZ0JBQWdCO1FBQ2hCLGtDQUFrQztRQUNsQyxpQkFBaUI7UUFDakIsY0FBYztRQUNkLGVBQWU7UUFDZixhQUFhO1FBQ2IsTUFBTTtRQUNOLDJCQUEyQjtRQUMzQixvQkFBb0I7UUFDcEIsc0JBQXNCO1FBQ3RCLDhCQUE4QjtRQUM5Qix5QkFBeUI7UUFDekIsVUFBVTtRQUNWLGVBQWU7UUFDZixJQUFJO1FBQ0o7O1lBRUksR0FDSixJQUFJLENBQUNDLE9BQU8sR0FBRyxJQUFJLENBQUNDLE1BQU07SUFDOUI7SUFDQUMsYUFBYTtRQUNULElBQUksSUFBSSxDQUFDTCxPQUFPLEtBQUssTUFDakIsT0FBTyxJQUFJLENBQUNBLE9BQU87UUFDdkIsTUFBTUosUUFBUSxJQUFJLENBQUNoTCxJQUFJLENBQUNnTCxLQUFLO1FBQzdCLE1BQU1oWCxPQUFPdEIsS0FBS2MsVUFBVSxDQUFDd1g7UUFDN0IsT0FBUSxJQUFJLENBQUNJLE9BQU8sR0FBRztZQUFFSjtZQUFPaFg7UUFBSztJQUN6QztJQUNBMk4sT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTUUsYUFBYSxJQUFJLENBQUNILFFBQVEsQ0FBQ0M7UUFDakMsSUFBSUUsZUFBZTVMLGNBQWMzQixNQUFNLEVBQUU7WUFDckMsTUFBTTZJLE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRDtZQUNqQ3pFLGtCQUFrQkMsS0FBSztnQkFDbkIvRCxNQUFNM0IsYUFBYTJDLFlBQVk7Z0JBQy9CRSxVQUFVckUsY0FBYzNCLE1BQU07Z0JBQzlCK0YsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxNQUFNLEVBQUVKLE1BQU0sRUFBRVQsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ2pELE1BQU0sRUFBRTBKLEtBQUssRUFBRWhYLE1BQU0wWCxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUNELFVBQVU7UUFDbEQsTUFBTUUsWUFBWSxFQUFFO1FBQ3BCLElBQUksQ0FBRSxLQUFJLENBQUMzTCxJQUFJLENBQUM0TCxRQUFRLFlBQVl0QixZQUNoQyxJQUFJLENBQUN0SyxJQUFJLENBQUM2TCxXQUFXLEtBQUssT0FBTSxHQUFJO1lBQ3BDLElBQUssTUFBTTNYLE9BQU80SSxJQUFJaEgsSUFBSSxDQUFFO2dCQUN4QixJQUFJLENBQUM0VixVQUFVN1EsUUFBUSxDQUFDM0csTUFBTTtvQkFDMUJ5WCxVQUFVclgsSUFBSSxDQUFDSjtnQkFDbkI7WUFDSjtRQUNKO1FBQ0EsTUFBTTJKLFFBQVEsRUFBRTtRQUNoQixLQUFLLE1BQU0zSixPQUFPd1gsVUFBVztZQUN6QixNQUFNSSxlQUFlZCxLQUFLLENBQUM5VyxJQUFJO1lBQy9CLE1BQU1vQixRQUFRd0gsSUFBSWhILElBQUksQ0FBQzVCLElBQUk7WUFDM0IySixNQUFNdkosSUFBSSxDQUFDO2dCQUNQSixLQUFLO29CQUFFcUosUUFBUTtvQkFBU2pJLE9BQU9wQjtnQkFBSTtnQkFDbkNvQixPQUFPd1csYUFBYW5LLE1BQU0sQ0FBQyxJQUFJOUMsbUJBQW1CL0IsS0FBS3hILE9BQU93SCxJQUFJM0QsSUFBSSxFQUFFakY7Z0JBQ3hFZ0ssV0FBV2hLLE9BQU80SSxJQUFJaEgsSUFBSTtZQUM5QjtRQUNKO1FBQ0EsSUFBSSxJQUFJLENBQUNrSyxJQUFJLENBQUM0TCxRQUFRLFlBQVl0QixVQUFVO1lBQ3hDLE1BQU11QixjQUFjLElBQUksQ0FBQzdMLElBQUksQ0FBQzZMLFdBQVc7WUFDekMsSUFBSUEsZ0JBQWdCLGVBQWU7Z0JBQy9CLEtBQUssTUFBTTNYLE9BQU95WCxVQUFXO29CQUN6QjlOLE1BQU12SixJQUFJLENBQUM7d0JBQ1BKLEtBQUs7NEJBQUVxSixRQUFROzRCQUFTakksT0FBT3BCO3dCQUFJO3dCQUNuQ29CLE9BQU87NEJBQUVpSSxRQUFROzRCQUFTakksT0FBT3dILElBQUloSCxJQUFJLENBQUM1QixJQUFJO3dCQUFDO29CQUNuRDtnQkFDSjtZQUNKLE9BQ0ssSUFBSTJYLGdCQUFnQixVQUFVO2dCQUMvQixJQUFJRixVQUFVdlMsTUFBTSxHQUFHLEdBQUc7b0JBQ3RCeUQsa0JBQWtCQyxLQUFLO3dCQUNuQi9ELE1BQU0zQixhQUFhK0MsaUJBQWlCO3dCQUNwQ25HLE1BQU0yWDtvQkFDVjtvQkFDQXBPLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0osT0FDSyxJQUFJeU8sZ0JBQWdCO2lCQUNwQjtnQkFDRCxNQUFNLElBQUk1WSxNQUFNLENBQUMsb0RBQW9ELENBQUM7WUFDMUU7UUFDSixPQUNLO1lBQ0QsMEJBQTBCO1lBQzFCLE1BQU0yWSxXQUFXLElBQUksQ0FBQzVMLElBQUksQ0FBQzRMLFFBQVE7WUFDbkMsS0FBSyxNQUFNMVgsT0FBT3lYLFVBQVc7Z0JBQ3pCLE1BQU1yVyxRQUFRd0gsSUFBSWhILElBQUksQ0FBQzVCLElBQUk7Z0JBQzNCMkosTUFBTXZKLElBQUksQ0FBQztvQkFDUEosS0FBSzt3QkFBRXFKLFFBQVE7d0JBQVNqSSxPQUFPcEI7b0JBQUk7b0JBQ25Db0IsT0FBT3NXLFNBQVNqSyxNQUFNLENBQUMsSUFBSTlDLG1CQUFtQi9CLEtBQUt4SCxPQUFPd0gsSUFBSTNELElBQUksRUFBRWpGLEtBQUssK0NBQStDOztvQkFFeEhnSyxXQUFXaEssT0FBTzRJLElBQUloSCxJQUFJO2dCQUM5QjtZQUNKO1FBQ0o7UUFDQSxJQUFJZ0gsSUFBSUMsTUFBTSxDQUFDZ0YsS0FBSyxFQUFFO1lBQ2xCLE9BQU9yRCxRQUFRbUQsT0FBTyxHQUNqQmxMLElBQUksQ0FBQztnQkFDTixNQUFNbUgsWUFBWSxFQUFFO2dCQUNwQixLQUFLLE1BQU1DLFFBQVFGLE1BQU87b0JBQ3RCLE1BQU0zSixNQUFNLE1BQU02SixLQUFLN0osR0FBRztvQkFDMUI0SixVQUFVeEosSUFBSSxDQUFDO3dCQUNYSjt3QkFDQW9CLE9BQU8sTUFBTXlJLEtBQUt6SSxLQUFLO3dCQUN2QjRJLFdBQVdILEtBQUtHLFNBQVM7b0JBQzdCO2dCQUNKO2dCQUNBLE9BQU9KO1lBQ1gsR0FDS25ILElBQUksQ0FBQyxDQUFDbUg7Z0JBQ1AsT0FBT1gsWUFBWWEsZUFBZSxDQUFDVCxRQUFRTztZQUMvQztRQUNKLE9BQ0s7WUFDRCxPQUFPWCxZQUFZYSxlQUFlLENBQUNULFFBQVFNO1FBQy9DO0lBQ0o7SUFDQSxJQUFJbU4sUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDaEwsSUFBSSxDQUFDZ0wsS0FBSztJQUMxQjtJQUNBZSxPQUFPclQsT0FBTyxFQUFFO1FBQ1ppRyxVQUFVQyxRQUFRO1FBQ2xCLE9BQU8sSUFBSWtNLFVBQVU7WUFDakIsR0FBRyxJQUFJLENBQUM5SyxJQUFJO1lBQ1o2TCxhQUFhO1lBQ2IsR0FBSW5ULFlBQVloRSxZQUNWO2dCQUNFbUYsVUFBVSxDQUFDcEIsT0FBT3FFO29CQUNkLElBQUlnRixJQUFJa0ssSUFBSUMsSUFBSUM7b0JBQ2hCLE1BQU1yUSxlQUFlLENBQUNvUSxLQUFLLENBQUNELEtBQUssQ0FBQ2xLLEtBQUssSUFBSSxDQUFDOUIsSUFBSSxFQUFFbkcsUUFBUSxNQUFNLFFBQVFtUyxPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUczWCxJQUFJLENBQUN5TixJQUFJckosT0FBT3FFLEtBQUtwRSxPQUFPLE1BQU0sUUFBUXVULE9BQU8sS0FBSyxJQUFJQSxLQUFLblAsSUFBSWpCLFlBQVk7b0JBQ25MLElBQUlwRCxNQUFNTSxJQUFJLEtBQUsscUJBQ2YsT0FBTzt3QkFDSEwsU0FBUyxDQUFDd1QsS0FBS3ZOLFVBQVVDLFFBQVEsQ0FBQ2xHLFNBQVNBLE9BQU8sTUFBTSxRQUFRd1QsT0FBTyxLQUFLLElBQUlBLEtBQUtyUTtvQkFDekY7b0JBQ0osT0FBTzt3QkFDSG5ELFNBQVNtRDtvQkFDYjtnQkFDSjtZQUNKLElBQ0UsQ0FBQyxDQUFDO1FBQ1o7SUFDSjtJQUNBc1EsUUFBUTtRQUNKLE9BQU8sSUFBSXJCLFVBQVU7WUFDakIsR0FBRyxJQUFJLENBQUM5SyxJQUFJO1lBQ1o2TCxhQUFhO1FBQ2pCO0lBQ0o7SUFDQVAsY0FBYztRQUNWLE9BQU8sSUFBSVIsVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQzlLLElBQUk7WUFDWjZMLGFBQWE7UUFDakI7SUFDSjtJQUNBLHlCQUF5QjtJQUN6Qiw0Q0FBNEM7SUFDNUMsd0NBQXdDO0lBQ3hDLGlDQUFpQztJQUNqQyxrQkFBa0I7SUFDbEIsMkRBQTJEO0lBQzNELDBCQUEwQjtJQUMxQixzQkFBc0I7SUFDdEIsV0FBVztJQUNYLDZCQUE2QjtJQUM3QixnQkFBZ0I7SUFDaEIsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixPQUFPO0lBQ1BMLE9BQU9ZLFlBQVksRUFBRTtRQUNqQixPQUFPLElBQUl0QixVQUFVO1lBQ2pCLEdBQUcsSUFBSSxDQUFDOUssSUFBSTtZQUNaZ0wsT0FBTyxJQUFPO29CQUNWLEdBQUcsSUFBSSxDQUFDaEwsSUFBSSxDQUFDZ0wsS0FBSyxFQUFFO29CQUNwQixHQUFHb0IsWUFBWTtnQkFDbkI7UUFDSjtJQUNKO0lBQ0E7Ozs7S0FJQyxHQUNEQyxNQUFNQyxPQUFPLEVBQUU7UUFDWCxNQUFNQyxTQUFTLElBQUl6QixVQUFVO1lBQ3pCZSxhQUFhUyxRQUFRdE0sSUFBSSxDQUFDNkwsV0FBVztZQUNyQ0QsVUFBVVUsUUFBUXRNLElBQUksQ0FBQzRMLFFBQVE7WUFDL0JaLE9BQU8sSUFBTztvQkFDVixHQUFHLElBQUksQ0FBQ2hMLElBQUksQ0FBQ2dMLEtBQUssRUFBRTtvQkFDcEIsR0FBR3NCLFFBQVF0TSxJQUFJLENBQUNnTCxLQUFLLEVBQUU7Z0JBQzNCO1lBQ0F4SSxVQUFVQyxzQkFBc0JxSSxTQUFTO1FBQzdDO1FBQ0EsT0FBT3lCO0lBQ1g7SUFDQSxTQUFTO0lBQ1QsbUNBQW1DO0lBQ25DLDRDQUE0QztJQUM1Qyx3QkFBd0I7SUFDeEIsNkVBQTZFO0lBQzdFLHFDQUFxQztJQUNyQyxpQ0FBaUM7SUFDakMsb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixPQUFPO0lBQ1AsdUJBQXVCO0lBQ3ZCLDRFQUE0RTtJQUM1RSxvQ0FBb0M7SUFDcEMsZ0NBQWdDO0lBQ2hDLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsTUFBTTtJQUNOLEtBQUs7SUFDTCxzQkFBc0I7SUFDdEIsZ0JBQWdCO0lBQ2hCLDJEQUEyRDtJQUMzRCxxQ0FBcUM7SUFDckMsa0NBQWtDO0lBQ2xDLGVBQWU7SUFDZixhQUFhO0lBQ2IsTUFBTTtJQUNOLHdDQUF3QztJQUN4Qyw2Q0FBNkM7SUFDN0MsdUNBQXVDO0lBQ3ZDLG1CQUFtQjtJQUNuQix5RUFBeUU7SUFDekUsaURBQWlEO0lBQ2pELGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsSUFBSTtJQUNKQyxPQUFPdFksR0FBRyxFQUFFcU8sTUFBTSxFQUFFO1FBQ2hCLE9BQU8sSUFBSSxDQUFDZ0osT0FBTyxDQUFDO1lBQUUsQ0FBQ3JYLElBQUksRUFBRXFPO1FBQU87SUFDeEM7SUFDQSx3Q0FBd0M7SUFDeEMsc0JBQXNCO0lBQ3RCLGlGQUFpRjtJQUNqRixhQUFhO0lBQ2IsMkRBQTJEO0lBQzNELHFDQUFxQztJQUNyQyxpQ0FBaUM7SUFDakMsTUFBTTtJQUNOLG1EQUFtRDtJQUNuRCw0QkFBNEI7SUFDNUIsOEJBQThCO0lBQzlCLFVBQVU7SUFDVix3Q0FBd0M7SUFDeEMsNkNBQTZDO0lBQzdDLHVDQUF1QztJQUN2QyxtQkFBbUI7SUFDbkIseUVBQXlFO0lBQ3pFLGlEQUFpRDtJQUNqRCxlQUFlO0lBQ2YsbUJBQW1CO0lBQ25CLElBQUk7SUFDSnFKLFNBQVNhLEtBQUssRUFBRTtRQUNaLE9BQU8sSUFBSTNCLFVBQVU7WUFDakIsR0FBRyxJQUFJLENBQUM5SyxJQUFJO1lBQ1o0TCxVQUFVYTtRQUNkO0lBQ0o7SUFDQUMsS0FBS0MsSUFBSSxFQUFFO1FBQ1AsTUFBTTNCLFFBQVEsQ0FBQztRQUNmdFksS0FBS2MsVUFBVSxDQUFDbVosTUFBTUMsT0FBTyxDQUFDLENBQUMxWTtZQUMzQixJQUFJeVksSUFBSSxDQUFDelksSUFBSSxJQUFJLElBQUksQ0FBQzhXLEtBQUssQ0FBQzlXLElBQUksRUFBRTtnQkFDOUI4VyxLQUFLLENBQUM5VyxJQUFJLEdBQUcsSUFBSSxDQUFDOFcsS0FBSyxDQUFDOVcsSUFBSTtZQUNoQztRQUNKO1FBQ0EsT0FBTyxJQUFJNFcsVUFBVTtZQUNqQixHQUFHLElBQUksQ0FBQzlLLElBQUk7WUFDWmdMLE9BQU8sSUFBTUE7UUFDakI7SUFDSjtJQUNBNkIsS0FBS0YsSUFBSSxFQUFFO1FBQ1AsTUFBTTNCLFFBQVEsQ0FBQztRQUNmdFksS0FBS2MsVUFBVSxDQUFDLElBQUksQ0FBQ3dYLEtBQUssRUFBRTRCLE9BQU8sQ0FBQyxDQUFDMVk7WUFDakMsSUFBSSxDQUFDeVksSUFBSSxDQUFDelksSUFBSSxFQUFFO2dCQUNaOFcsS0FBSyxDQUFDOVcsSUFBSSxHQUFHLElBQUksQ0FBQzhXLEtBQUssQ0FBQzlXLElBQUk7WUFDaEM7UUFDSjtRQUNBLE9BQU8sSUFBSTRXLFVBQVU7WUFDakIsR0FBRyxJQUFJLENBQUM5SyxJQUFJO1lBQ1pnTCxPQUFPLElBQU1BO1FBQ2pCO0lBQ0o7SUFDQTs7S0FFQyxHQUNEOEIsY0FBYztRQUNWLE9BQU9qQyxlQUFlLElBQUk7SUFDOUI7SUFDQWtDLFFBQVFKLElBQUksRUFBRTtRQUNWLE1BQU01QixXQUFXLENBQUM7UUFDbEJyWSxLQUFLYyxVQUFVLENBQUMsSUFBSSxDQUFDd1gsS0FBSyxFQUFFNEIsT0FBTyxDQUFDLENBQUMxWTtZQUNqQyxNQUFNK1csY0FBYyxJQUFJLENBQUNELEtBQUssQ0FBQzlXLElBQUk7WUFDbkMsSUFBSXlZLFFBQVEsQ0FBQ0EsSUFBSSxDQUFDelksSUFBSSxFQUFFO2dCQUNwQjZXLFFBQVEsQ0FBQzdXLElBQUksR0FBRytXO1lBQ3BCLE9BQ0s7Z0JBQ0RGLFFBQVEsQ0FBQzdXLElBQUksR0FBRytXLFlBQVl6SyxRQUFRO1lBQ3hDO1FBQ0o7UUFDQSxPQUFPLElBQUlzSyxVQUFVO1lBQ2pCLEdBQUcsSUFBSSxDQUFDOUssSUFBSTtZQUNaZ0wsT0FBTyxJQUFNRDtRQUNqQjtJQUNKO0lBQ0FpQyxTQUFTTCxJQUFJLEVBQUU7UUFDWCxNQUFNNUIsV0FBVyxDQUFDO1FBQ2xCclksS0FBS2MsVUFBVSxDQUFDLElBQUksQ0FBQ3dYLEtBQUssRUFBRTRCLE9BQU8sQ0FBQyxDQUFDMVk7WUFDakMsSUFBSXlZLFFBQVEsQ0FBQ0EsSUFBSSxDQUFDelksSUFBSSxFQUFFO2dCQUNwQjZXLFFBQVEsQ0FBQzdXLElBQUksR0FBRyxJQUFJLENBQUM4VyxLQUFLLENBQUM5VyxJQUFJO1lBQ25DLE9BQ0s7Z0JBQ0QsTUFBTStXLGNBQWMsSUFBSSxDQUFDRCxLQUFLLENBQUM5VyxJQUFJO2dCQUNuQyxJQUFJK1ksV0FBV2hDO2dCQUNmLE1BQU9nQyxvQkFBb0J0SyxZQUFhO29CQUNwQ3NLLFdBQVdBLFNBQVNqTixJQUFJLENBQUNxRCxTQUFTO2dCQUN0QztnQkFDQTBILFFBQVEsQ0FBQzdXLElBQUksR0FBRytZO1lBQ3BCO1FBQ0o7UUFDQSxPQUFPLElBQUluQyxVQUFVO1lBQ2pCLEdBQUcsSUFBSSxDQUFDOUssSUFBSTtZQUNaZ0wsT0FBTyxJQUFNRDtRQUNqQjtJQUNKO0lBQ0FtQyxRQUFRO1FBQ0osT0FBT0MsY0FBY3phLEtBQUtjLFVBQVUsQ0FBQyxJQUFJLENBQUN3WCxLQUFLO0lBQ25EO0FBQ0o7QUFDQUYsVUFBVWxSLE1BQU0sR0FBRyxDQUFDb1IsT0FBTzlPO0lBQ3ZCLE9BQU8sSUFBSTRPLFVBQVU7UUFDakJFLE9BQU8sSUFBTUE7UUFDYmEsYUFBYTtRQUNiRCxVQUFVdEIsU0FBUzFRLE1BQU07UUFDekI0SSxVQUFVQyxzQkFBc0JxSSxTQUFTO1FBQ3pDLEdBQUd4TCxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQTRPLFVBQVVzQyxZQUFZLEdBQUcsQ0FBQ3BDLE9BQU85TztJQUM3QixPQUFPLElBQUk0TyxVQUFVO1FBQ2pCRSxPQUFPLElBQU1BO1FBQ2JhLGFBQWE7UUFDYkQsVUFBVXRCLFNBQVMxUSxNQUFNO1FBQ3pCNEksVUFBVUMsc0JBQXNCcUksU0FBUztRQUN6QyxHQUFHeEwsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0E0TyxVQUFVdUMsVUFBVSxHQUFHLENBQUNyQyxPQUFPOU87SUFDM0IsT0FBTyxJQUFJNE8sVUFBVTtRQUNqQkU7UUFDQWEsYUFBYTtRQUNiRCxVQUFVdEIsU0FBUzFRLE1BQU07UUFDekI0SSxVQUFVQyxzQkFBc0JxSSxTQUFTO1FBQ3pDLEdBQUd4TCxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNOEcsaUJBQWlCcEQ7SUFDbkIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNLEVBQUV4RSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMyRSxtQkFBbUIsQ0FBQ0g7UUFDekMsTUFBTWhILFVBQVUsSUFBSSxDQUFDMEYsSUFBSSxDQUFDMUYsT0FBTztRQUNqQyxTQUFTZ1QsY0FBYzlQLE9BQU87WUFDMUIsa0RBQWtEO1lBQ2xELEtBQUssTUFBTTJCLFVBQVUzQixRQUFTO2dCQUMxQixJQUFJMkIsT0FBT0EsTUFBTSxDQUFDNUIsTUFBTSxLQUFLLFNBQVM7b0JBQ2xDLE9BQU80QixPQUFPQSxNQUFNO2dCQUN4QjtZQUNKO1lBQ0EsS0FBSyxNQUFNQSxVQUFVM0IsUUFBUztnQkFDMUIsSUFBSTJCLE9BQU9BLE1BQU0sQ0FBQzVCLE1BQU0sS0FBSyxTQUFTO29CQUNsQywrQkFBK0I7b0JBQy9CVCxJQUFJQyxNQUFNLENBQUNuRixNQUFNLENBQUN0RCxJQUFJLElBQUk2SyxPQUFPckMsR0FBRyxDQUFDQyxNQUFNLENBQUNuRixNQUFNO29CQUNsRCxPQUFPdUgsT0FBT0EsTUFBTTtnQkFDeEI7WUFDSjtZQUNBLGlCQUFpQjtZQUNqQixNQUFNbkcsY0FBY3dFLFFBQVEzSixHQUFHLENBQUMsQ0FBQ3NMLFNBQVcsSUFBSXpILFNBQVN5SCxPQUFPckMsR0FBRyxDQUFDQyxNQUFNLENBQUNuRixNQUFNO1lBQ2pGaUYsa0JBQWtCQyxLQUFLO2dCQUNuQi9ELE1BQU0zQixhQUFhZ0QsYUFBYTtnQkFDaENwQjtZQUNKO1lBQ0EsT0FBTzJFO1FBQ1g7UUFDQSxJQUFJYixJQUFJQyxNQUFNLENBQUNnRixLQUFLLEVBQUU7WUFDbEIsT0FBT3JELFFBQVFpTSxHQUFHLENBQUNyUSxRQUFRekcsR0FBRyxDQUFDLE9BQU9rUDtnQkFDbEMsTUFBTXdLLFdBQVc7b0JBQ2IsR0FBR3pRLEdBQUc7b0JBQ05DLFFBQVE7d0JBQ0osR0FBR0QsSUFBSUMsTUFBTTt3QkFDYm5GLFFBQVEsRUFBRTtvQkFDZDtvQkFDQWtILFFBQVE7Z0JBQ1o7Z0JBQ0EsT0FBTztvQkFDSEssUUFBUSxNQUFNNEQsT0FBT25CLFdBQVcsQ0FBQzt3QkFDN0I5TCxNQUFNZ0gsSUFBSWhILElBQUk7d0JBQ2RxRCxNQUFNMkQsSUFBSTNELElBQUk7d0JBQ2QyRixRQUFReU87b0JBQ1o7b0JBQ0F6USxLQUFLeVE7Z0JBQ1Q7WUFDSixJQUFJNVcsSUFBSSxDQUFDMlc7UUFDYixPQUNLO1lBQ0QsSUFBSWxRLFFBQVExSTtZQUNaLE1BQU1rRCxTQUFTLEVBQUU7WUFDakIsS0FBSyxNQUFNbUwsVUFBVXpJLFFBQVM7Z0JBQzFCLE1BQU1pVCxXQUFXO29CQUNiLEdBQUd6USxHQUFHO29CQUNOQyxRQUFRO3dCQUNKLEdBQUdELElBQUlDLE1BQU07d0JBQ2JuRixRQUFRLEVBQUU7b0JBQ2Q7b0JBQ0FrSCxRQUFRO2dCQUNaO2dCQUNBLE1BQU1LLFNBQVM0RCxPQUFPckIsVUFBVSxDQUFDO29CQUM3QjVMLE1BQU1nSCxJQUFJaEgsSUFBSTtvQkFDZHFELE1BQU0yRCxJQUFJM0QsSUFBSTtvQkFDZDJGLFFBQVF5TztnQkFDWjtnQkFDQSxJQUFJcE8sT0FBTzVCLE1BQU0sS0FBSyxTQUFTO29CQUMzQixPQUFPNEI7Z0JBQ1gsT0FDSyxJQUFJQSxPQUFPNUIsTUFBTSxLQUFLLFdBQVcsQ0FBQ0gsT0FBTztvQkFDMUNBLFFBQVE7d0JBQUUrQjt3QkFBUXJDLEtBQUt5UTtvQkFBUztnQkFDcEM7Z0JBQ0EsSUFBSUEsU0FBU3hRLE1BQU0sQ0FBQ25GLE1BQU0sQ0FBQ3dCLE1BQU0sRUFBRTtvQkFDL0J4QixPQUFPdEQsSUFBSSxDQUFDaVosU0FBU3hRLE1BQU0sQ0FBQ25GLE1BQU07Z0JBQ3RDO1lBQ0o7WUFDQSxJQUFJd0YsT0FBTztnQkFDUE4sSUFBSUMsTUFBTSxDQUFDbkYsTUFBTSxDQUFDdEQsSUFBSSxJQUFJOEksTUFBTU4sR0FBRyxDQUFDQyxNQUFNLENBQUNuRixNQUFNO2dCQUNqRCxPQUFPd0YsTUFBTStCLE1BQU07WUFDdkI7WUFDQSxNQUFNbkcsY0FBY3BCLE9BQU8vRCxHQUFHLENBQUMsQ0FBQytELFNBQVcsSUFBSUYsU0FBU0U7WUFDeERpRixrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWFnRCxhQUFhO2dCQUNoQ3BCO1lBQ0o7WUFDQSxPQUFPMkU7UUFDWDtJQUNKO0lBQ0EsSUFBSXJELFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQzBGLElBQUksQ0FBQzFGLE9BQU87SUFDNUI7QUFDSjtBQUNBMEksU0FBU3BKLE1BQU0sR0FBRyxDQUFDNFQsT0FBT3RSO0lBQ3RCLE9BQU8sSUFBSThHLFNBQVM7UUFDaEIxSSxTQUFTa1Q7UUFDVGhMLFVBQVVDLHNCQUFzQk8sUUFBUTtRQUN4QyxHQUFHMUQsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EscURBQXFEO0FBQ3JELHFEQUFxRDtBQUNyRCxxREFBcUQ7QUFDckQscURBQXFEO0FBQ3JELHFEQUFxRDtBQUNyRCxxREFBcUQ7QUFDckQscURBQXFEO0FBQ3JELE1BQU11UixtQkFBbUIsQ0FBQ3ZTO0lBQ3RCLElBQUlBLGdCQUFnQndTLFNBQVM7UUFDekIsT0FBT0QsaUJBQWlCdlMsS0FBS3FILE1BQU07SUFDdkMsT0FDSyxJQUFJckgsZ0JBQWdCb0gsWUFBWTtRQUNqQyxPQUFPbUwsaUJBQWlCdlMsS0FBS21JLFNBQVM7SUFDMUMsT0FDSyxJQUFJbkksZ0JBQWdCeVMsWUFBWTtRQUNqQyxPQUFPO1lBQUN6UyxLQUFLNUYsS0FBSztTQUFDO0lBQ3ZCLE9BQ0ssSUFBSTRGLGdCQUFnQjBTLFNBQVM7UUFDOUIsT0FBTzFTLEtBQUtaLE9BQU87SUFDdkIsT0FDSyxJQUFJWSxnQkFBZ0IyUyxlQUFlO1FBQ3BDLG1DQUFtQztRQUNuQyxPQUFPOVosT0FBT0MsSUFBSSxDQUFDa0gsS0FBSzRTLElBQUk7SUFDaEMsT0FDSyxJQUFJNVMsZ0JBQWdCa0ksWUFBWTtRQUNqQyxPQUFPcUssaUJBQWlCdlMsS0FBSzhFLElBQUksQ0FBQ3FELFNBQVM7SUFDL0MsT0FDSyxJQUFJbkksZ0JBQWdCOE8sY0FBYztRQUNuQyxPQUFPO1lBQUN0VjtTQUFVO0lBQ3RCLE9BQ0ssSUFBSXdHLGdCQUFnQitPLFNBQVM7UUFDOUIsT0FBTztZQUFDO1NBQUs7SUFDakIsT0FDSztRQUNELE9BQU87SUFDWDtBQUNKO0FBQ0EsTUFBTThELDhCQUE4Qm5PO0lBQ2hDK0IsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTSxFQUFFeEUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ3pDLElBQUl4RSxJQUFJMEUsVUFBVSxLQUFLNUwsY0FBYzNCLE1BQU0sRUFBRTtZQUN6QzRJLGtCQUFrQkMsS0FBSztnQkFDbkIvRCxNQUFNM0IsYUFBYTJDLFlBQVk7Z0JBQy9CRSxVQUFVckUsY0FBYzNCLE1BQU07Z0JBQzlCK0YsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxNQUFNcVEsZ0JBQWdCLElBQUksQ0FBQ0EsYUFBYTtRQUN4QyxNQUFNQyxxQkFBcUJuUixJQUFJaEgsSUFBSSxDQUFDa1ksY0FBYztRQUNsRCxNQUFNakwsU0FBUyxJQUFJLENBQUNtTCxVQUFVLENBQUNDLEdBQUcsQ0FBQ0Y7UUFDbkMsSUFBSSxDQUFDbEwsUUFBUTtZQUNUbEcsa0JBQWtCQyxLQUFLO2dCQUNuQi9ELE1BQU0zQixhQUFhaUQsMkJBQTJCO2dCQUM5Q0MsU0FBUzlELE1BQU00WCxJQUFJLENBQUMsSUFBSSxDQUFDRixVQUFVLENBQUNsYSxJQUFJO2dCQUN4Q21GLE1BQU07b0JBQUM2VTtpQkFBYztZQUN6QjtZQUNBLE9BQU9yUTtRQUNYO1FBQ0EsSUFBSWIsSUFBSUMsTUFBTSxDQUFDZ0YsS0FBSyxFQUFFO1lBQ2xCLE9BQU9nQixPQUFPbkIsV0FBVyxDQUFDO2dCQUN0QjlMLE1BQU1nSCxJQUFJaEgsSUFBSTtnQkFDZHFELE1BQU0yRCxJQUFJM0QsSUFBSTtnQkFDZDJGLFFBQVFoQztZQUNaO1FBQ0osT0FDSztZQUNELE9BQU9pRyxPQUFPckIsVUFBVSxDQUFDO2dCQUNyQjVMLE1BQU1nSCxJQUFJaEgsSUFBSTtnQkFDZHFELE1BQU0yRCxJQUFJM0QsSUFBSTtnQkFDZDJGLFFBQVFoQztZQUNaO1FBQ0o7SUFDSjtJQUNBLElBQUlrUixnQkFBZ0I7UUFDaEIsT0FBTyxJQUFJLENBQUNoTyxJQUFJLENBQUNnTyxhQUFhO0lBQ2xDO0lBQ0EsSUFBSTFULFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQzBGLElBQUksQ0FBQzFGLE9BQU87SUFDNUI7SUFDQSxJQUFJNFQsYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDbE8sSUFBSSxDQUFDa08sVUFBVTtJQUMvQjtJQUNBOzs7Ozs7O0tBT0MsR0FDRCxPQUFPdFUsT0FBT29VLGFBQWEsRUFBRTFULE9BQU8sRUFBRTRCLE1BQU0sRUFBRTtRQUMxQyx5Q0FBeUM7UUFDekMsTUFBTWdTLGFBQWEsSUFBSXBYO1FBQ3ZCLFFBQVE7UUFDUixLQUFLLE1BQU1vRSxRQUFRWixRQUFTO1lBQ3hCLE1BQU0rVCxzQkFBc0JaLGlCQUFpQnZTLEtBQUs4UCxLQUFLLENBQUNnRCxjQUFjO1lBQ3RFLElBQUksQ0FBQ0sscUJBQXFCO2dCQUN0QixNQUFNLElBQUlwYixNQUFNLENBQUMsZ0NBQWdDLEVBQUUrYSxjQUFjLGlEQUFpRCxDQUFDO1lBQ3ZIO1lBQ0EsS0FBSyxNQUFNMVksU0FBUytZLG9CQUFxQjtnQkFDckMsSUFBSUgsV0FBV0ksR0FBRyxDQUFDaFosUUFBUTtvQkFDdkIsTUFBTSxJQUFJckMsTUFBTSxDQUFDLHVCQUF1QixFQUFFa1MsT0FBTzZJLGVBQWUscUJBQXFCLEVBQUU3SSxPQUFPN1AsT0FBTyxDQUFDO2dCQUMxRztnQkFDQTRZLFdBQVdsWCxHQUFHLENBQUMxQixPQUFPNEY7WUFDMUI7UUFDSjtRQUNBLE9BQU8sSUFBSTZTLHNCQUFzQjtZQUM3QnZMLFVBQVVDLHNCQUFzQnNMLHFCQUFxQjtZQUNyREM7WUFDQTFUO1lBQ0E0VDtZQUNBLEdBQUc1TyxvQkFBb0JwRCxPQUFPO1FBQ2xDO0lBQ0o7QUFDSjtBQUNBLFNBQVNxUyxZQUFZQyxDQUFDLEVBQUVDLENBQUM7SUFDckIsTUFBTUMsUUFBUTdZLGNBQWMyWTtJQUM1QixNQUFNRyxRQUFROVksY0FBYzRZO0lBQzVCLElBQUlELE1BQU1DLEdBQUc7UUFDVCxPQUFPO1lBQUVHLE9BQU87WUFBTTlZLE1BQU0wWTtRQUFFO0lBQ2xDLE9BQ0ssSUFBSUUsVUFBVTlZLGNBQWMzQixNQUFNLElBQUkwYSxVQUFVL1ksY0FBYzNCLE1BQU0sRUFBRTtRQUN2RSxNQUFNNGEsUUFBUW5jLEtBQUtjLFVBQVUsQ0FBQ2liO1FBQzlCLE1BQU1LLGFBQWFwYyxLQUNkYyxVQUFVLENBQUNnYixHQUNYL2EsTUFBTSxDQUFDLENBQUNTLE1BQVEyYSxNQUFNRSxPQUFPLENBQUM3YSxTQUFTLENBQUM7UUFDN0MsTUFBTThhLFNBQVM7WUFBRSxHQUFHUixDQUFDO1lBQUUsR0FBR0MsQ0FBQztRQUFDO1FBQzVCLEtBQUssTUFBTXZhLE9BQU80YSxXQUFZO1lBQzFCLE1BQU1HLGNBQWNWLFlBQVlDLENBQUMsQ0FBQ3RhLElBQUksRUFBRXVhLENBQUMsQ0FBQ3ZhLElBQUk7WUFDOUMsSUFBSSxDQUFDK2EsWUFBWUwsS0FBSyxFQUFFO2dCQUNwQixPQUFPO29CQUFFQSxPQUFPO2dCQUFNO1lBQzFCO1lBQ0FJLE1BQU0sQ0FBQzlhLElBQUksR0FBRythLFlBQVluWixJQUFJO1FBQ2xDO1FBQ0EsT0FBTztZQUFFOFksT0FBTztZQUFNOVksTUFBTWtaO1FBQU87SUFDdkMsT0FDSyxJQUFJTixVQUFVOVksY0FBY1gsS0FBSyxJQUFJMFosVUFBVS9ZLGNBQWNYLEtBQUssRUFBRTtRQUNyRSxJQUFJdVosRUFBRXBWLE1BQU0sS0FBS3FWLEVBQUVyVixNQUFNLEVBQUU7WUFDdkIsT0FBTztnQkFBRXdWLE9BQU87WUFBTTtRQUMxQjtRQUNBLE1BQU1NLFdBQVcsRUFBRTtRQUNuQixJQUFLLElBQUl6QyxRQUFRLEdBQUdBLFFBQVErQixFQUFFcFYsTUFBTSxFQUFFcVQsUUFBUztZQUMzQyxNQUFNMEMsUUFBUVgsQ0FBQyxDQUFDL0IsTUFBTTtZQUN0QixNQUFNMkMsUUFBUVgsQ0FBQyxDQUFDaEMsTUFBTTtZQUN0QixNQUFNd0MsY0FBY1YsWUFBWVksT0FBT0M7WUFDdkMsSUFBSSxDQUFDSCxZQUFZTCxLQUFLLEVBQUU7Z0JBQ3BCLE9BQU87b0JBQUVBLE9BQU87Z0JBQU07WUFDMUI7WUFDQU0sU0FBUzVhLElBQUksQ0FBQzJhLFlBQVluWixJQUFJO1FBQ2xDO1FBQ0EsT0FBTztZQUFFOFksT0FBTztZQUFNOVksTUFBTW9aO1FBQVM7SUFDekMsT0FDSyxJQUFJUixVQUFVOVksY0FBY3NCLElBQUksSUFDakN5WCxVQUFVL1ksY0FBY3NCLElBQUksSUFDNUIsQ0FBQ3NYLE1BQU0sQ0FBQ0MsR0FBRztRQUNYLE9BQU87WUFBRUcsT0FBTztZQUFNOVksTUFBTTBZO1FBQUU7SUFDbEMsT0FDSztRQUNELE9BQU87WUFBRUksT0FBTztRQUFNO0lBQzFCO0FBQ0o7QUFDQSxNQUFNMUwsd0JBQXdCdEQ7SUFDMUIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNLEVBQUUvRCxNQUFNLEVBQUVULEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzJFLG1CQUFtQixDQUFDSDtRQUNqRCxNQUFNK04sZUFBZSxDQUFDQyxZQUFZQztZQUM5QixJQUFJalIsVUFBVWdSLGVBQWVoUixVQUFVaVIsY0FBYztnQkFDakQsT0FBTzVSO1lBQ1g7WUFDQSxNQUFNNE8sU0FBU2dDLFlBQVllLFdBQVdoYSxLQUFLLEVBQUVpYSxZQUFZamEsS0FBSztZQUM5RCxJQUFJLENBQUNpWCxPQUFPcUMsS0FBSyxFQUFFO2dCQUNmL1Isa0JBQWtCQyxLQUFLO29CQUNuQi9ELE1BQU0zQixhQUFhcUUsMEJBQTBCO2dCQUNqRDtnQkFDQSxPQUFPa0M7WUFDWDtZQUNBLElBQUlZLFFBQVErUSxlQUFlL1EsUUFBUWdSLGNBQWM7Z0JBQzdDaFMsT0FBT0gsS0FBSztZQUNoQjtZQUNBLE9BQU87Z0JBQUVHLFFBQVFBLE9BQU9qSSxLQUFLO2dCQUFFQSxPQUFPaVgsT0FBT3pXLElBQUk7WUFBQztRQUN0RDtRQUNBLElBQUlnSCxJQUFJQyxNQUFNLENBQUNnRixLQUFLLEVBQUU7WUFDbEIsT0FBT3JELFFBQVFpTSxHQUFHLENBQUM7Z0JBQ2YsSUFBSSxDQUFDM0ssSUFBSSxDQUFDd1AsSUFBSSxDQUFDNU4sV0FBVyxDQUFDO29CQUN2QjlMLE1BQU1nSCxJQUFJaEgsSUFBSTtvQkFDZHFELE1BQU0yRCxJQUFJM0QsSUFBSTtvQkFDZDJGLFFBQVFoQztnQkFDWjtnQkFDQSxJQUFJLENBQUNrRCxJQUFJLENBQUN5UCxLQUFLLENBQUM3TixXQUFXLENBQUM7b0JBQ3hCOUwsTUFBTWdILElBQUloSCxJQUFJO29CQUNkcUQsTUFBTTJELElBQUkzRCxJQUFJO29CQUNkMkYsUUFBUWhDO2dCQUNaO2FBQ0gsRUFBRW5HLElBQUksQ0FBQyxDQUFDLENBQUM2WSxNQUFNQyxNQUFNLEdBQUtKLGFBQWFHLE1BQU1DO1FBQ2xELE9BQ0s7WUFDRCxPQUFPSixhQUFhLElBQUksQ0FBQ3JQLElBQUksQ0FBQ3dQLElBQUksQ0FBQzlOLFVBQVUsQ0FBQztnQkFDMUM1TCxNQUFNZ0gsSUFBSWhILElBQUk7Z0JBQ2RxRCxNQUFNMkQsSUFBSTNELElBQUk7Z0JBQ2QyRixRQUFRaEM7WUFDWixJQUFJLElBQUksQ0FBQ2tELElBQUksQ0FBQ3lQLEtBQUssQ0FBQy9OLFVBQVUsQ0FBQztnQkFDM0I1TCxNQUFNZ0gsSUFBSWhILElBQUk7Z0JBQ2RxRCxNQUFNMkQsSUFBSTNELElBQUk7Z0JBQ2QyRixRQUFRaEM7WUFDWjtRQUNKO0lBQ0o7QUFDSjtBQUNBb0csZ0JBQWdCdEosTUFBTSxHQUFHLENBQUM0VixNQUFNQyxPQUFPdlQ7SUFDbkMsT0FBTyxJQUFJZ0gsZ0JBQWdCO1FBQ3ZCc00sTUFBTUE7UUFDTkMsT0FBT0E7UUFDUGpOLFVBQVVDLHNCQUFzQlMsZUFBZTtRQUMvQyxHQUFHNUQsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsTUFBTWlQLGlCQUFpQnZMO0lBQ25CK0IsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTSxFQUFFL0QsTUFBTSxFQUFFVCxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMyRSxtQkFBbUIsQ0FBQ0g7UUFDakQsSUFBSXhFLElBQUkwRSxVQUFVLEtBQUs1TCxjQUFjWCxLQUFLLEVBQUU7WUFDeEM0SCxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNYLEtBQUs7Z0JBQzdCK0UsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxJQUFJYixJQUFJaEgsSUFBSSxDQUFDc0QsTUFBTSxHQUFHLElBQUksQ0FBQzRHLElBQUksQ0FBQzdNLEtBQUssQ0FBQ2lHLE1BQU0sRUFBRTtZQUMxQ3lELGtCQUFrQkMsS0FBSztnQkFDbkIvRCxNQUFNM0IsYUFBYTZELFNBQVM7Z0JBQzVCSSxTQUFTLElBQUksQ0FBQzJFLElBQUksQ0FBQzdNLEtBQUssQ0FBQ2lHLE1BQU07Z0JBQy9CZ0MsV0FBVztnQkFDWEQsT0FBTztnQkFDUEQsTUFBTTtZQUNWO1lBQ0EsT0FBT3lDO1FBQ1g7UUFDQSxNQUFNK1IsT0FBTyxJQUFJLENBQUMxUCxJQUFJLENBQUMwUCxJQUFJO1FBQzNCLElBQUksQ0FBQ0EsUUFBUTVTLElBQUloSCxJQUFJLENBQUNzRCxNQUFNLEdBQUcsSUFBSSxDQUFDNEcsSUFBSSxDQUFDN00sS0FBSyxDQUFDaUcsTUFBTSxFQUFFO1lBQ25EeUQsa0JBQWtCQyxLQUFLO2dCQUNuQi9ELE1BQU0zQixhQUFha0UsT0FBTztnQkFDMUJDLFNBQVMsSUFBSSxDQUFDeUUsSUFBSSxDQUFDN00sS0FBSyxDQUFDaUcsTUFBTTtnQkFDL0JnQyxXQUFXO2dCQUNYRCxPQUFPO2dCQUNQRCxNQUFNO1lBQ1Y7WUFDQXFDLE9BQU9ILEtBQUs7UUFDaEI7UUFDQSxNQUFNakssUUFBUTtlQUFJMkosSUFBSWhILElBQUk7U0FBQyxDQUN0QmpDLEdBQUcsQ0FBQyxDQUFDUixNQUFNc2M7WUFDWixNQUFNcE4sU0FBUyxJQUFJLENBQUN2QyxJQUFJLENBQUM3TSxLQUFLLENBQUN3YyxVQUFVLElBQUksSUFBSSxDQUFDM1AsSUFBSSxDQUFDMFAsSUFBSTtZQUMzRCxJQUFJLENBQUNuTixRQUNELE9BQU87WUFDWCxPQUFPQSxPQUFPWixNQUFNLENBQUMsSUFBSTlDLG1CQUFtQi9CLEtBQUt6SixNQUFNeUosSUFBSTNELElBQUksRUFBRXdXO1FBQ3JFLEdBQ0tsYyxNQUFNLENBQUMsQ0FBQ3lKLElBQU0sQ0FBQyxDQUFDQSxJQUFJLGVBQWU7UUFDeEMsSUFBSUosSUFBSUMsTUFBTSxDQUFDZ0YsS0FBSyxFQUFFO1lBQ2xCLE9BQU9yRCxRQUFRaU0sR0FBRyxDQUFDeFgsT0FBT3dELElBQUksQ0FBQyxDQUFDNkc7Z0JBQzVCLE9BQU9MLFlBQVlHLFVBQVUsQ0FBQ0MsUUFBUUM7WUFDMUM7UUFDSixPQUNLO1lBQ0QsT0FBT0wsWUFBWUcsVUFBVSxDQUFDQyxRQUFRcEs7UUFDMUM7SUFDSjtJQUNBLElBQUlBLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQzZNLElBQUksQ0FBQzdNLEtBQUs7SUFDMUI7SUFDQXVjLEtBQUtBLElBQUksRUFBRTtRQUNQLE9BQU8sSUFBSXZFLFNBQVM7WUFDaEIsR0FBRyxJQUFJLENBQUNuTCxJQUFJO1lBQ1owUDtRQUNKO0lBQ0o7QUFDSjtBQUNBdkUsU0FBU3ZSLE1BQU0sR0FBRyxDQUFDZ1csU0FBUzFUO0lBQ3hCLElBQUksQ0FBQzFGLE1BQU1DLE9BQU8sQ0FBQ21aLFVBQVU7UUFDekIsTUFBTSxJQUFJM2MsTUFBTTtJQUNwQjtJQUNBLE9BQU8sSUFBSWtZLFNBQVM7UUFDaEJoWSxPQUFPeWM7UUFDUHBOLFVBQVVDLHNCQUFzQjBJLFFBQVE7UUFDeEN1RSxNQUFNO1FBQ04sR0FBR3BRLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU0yVCxrQkFBa0JqUTtJQUNwQixJQUFJa1EsWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDOVAsSUFBSSxDQUFDK1AsT0FBTztJQUM1QjtJQUNBLElBQUlDLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQ2hRLElBQUksQ0FBQ2lRLFNBQVM7SUFDOUI7SUFDQXRPLE9BQU9MLEtBQUssRUFBRTtRQUNWLE1BQU0sRUFBRS9ELE1BQU0sRUFBRVQsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ2pELElBQUl4RSxJQUFJMEUsVUFBVSxLQUFLNUwsY0FBYzNCLE1BQU0sRUFBRTtZQUN6QzRJLGtCQUFrQkMsS0FBSztnQkFDbkIvRCxNQUFNM0IsYUFBYTJDLFlBQVk7Z0JBQy9CRSxVQUFVckUsY0FBYzNCLE1BQU07Z0JBQzlCK0YsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxNQUFNRSxRQUFRLEVBQUU7UUFDaEIsTUFBTWtTLFVBQVUsSUFBSSxDQUFDL1AsSUFBSSxDQUFDK1AsT0FBTztRQUNqQyxNQUFNRSxZQUFZLElBQUksQ0FBQ2pRLElBQUksQ0FBQ2lRLFNBQVM7UUFDckMsSUFBSyxNQUFNL2IsT0FBTzRJLElBQUloSCxJQUFJLENBQUU7WUFDeEIrSCxNQUFNdkosSUFBSSxDQUFDO2dCQUNQSixLQUFLNmIsUUFBUXBPLE1BQU0sQ0FBQyxJQUFJOUMsbUJBQW1CL0IsS0FBSzVJLEtBQUs0SSxJQUFJM0QsSUFBSSxFQUFFakY7Z0JBQy9Eb0IsT0FBTzJhLFVBQVV0TyxNQUFNLENBQUMsSUFBSTlDLG1CQUFtQi9CLEtBQUtBLElBQUloSCxJQUFJLENBQUM1QixJQUFJLEVBQUU0SSxJQUFJM0QsSUFBSSxFQUFFakY7WUFDakY7UUFDSjtRQUNBLElBQUk0SSxJQUFJQyxNQUFNLENBQUNnRixLQUFLLEVBQUU7WUFDbEIsT0FBTzVFLFlBQVlTLGdCQUFnQixDQUFDTCxRQUFRTTtRQUNoRCxPQUNLO1lBQ0QsT0FBT1YsWUFBWWEsZUFBZSxDQUFDVCxRQUFRTTtRQUMvQztJQUNKO0lBQ0EsSUFBSStNLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQzVLLElBQUksQ0FBQ2lRLFNBQVM7SUFDOUI7SUFDQSxPQUFPclcsT0FBT2xFLEtBQUssRUFBRUMsTUFBTSxFQUFFdWEsS0FBSyxFQUFFO1FBQ2hDLElBQUl2YSxrQkFBa0JpSyxTQUFTO1lBQzNCLE9BQU8sSUFBSWlRLFVBQVU7Z0JBQ2pCRSxTQUFTcmE7Z0JBQ1R1YSxXQUFXdGE7Z0JBQ1g2TSxVQUFVQyxzQkFBc0JvTixTQUFTO2dCQUN6QyxHQUFHdlEsb0JBQW9CNFEsTUFBTTtZQUNqQztRQUNKO1FBQ0EsT0FBTyxJQUFJTCxVQUFVO1lBQ2pCRSxTQUFTOUssVUFBVXJMLE1BQU07WUFDekJxVyxXQUFXdmE7WUFDWDhNLFVBQVVDLHNCQUFzQm9OLFNBQVM7WUFDekMsR0FBR3ZRLG9CQUFvQjNKLE9BQU87UUFDbEM7SUFDSjtBQUNKO0FBQ0EsTUFBTXdhLGVBQWV2UTtJQUNqQixJQUFJa1EsWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDOVAsSUFBSSxDQUFDK1AsT0FBTztJQUM1QjtJQUNBLElBQUlDLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQ2hRLElBQUksQ0FBQ2lRLFNBQVM7SUFDOUI7SUFDQXRPLE9BQU9MLEtBQUssRUFBRTtRQUNWLE1BQU0sRUFBRS9ELE1BQU0sRUFBRVQsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ2pELElBQUl4RSxJQUFJMEUsVUFBVSxLQUFLNUwsY0FBYy9CLEdBQUcsRUFBRTtZQUN0Q2dKLGtCQUFrQkMsS0FBSztnQkFDbkIvRCxNQUFNM0IsYUFBYTJDLFlBQVk7Z0JBQy9CRSxVQUFVckUsY0FBYy9CLEdBQUc7Z0JBQzNCbUcsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxNQUFNb1MsVUFBVSxJQUFJLENBQUMvUCxJQUFJLENBQUMrUCxPQUFPO1FBQ2pDLE1BQU1FLFlBQVksSUFBSSxDQUFDalEsSUFBSSxDQUFDaVEsU0FBUztRQUNyQyxNQUFNcFMsUUFBUTtlQUFJZixJQUFJaEgsSUFBSSxDQUFDc2EsT0FBTztTQUFHLENBQUN2YyxHQUFHLENBQUMsQ0FBQyxDQUFDSyxLQUFLb0IsTUFBTSxFQUFFbVg7WUFDckQsT0FBTztnQkFDSHZZLEtBQUs2YixRQUFRcE8sTUFBTSxDQUFDLElBQUk5QyxtQkFBbUIvQixLQUFLNUksS0FBSzRJLElBQUkzRCxJQUFJLEVBQUU7b0JBQUNzVDtvQkFBTztpQkFBTTtnQkFDN0VuWCxPQUFPMmEsVUFBVXRPLE1BQU0sQ0FBQyxJQUFJOUMsbUJBQW1CL0IsS0FBS3hILE9BQU93SCxJQUFJM0QsSUFBSSxFQUFFO29CQUFDc1Q7b0JBQU87aUJBQVE7WUFDekY7UUFDSjtRQUNBLElBQUkzUCxJQUFJQyxNQUFNLENBQUNnRixLQUFLLEVBQUU7WUFDbEIsTUFBTXNPLFdBQVcsSUFBSXZaO1lBQ3JCLE9BQU80SCxRQUFRbUQsT0FBTyxHQUFHbEwsSUFBSSxDQUFDO2dCQUMxQixLQUFLLE1BQU1vSCxRQUFRRixNQUFPO29CQUN0QixNQUFNM0osTUFBTSxNQUFNNkosS0FBSzdKLEdBQUc7b0JBQzFCLE1BQU1vQixRQUFRLE1BQU15SSxLQUFLekksS0FBSztvQkFDOUIsSUFBSXBCLElBQUlxSixNQUFNLEtBQUssYUFBYWpJLE1BQU1pSSxNQUFNLEtBQUssV0FBVzt3QkFDeEQsT0FBT0k7b0JBQ1g7b0JBQ0EsSUFBSXpKLElBQUlxSixNQUFNLEtBQUssV0FBV2pJLE1BQU1pSSxNQUFNLEtBQUssU0FBUzt3QkFDcERBLE9BQU9ILEtBQUs7b0JBQ2hCO29CQUNBaVQsU0FBU3JaLEdBQUcsQ0FBQzlDLElBQUlvQixLQUFLLEVBQUVBLE1BQU1BLEtBQUs7Z0JBQ3ZDO2dCQUNBLE9BQU87b0JBQUVpSSxRQUFRQSxPQUFPakksS0FBSztvQkFBRUEsT0FBTythO2dCQUFTO1lBQ25EO1FBQ0osT0FDSztZQUNELE1BQU1BLFdBQVcsSUFBSXZaO1lBQ3JCLEtBQUssTUFBTWlILFFBQVFGLE1BQU87Z0JBQ3RCLE1BQU0zSixNQUFNNkosS0FBSzdKLEdBQUc7Z0JBQ3BCLE1BQU1vQixRQUFReUksS0FBS3pJLEtBQUs7Z0JBQ3hCLElBQUlwQixJQUFJcUosTUFBTSxLQUFLLGFBQWFqSSxNQUFNaUksTUFBTSxLQUFLLFdBQVc7b0JBQ3hELE9BQU9JO2dCQUNYO2dCQUNBLElBQUl6SixJQUFJcUosTUFBTSxLQUFLLFdBQVdqSSxNQUFNaUksTUFBTSxLQUFLLFNBQVM7b0JBQ3BEQSxPQUFPSCxLQUFLO2dCQUNoQjtnQkFDQWlULFNBQVNyWixHQUFHLENBQUM5QyxJQUFJb0IsS0FBSyxFQUFFQSxNQUFNQSxLQUFLO1lBQ3ZDO1lBQ0EsT0FBTztnQkFBRWlJLFFBQVFBLE9BQU9qSSxLQUFLO2dCQUFFQSxPQUFPK2E7WUFBUztRQUNuRDtJQUNKO0FBQ0o7QUFDQUYsT0FBT3ZXLE1BQU0sR0FBRyxDQUFDbVcsU0FBU0UsV0FBVy9UO0lBQ2pDLE9BQU8sSUFBSWlVLE9BQU87UUFDZEY7UUFDQUY7UUFDQXZOLFVBQVVDLHNCQUFzQjBOLE1BQU07UUFDdEMsR0FBRzdRLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU1vVSxlQUFlMVE7SUFDakIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNLEVBQUUvRCxNQUFNLEVBQUVULEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzJFLG1CQUFtQixDQUFDSDtRQUNqRCxJQUFJeEUsSUFBSTBFLFVBQVUsS0FBSzVMLGNBQWNvQixHQUFHLEVBQUU7WUFDdEM2RixrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNvQixHQUFHO2dCQUMzQmdELFVBQVU4QyxJQUFJMEUsVUFBVTtZQUM1QjtZQUNBLE9BQU83RDtRQUNYO1FBQ0EsTUFBTWtDLE1BQU0sSUFBSSxDQUFDRyxJQUFJO1FBQ3JCLElBQUlILElBQUkwUSxPQUFPLEtBQUssTUFBTTtZQUN0QixJQUFJelQsSUFBSWhILElBQUksQ0FBQzBhLElBQUksR0FBRzNRLElBQUkwUSxPQUFPLENBQUNqYixLQUFLLEVBQUU7Z0JBQ25DdUgsa0JBQWtCQyxLQUFLO29CQUNuQi9ELE1BQU0zQixhQUFhNkQsU0FBUztvQkFDNUJJLFNBQVN3RSxJQUFJMFEsT0FBTyxDQUFDamIsS0FBSztvQkFDMUI0RixNQUFNO29CQUNORSxXQUFXO29CQUNYRCxPQUFPO29CQUNQekMsU0FBU21ILElBQUkwUSxPQUFPLENBQUM3WCxPQUFPO2dCQUNoQztnQkFDQTZFLE9BQU9ILEtBQUs7WUFDaEI7UUFDSjtRQUNBLElBQUl5QyxJQUFJNFEsT0FBTyxLQUFLLE1BQU07WUFDdEIsSUFBSTNULElBQUloSCxJQUFJLENBQUMwYSxJQUFJLEdBQUczUSxJQUFJNFEsT0FBTyxDQUFDbmIsS0FBSyxFQUFFO2dCQUNuQ3VILGtCQUFrQkMsS0FBSztvQkFDbkIvRCxNQUFNM0IsYUFBYWtFLE9BQU87b0JBQzFCQyxTQUFTc0UsSUFBSTRRLE9BQU8sQ0FBQ25iLEtBQUs7b0JBQzFCNEYsTUFBTTtvQkFDTkUsV0FBVztvQkFDWEQsT0FBTztvQkFDUHpDLFNBQVNtSCxJQUFJNFEsT0FBTyxDQUFDL1gsT0FBTztnQkFDaEM7Z0JBQ0E2RSxPQUFPSCxLQUFLO1lBQ2hCO1FBQ0o7UUFDQSxNQUFNNlMsWUFBWSxJQUFJLENBQUNqUSxJQUFJLENBQUNpUSxTQUFTO1FBQ3JDLFNBQVNTLFlBQVlDLFFBQVE7WUFDekIsTUFBTUMsWUFBWSxJQUFJN1o7WUFDdEIsS0FBSyxNQUFNNlQsV0FBVytGLFNBQVU7Z0JBQzVCLElBQUkvRixRQUFRck4sTUFBTSxLQUFLLFdBQ25CLE9BQU9JO2dCQUNYLElBQUlpTixRQUFRck4sTUFBTSxLQUFLLFNBQ25CQSxPQUFPSCxLQUFLO2dCQUNoQndULFVBQVVDLEdBQUcsQ0FBQ2pHLFFBQVF0VixLQUFLO1lBQy9CO1lBQ0EsT0FBTztnQkFBRWlJLFFBQVFBLE9BQU9qSSxLQUFLO2dCQUFFQSxPQUFPc2I7WUFBVTtRQUNwRDtRQUNBLE1BQU1ELFdBQVc7ZUFBSTdULElBQUloSCxJQUFJLENBQUNnYixNQUFNO1NBQUcsQ0FBQ2pkLEdBQUcsQ0FBQyxDQUFDUixNQUFNaUcsSUFBTTJXLFVBQVV0TyxNQUFNLENBQUMsSUFBSTlDLG1CQUFtQi9CLEtBQUt6SixNQUFNeUosSUFBSTNELElBQUksRUFBRUc7UUFDdEgsSUFBSXdELElBQUlDLE1BQU0sQ0FBQ2dGLEtBQUssRUFBRTtZQUNsQixPQUFPckQsUUFBUWlNLEdBQUcsQ0FBQ2dHLFVBQVVoYSxJQUFJLENBQUMsQ0FBQ2dhLFdBQWFELFlBQVlDO1FBQ2hFLE9BQ0s7WUFDRCxPQUFPRCxZQUFZQztRQUN2QjtJQUNKO0lBQ0FsSyxJQUFJOEosT0FBTyxFQUFFN1gsT0FBTyxFQUFFO1FBQ2xCLE9BQU8sSUFBSTRYLE9BQU87WUFDZCxHQUFHLElBQUksQ0FBQ3RRLElBQUk7WUFDWnVRLFNBQVM7Z0JBQUVqYixPQUFPaWI7Z0JBQVM3WCxTQUFTaUcsVUFBVXBKLFFBQVEsQ0FBQ21EO1lBQVM7UUFDcEU7SUFDSjtJQUNBaU8sSUFBSThKLE9BQU8sRUFBRS9YLE9BQU8sRUFBRTtRQUNsQixPQUFPLElBQUk0WCxPQUFPO1lBQ2QsR0FBRyxJQUFJLENBQUN0USxJQUFJO1lBQ1p5USxTQUFTO2dCQUFFbmIsT0FBT21iO2dCQUFTL1gsU0FBU2lHLFVBQVVwSixRQUFRLENBQUNtRDtZQUFTO1FBQ3BFO0lBQ0o7SUFDQThYLEtBQUtBLElBQUksRUFBRTlYLE9BQU8sRUFBRTtRQUNoQixPQUFPLElBQUksQ0FBQytOLEdBQUcsQ0FBQytKLE1BQU05WCxTQUFTaU8sR0FBRyxDQUFDNkosTUFBTTlYO0lBQzdDO0lBQ0FvTyxTQUFTcE8sT0FBTyxFQUFFO1FBQ2QsT0FBTyxJQUFJLENBQUMrTixHQUFHLENBQUMsR0FBRy9OO0lBQ3ZCO0FBQ0o7QUFDQTRYLE9BQU8xVyxNQUFNLEdBQUcsQ0FBQ3FXLFdBQVcvVDtJQUN4QixPQUFPLElBQUlvVSxPQUFPO1FBQ2RMO1FBQ0FNLFNBQVM7UUFDVEUsU0FBUztRQUNUak8sVUFBVUMsc0JBQXNCNk4sTUFBTTtRQUN0QyxHQUFHaFIsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsTUFBTTZVLG9CQUFvQm5SO0lBQ3RCakksYUFBYztRQUNWLEtBQUssSUFBSTBRO1FBQ1QsSUFBSSxDQUFDMkksUUFBUSxHQUFHLElBQUksQ0FBQ0MsU0FBUztJQUNsQztJQUNBdFAsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTSxFQUFFeEUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ3pDLElBQUl4RSxJQUFJMEUsVUFBVSxLQUFLNUwsY0FBY1MsUUFBUSxFQUFFO1lBQzNDd0csa0JBQWtCQyxLQUFLO2dCQUNuQi9ELE1BQU0zQixhQUFhMkMsWUFBWTtnQkFDL0JFLFVBQVVyRSxjQUFjUyxRQUFRO2dCQUNoQzJELFVBQVU4QyxJQUFJMEUsVUFBVTtZQUM1QjtZQUNBLE9BQU83RDtRQUNYO1FBQ0EsU0FBU3VULGNBQWN6TSxJQUFJLEVBQUUzTCxLQUFLO1lBQzlCLE9BQU9tRCxVQUFVO2dCQUNibkcsTUFBTTJPO2dCQUNOdEwsTUFBTTJELElBQUkzRCxJQUFJO2dCQUNkZ0QsV0FBVztvQkFDUFcsSUFBSUMsTUFBTSxDQUFDQyxrQkFBa0I7b0JBQzdCRixJQUFJRyxjQUFjO29CQUNsQmpCO29CQUNBbkM7aUJBQ0gsQ0FBQ3BHLE1BQU0sQ0FBQyxDQUFDeUosSUFBTSxDQUFDLENBQUNBO2dCQUNsQmQsV0FBVztvQkFDUHJELE1BQU0zQixhQUFhb0QsaUJBQWlCO29CQUNwQ3RCLGdCQUFnQko7Z0JBQ3BCO1lBQ0o7UUFDSjtRQUNBLFNBQVNxWSxpQkFBaUJDLE9BQU8sRUFBRXRZLEtBQUs7WUFDcEMsT0FBT21ELFVBQVU7Z0JBQ2JuRyxNQUFNc2I7Z0JBQ05qWSxNQUFNMkQsSUFBSTNELElBQUk7Z0JBQ2RnRCxXQUFXO29CQUNQVyxJQUFJQyxNQUFNLENBQUNDLGtCQUFrQjtvQkFDN0JGLElBQUlHLGNBQWM7b0JBQ2xCakI7b0JBQ0FuQztpQkFDSCxDQUFDcEcsTUFBTSxDQUFDLENBQUN5SixJQUFNLENBQUMsQ0FBQ0E7Z0JBQ2xCZCxXQUFXO29CQUNQckQsTUFBTTNCLGFBQWFxRCxtQkFBbUI7b0JBQ3RDeEIsaUJBQWlCSDtnQkFDckI7WUFDSjtRQUNKO1FBQ0EsTUFBTW9ELFNBQVM7WUFBRXJDLFVBQVVpRCxJQUFJQyxNQUFNLENBQUNDLGtCQUFrQjtRQUFDO1FBQ3pELE1BQU1xVSxLQUFLdlUsSUFBSWhILElBQUk7UUFDbkIsSUFBSSxJQUFJLENBQUNrSyxJQUFJLENBQUNvUixPQUFPLFlBQVl0TyxZQUFZO1lBQ3pDLDZEQUE2RDtZQUM3RCwyREFBMkQ7WUFDM0QsNERBQTREO1lBQzVELE1BQU13TyxLQUFLLElBQUk7WUFDZixPQUFPalQsR0FBRyxlQUFnQixHQUFHb0csSUFBSTtnQkFDN0IsTUFBTTNMLFFBQVEsSUFBSXBCLFNBQVMsRUFBRTtnQkFDN0IsTUFBTTZaLGFBQWEsTUFBTUQsR0FBR3RSLElBQUksQ0FBQ3lFLElBQUksQ0FDaENyRSxVQUFVLENBQUNxRSxNQUFNdkksUUFDakJ0RixLQUFLLENBQUMsQ0FBQzlDO29CQUNSZ0YsTUFBTWpCLFFBQVEsQ0FBQ3FaLGNBQWN6TSxNQUFNM1E7b0JBQ25DLE1BQU1nRjtnQkFDVjtnQkFDQSxNQUFNcUcsU0FBUyxNQUFNcVMsUUFBUUMsS0FBSyxDQUFDSixJQUFJLElBQUksRUFBRUU7Z0JBQzdDLE1BQU1HLGdCQUFnQixNQUFNSixHQUFHdFIsSUFBSSxDQUFDb1IsT0FBTyxDQUFDcFIsSUFBSSxDQUFDOUUsSUFBSSxDQUNoRGtGLFVBQVUsQ0FBQ2pCLFFBQVFqRCxRQUNuQnRGLEtBQUssQ0FBQyxDQUFDOUM7b0JBQ1JnRixNQUFNakIsUUFBUSxDQUFDc1osaUJBQWlCaFMsUUFBUXJMO29CQUN4QyxNQUFNZ0Y7Z0JBQ1Y7Z0JBQ0EsT0FBTzRZO1lBQ1g7UUFDSixPQUNLO1lBQ0QsNkRBQTZEO1lBQzdELDJEQUEyRDtZQUMzRCw0REFBNEQ7WUFDNUQsTUFBTUosS0FBSyxJQUFJO1lBQ2YsT0FBT2pULEdBQUcsU0FBVSxHQUFHb0csSUFBSTtnQkFDdkIsTUFBTThNLGFBQWFELEdBQUd0UixJQUFJLENBQUN5RSxJQUFJLENBQUN0RSxTQUFTLENBQUNzRSxNQUFNdkk7Z0JBQ2hELElBQUksQ0FBQ3FWLFdBQVduUyxPQUFPLEVBQUU7b0JBQ3JCLE1BQU0sSUFBSTFILFNBQVM7d0JBQUN3WixjQUFjek0sTUFBTThNLFdBQVd6WSxLQUFLO3FCQUFFO2dCQUM5RDtnQkFDQSxNQUFNcUcsU0FBU3FTLFFBQVFDLEtBQUssQ0FBQ0osSUFBSSxJQUFJLEVBQUVFLFdBQVd6YixJQUFJO2dCQUN0RCxNQUFNNGIsZ0JBQWdCSixHQUFHdFIsSUFBSSxDQUFDb1IsT0FBTyxDQUFDalIsU0FBUyxDQUFDaEIsUUFBUWpEO2dCQUN4RCxJQUFJLENBQUN3VixjQUFjdFMsT0FBTyxFQUFFO29CQUN4QixNQUFNLElBQUkxSCxTQUFTO3dCQUFDeVosaUJBQWlCaFMsUUFBUXVTLGNBQWM1WSxLQUFLO3FCQUFFO2dCQUN0RTtnQkFDQSxPQUFPNFksY0FBYzViLElBQUk7WUFDN0I7UUFDSjtJQUNKO0lBQ0E2YixhQUFhO1FBQ1QsT0FBTyxJQUFJLENBQUMzUixJQUFJLENBQUN5RSxJQUFJO0lBQ3pCO0lBQ0FtTixhQUFhO1FBQ1QsT0FBTyxJQUFJLENBQUM1UixJQUFJLENBQUNvUixPQUFPO0lBQzVCO0lBQ0EzTSxLQUFLLEdBQUd0UixLQUFLLEVBQUU7UUFDWCxPQUFPLElBQUk0ZCxZQUFZO1lBQ25CLEdBQUcsSUFBSSxDQUFDL1EsSUFBSTtZQUNaeUUsTUFBTTBHLFNBQVN2UixNQUFNLENBQUN6RyxPQUFPdWMsSUFBSSxDQUFDdEYsV0FBV3hRLE1BQU07UUFDdkQ7SUFDSjtJQUNBd1gsUUFBUVEsVUFBVSxFQUFFO1FBQ2hCLE9BQU8sSUFBSWIsWUFBWTtZQUNuQixHQUFHLElBQUksQ0FBQy9RLElBQUk7WUFDWm9SLFNBQVNRO1FBQ2I7SUFDSjtJQUNBWCxVQUFVWSxJQUFJLEVBQUU7UUFDWixNQUFNQyxnQkFBZ0IsSUFBSSxDQUFDN1IsS0FBSyxDQUFDNFI7UUFDakMsT0FBT0M7SUFDWDtJQUNBQyxnQkFBZ0JGLElBQUksRUFBRTtRQUNsQixNQUFNQyxnQkFBZ0IsSUFBSSxDQUFDN1IsS0FBSyxDQUFDNFI7UUFDakMsT0FBT0M7SUFDWDtJQUNBLE9BQU9sWSxPQUFPNkssSUFBSSxFQUFFMk0sT0FBTyxFQUFFbFYsTUFBTSxFQUFFO1FBQ2pDLE9BQU8sSUFBSTZVLFlBQVk7WUFDbkJ0TSxNQUFPQSxPQUNEQSxPQUNBMEcsU0FBU3ZSLE1BQU0sQ0FBQyxFQUFFLEVBQUU4VixJQUFJLENBQUN0RixXQUFXeFEsTUFBTTtZQUNoRHdYLFNBQVNBLFdBQVdoSCxXQUFXeFEsTUFBTTtZQUNyQzRJLFVBQVVDLHNCQUFzQnNPLFdBQVc7WUFDM0MsR0FBR3pSLG9CQUFvQnBELE9BQU87UUFDbEM7SUFDSjtBQUNKO0FBQ0EsTUFBTXdSLGdCQUFnQjlOO0lBQ2xCLElBQUkyQyxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUN2QyxJQUFJLENBQUNnUyxNQUFNO0lBQzNCO0lBQ0FyUSxPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNLEVBQUV4RSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMyRSxtQkFBbUIsQ0FBQ0g7UUFDekMsTUFBTTJRLGFBQWEsSUFBSSxDQUFDalMsSUFBSSxDQUFDZ1MsTUFBTTtRQUNuQyxPQUFPQyxXQUFXdFEsTUFBTSxDQUFDO1lBQUU3TCxNQUFNZ0gsSUFBSWhILElBQUk7WUFBRXFELE1BQU0yRCxJQUFJM0QsSUFBSTtZQUFFMkYsUUFBUWhDO1FBQUk7SUFDM0U7QUFDSjtBQUNBNFEsUUFBUTlULE1BQU0sR0FBRyxDQUFDb1ksUUFBUTlWO0lBQ3RCLE9BQU8sSUFBSXdSLFFBQVE7UUFDZnNFLFFBQVFBO1FBQ1J4UCxVQUFVQyxzQkFBc0JpTCxPQUFPO1FBQ3ZDLEdBQUdwTyxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNeVIsbUJBQW1CL047SUFDckIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixJQUFJQSxNQUFNeEwsSUFBSSxLQUFLLElBQUksQ0FBQ2tLLElBQUksQ0FBQzFLLEtBQUssRUFBRTtZQUNoQyxNQUFNd0gsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNEO1lBQ2pDekUsa0JBQWtCQyxLQUFLO2dCQUNuQjlDLFVBQVU4QyxJQUFJaEgsSUFBSTtnQkFDbEJpRCxNQUFNM0IsYUFBYThDLGVBQWU7Z0JBQ2xDRCxVQUFVLElBQUksQ0FBQytGLElBQUksQ0FBQzFLLEtBQUs7WUFDN0I7WUFDQSxPQUFPcUk7UUFDWDtRQUNBLE9BQU87WUFBRUosUUFBUTtZQUFTakksT0FBT2dNLE1BQU14TCxJQUFJO1FBQUM7SUFDaEQ7SUFDQSxJQUFJUixRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMwSyxJQUFJLENBQUMxSyxLQUFLO0lBQzFCO0FBQ0o7QUFDQXFZLFdBQVcvVCxNQUFNLEdBQUcsQ0FBQ3RFLE9BQU80RztJQUN4QixPQUFPLElBQUl5UixXQUFXO1FBQ2xCclksT0FBT0E7UUFDUGtOLFVBQVVDLHNCQUFzQmtMLFVBQVU7UUFDMUMsR0FBR3JPLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLFNBQVNpUixjQUFjMkQsTUFBTSxFQUFFNVUsTUFBTTtJQUNqQyxPQUFPLElBQUkwUixRQUFRO1FBQ2ZrRDtRQUNBdE8sVUFBVUMsc0JBQXNCbUwsT0FBTztRQUN2QyxHQUFHdE8sb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsTUFBTTBSLGdCQUFnQmhPO0lBQ2xCK0IsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsSUFBSSxPQUFPQSxNQUFNeEwsSUFBSSxLQUFLLFVBQVU7WUFDaEMsTUFBTWdILE1BQU0sSUFBSSxDQUFDeUUsZUFBZSxDQUFDRDtZQUNqQyxNQUFNNFEsaUJBQWlCLElBQUksQ0FBQ2xTLElBQUksQ0FBQzhRLE1BQU07WUFDdkNqVSxrQkFBa0JDLEtBQUs7Z0JBQ25CN0MsVUFBVXZILEtBQUtzQyxVQUFVLENBQUNrZDtnQkFDMUJsWSxVQUFVOEMsSUFBSTBFLFVBQVU7Z0JBQ3hCekksTUFBTTNCLGFBQWEyQyxZQUFZO1lBQ25DO1lBQ0EsT0FBTzREO1FBQ1g7UUFDQSxJQUFJLElBQUksQ0FBQ3FDLElBQUksQ0FBQzhRLE1BQU0sQ0FBQy9CLE9BQU8sQ0FBQ3pOLE1BQU14TCxJQUFJLE1BQU0sQ0FBQyxHQUFHO1lBQzdDLE1BQU1nSCxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakMsTUFBTTRRLGlCQUFpQixJQUFJLENBQUNsUyxJQUFJLENBQUM4USxNQUFNO1lBQ3ZDalUsa0JBQWtCQyxLQUFLO2dCQUNuQjlDLFVBQVU4QyxJQUFJaEgsSUFBSTtnQkFDbEJpRCxNQUFNM0IsYUFBYW1ELGtCQUFrQjtnQkFDckNELFNBQVM0WDtZQUNiO1lBQ0EsT0FBT3ZVO1FBQ1g7UUFDQSxPQUFPVSxHQUFHaUQsTUFBTXhMLElBQUk7SUFDeEI7SUFDQSxJQUFJd0UsVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDMEYsSUFBSSxDQUFDOFEsTUFBTTtJQUMzQjtJQUNBLElBQUloRCxPQUFPO1FBQ1AsTUFBTXFFLGFBQWEsQ0FBQztRQUNwQixLQUFLLE1BQU12ZixPQUFPLElBQUksQ0FBQ29OLElBQUksQ0FBQzhRLE1BQU0sQ0FBRTtZQUNoQ3FCLFVBQVUsQ0FBQ3ZmLElBQUksR0FBR0E7UUFDdEI7UUFDQSxPQUFPdWY7SUFDWDtJQUNBLElBQUlDLFNBQVM7UUFDVCxNQUFNRCxhQUFhLENBQUM7UUFDcEIsS0FBSyxNQUFNdmYsT0FBTyxJQUFJLENBQUNvTixJQUFJLENBQUM4USxNQUFNLENBQUU7WUFDaENxQixVQUFVLENBQUN2ZixJQUFJLEdBQUdBO1FBQ3RCO1FBQ0EsT0FBT3VmO0lBQ1g7SUFDQSxJQUFJRSxPQUFPO1FBQ1AsTUFBTUYsYUFBYSxDQUFDO1FBQ3BCLEtBQUssTUFBTXZmLE9BQU8sSUFBSSxDQUFDb04sSUFBSSxDQUFDOFEsTUFBTSxDQUFFO1lBQ2hDcUIsVUFBVSxDQUFDdmYsSUFBSSxHQUFHQTtRQUN0QjtRQUNBLE9BQU91ZjtJQUNYO0lBQ0FHLFFBQVF4QixNQUFNLEVBQUU7UUFDWixPQUFPbEQsUUFBUWhVLE1BQU0sQ0FBQ2tYO0lBQzFCO0lBQ0F5QixRQUFRekIsTUFBTSxFQUFFO1FBQ1osT0FBT2xELFFBQVFoVSxNQUFNLENBQUMsSUFBSSxDQUFDVSxPQUFPLENBQUM3RyxNQUFNLENBQUMsQ0FBQytlLE1BQVEsQ0FBQzFCLE9BQU9qVyxRQUFRLENBQUMyWDtJQUN4RTtBQUNKO0FBQ0E1RSxRQUFRaFUsTUFBTSxHQUFHdVQ7QUFDakIsTUFBTVUsc0JBQXNCak87SUFDeEIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNbVIsbUJBQW1CL2YsS0FBS1ksa0JBQWtCLENBQUMsSUFBSSxDQUFDME0sSUFBSSxDQUFDOFEsTUFBTTtRQUNqRSxNQUFNaFUsTUFBTSxJQUFJLENBQUN5RSxlQUFlLENBQUNEO1FBQ2pDLElBQUl4RSxJQUFJMEUsVUFBVSxLQUFLNUwsY0FBY0ksTUFBTSxJQUN2QzhHLElBQUkwRSxVQUFVLEtBQUs1TCxjQUFjTyxNQUFNLEVBQUU7WUFDekMsTUFBTStiLGlCQUFpQnhmLEtBQUtrQixZQUFZLENBQUM2ZTtZQUN6QzVWLGtCQUFrQkMsS0FBSztnQkFDbkI3QyxVQUFVdkgsS0FBS3NDLFVBQVUsQ0FBQ2tkO2dCQUMxQmxZLFVBQVU4QyxJQUFJMEUsVUFBVTtnQkFDeEJ6SSxNQUFNM0IsYUFBYTJDLFlBQVk7WUFDbkM7WUFDQSxPQUFPNEQ7UUFDWDtRQUNBLElBQUk4VSxpQkFBaUIxRCxPQUFPLENBQUN6TixNQUFNeEwsSUFBSSxNQUFNLENBQUMsR0FBRztZQUM3QyxNQUFNb2MsaUJBQWlCeGYsS0FBS2tCLFlBQVksQ0FBQzZlO1lBQ3pDNVYsa0JBQWtCQyxLQUFLO2dCQUNuQjlDLFVBQVU4QyxJQUFJaEgsSUFBSTtnQkFDbEJpRCxNQUFNM0IsYUFBYW1ELGtCQUFrQjtnQkFDckNELFNBQVM0WDtZQUNiO1lBQ0EsT0FBT3ZVO1FBQ1g7UUFDQSxPQUFPVSxHQUFHaUQsTUFBTXhMLElBQUk7SUFDeEI7SUFDQSxJQUFJZ1ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDOU4sSUFBSSxDQUFDOFEsTUFBTTtJQUMzQjtBQUNKO0FBQ0FqRCxjQUFjalUsTUFBTSxHQUFHLENBQUNrWCxRQUFRNVU7SUFDNUIsT0FBTyxJQUFJMlIsY0FBYztRQUNyQmlELFFBQVFBO1FBQ1J0TyxVQUFVQyxzQkFBc0JvTCxhQUFhO1FBQzdDLEdBQUd2TyxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNNEcsbUJBQW1CbEQ7SUFDckJzTCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUNsTCxJQUFJLENBQUM5RSxJQUFJO0lBQ3pCO0lBQ0F5RyxPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNLEVBQUV4RSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMyRSxtQkFBbUIsQ0FBQ0g7UUFDekMsSUFBSXhFLElBQUkwRSxVQUFVLEtBQUs1TCxjQUFjaUIsT0FBTyxJQUN4Q2lHLElBQUlDLE1BQU0sQ0FBQ2dGLEtBQUssS0FBSyxPQUFPO1lBQzVCbEYsa0JBQWtCQyxLQUFLO2dCQUNuQi9ELE1BQU0zQixhQUFhMkMsWUFBWTtnQkFDL0JFLFVBQVVyRSxjQUFjaUIsT0FBTztnQkFDL0JtRCxVQUFVOEMsSUFBSTBFLFVBQVU7WUFDNUI7WUFDQSxPQUFPN0Q7UUFDWDtRQUNBLE1BQU0rVSxjQUFjNVYsSUFBSTBFLFVBQVUsS0FBSzVMLGNBQWNpQixPQUFPLEdBQ3REaUcsSUFBSWhILElBQUksR0FDUjRJLFFBQVFtRCxPQUFPLENBQUMvRSxJQUFJaEgsSUFBSTtRQUM5QixPQUFPdUksR0FBR3FVLFlBQVkvYixJQUFJLENBQUMsQ0FBQ2I7WUFDeEIsT0FBTyxJQUFJLENBQUNrSyxJQUFJLENBQUM5RSxJQUFJLENBQUNrRixVQUFVLENBQUN0SyxNQUFNO2dCQUNuQ3FELE1BQU0yRCxJQUFJM0QsSUFBSTtnQkFDZFUsVUFBVWlELElBQUlDLE1BQU0sQ0FBQ0Msa0JBQWtCO1lBQzNDO1FBQ0o7SUFDSjtBQUNKO0FBQ0E4RixXQUFXbEosTUFBTSxHQUFHLENBQUMySSxRQUFRckc7SUFDekIsT0FBTyxJQUFJNEcsV0FBVztRQUNsQjVILE1BQU1xSDtRQUNOQyxVQUFVQyxzQkFBc0JLLFVBQVU7UUFDMUMsR0FBR3hELG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU1vRyxtQkFBbUIxQztJQUNyQnlELFlBQVk7UUFDUixPQUFPLElBQUksQ0FBQ3JELElBQUksQ0FBQ3VDLE1BQU07SUFDM0I7SUFDQW9RLGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQzNTLElBQUksQ0FBQ3VDLE1BQU0sQ0FBQ3ZDLElBQUksQ0FBQ3dDLFFBQVEsS0FBS0Msc0JBQXNCSCxVQUFVLEdBQ3BFLElBQUksQ0FBQ3RDLElBQUksQ0FBQ3VDLE1BQU0sQ0FBQ29RLFVBQVUsS0FDM0IsSUFBSSxDQUFDM1MsSUFBSSxDQUFDdUMsTUFBTTtJQUMxQjtJQUNBWixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNLEVBQUUvRCxNQUFNLEVBQUVULEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzJFLG1CQUFtQixDQUFDSDtRQUNqRCxNQUFNb0IsU0FBUyxJQUFJLENBQUMxQyxJQUFJLENBQUMwQyxNQUFNLElBQUk7UUFDbkMsTUFBTWtRLFdBQVc7WUFDYi9hLFVBQVUsQ0FBQ2diO2dCQUNQaFcsa0JBQWtCQyxLQUFLK1Y7Z0JBQ3ZCLElBQUlBLElBQUlDLEtBQUssRUFBRTtvQkFDWHZWLE9BQU9GLEtBQUs7Z0JBQ2hCLE9BQ0s7b0JBQ0RFLE9BQU9ILEtBQUs7Z0JBQ2hCO1lBQ0o7WUFDQSxJQUFJakUsUUFBTztnQkFDUCxPQUFPMkQsSUFBSTNELElBQUk7WUFDbkI7UUFDSjtRQUNBeVosU0FBUy9hLFFBQVEsR0FBRythLFNBQVMvYSxRQUFRLENBQUNxSSxJQUFJLENBQUMwUztRQUMzQyxJQUFJbFEsT0FBT3hILElBQUksS0FBSyxjQUFjO1lBQzlCLE1BQU02WCxZQUFZclEsT0FBTzdCLFNBQVMsQ0FBQy9ELElBQUloSCxJQUFJLEVBQUU4YztZQUM3QyxJQUFJOVYsSUFBSUMsTUFBTSxDQUFDbkYsTUFBTSxDQUFDd0IsTUFBTSxFQUFFO2dCQUMxQixPQUFPO29CQUNIbUUsUUFBUTtvQkFDUmpJLE9BQU93SCxJQUFJaEgsSUFBSTtnQkFDbkI7WUFDSjtZQUNBLElBQUlnSCxJQUFJQyxNQUFNLENBQUNnRixLQUFLLEVBQUU7Z0JBQ2xCLE9BQU9yRCxRQUFRbUQsT0FBTyxDQUFDa1IsV0FBV3BjLElBQUksQ0FBQyxDQUFDb2M7b0JBQ3BDLE9BQU8sSUFBSSxDQUFDL1MsSUFBSSxDQUFDdUMsTUFBTSxDQUFDWCxXQUFXLENBQUM7d0JBQ2hDOUwsTUFBTWlkO3dCQUNONVosTUFBTTJELElBQUkzRCxJQUFJO3dCQUNkMkYsUUFBUWhDO29CQUNaO2dCQUNKO1lBQ0osT0FDSztnQkFDRCxPQUFPLElBQUksQ0FBQ2tELElBQUksQ0FBQ3VDLE1BQU0sQ0FBQ2IsVUFBVSxDQUFDO29CQUMvQjVMLE1BQU1pZDtvQkFDTjVaLE1BQU0yRCxJQUFJM0QsSUFBSTtvQkFDZDJGLFFBQVFoQztnQkFDWjtZQUNKO1FBQ0o7UUFDQSxJQUFJNEYsT0FBT3hILElBQUksS0FBSyxjQUFjO1lBQzlCLE1BQU04WCxvQkFBb0IsQ0FBQ0M7Z0JBR3ZCLE1BQU05VCxTQUFTdUQsT0FBT3BDLFVBQVUsQ0FBQzJTLEtBQUtMO2dCQUN0QyxJQUFJOVYsSUFBSUMsTUFBTSxDQUFDZ0YsS0FBSyxFQUFFO29CQUNsQixPQUFPckQsUUFBUW1ELE9BQU8sQ0FBQzFDO2dCQUMzQjtnQkFDQSxJQUFJQSxrQkFBa0JULFNBQVM7b0JBQzNCLE1BQU0sSUFBSXpMLE1BQU07Z0JBQ3BCO2dCQUNBLE9BQU9nZ0I7WUFDWDtZQUNBLElBQUluVyxJQUFJQyxNQUFNLENBQUNnRixLQUFLLEtBQUssT0FBTztnQkFDNUIsTUFBTW1SLFFBQVEsSUFBSSxDQUFDbFQsSUFBSSxDQUFDdUMsTUFBTSxDQUFDYixVQUFVLENBQUM7b0JBQ3RDNUwsTUFBTWdILElBQUloSCxJQUFJO29CQUNkcUQsTUFBTTJELElBQUkzRCxJQUFJO29CQUNkMkYsUUFBUWhDO2dCQUNaO2dCQUNBLElBQUlvVyxNQUFNM1YsTUFBTSxLQUFLLFdBQ2pCLE9BQU9JO2dCQUNYLElBQUl1VixNQUFNM1YsTUFBTSxLQUFLLFNBQ2pCQSxPQUFPSCxLQUFLO2dCQUNoQiwwQkFBMEI7Z0JBQzFCNFYsa0JBQWtCRSxNQUFNNWQsS0FBSztnQkFDN0IsT0FBTztvQkFBRWlJLFFBQVFBLE9BQU9qSSxLQUFLO29CQUFFQSxPQUFPNGQsTUFBTTVkLEtBQUs7Z0JBQUM7WUFDdEQsT0FDSztnQkFDRCxPQUFPLElBQUksQ0FBQzBLLElBQUksQ0FBQ3VDLE1BQU0sQ0FDbEJYLFdBQVcsQ0FBQztvQkFBRTlMLE1BQU1nSCxJQUFJaEgsSUFBSTtvQkFBRXFELE1BQU0yRCxJQUFJM0QsSUFBSTtvQkFBRTJGLFFBQVFoQztnQkFBSSxHQUMxRG5HLElBQUksQ0FBQyxDQUFDdWM7b0JBQ1AsSUFBSUEsTUFBTTNWLE1BQU0sS0FBSyxXQUNqQixPQUFPSTtvQkFDWCxJQUFJdVYsTUFBTTNWLE1BQU0sS0FBSyxTQUNqQkEsT0FBT0gsS0FBSztvQkFDaEIsT0FBTzRWLGtCQUFrQkUsTUFBTTVkLEtBQUssRUFBRXFCLElBQUksQ0FBQzt3QkFDdkMsT0FBTzs0QkFBRTRHLFFBQVFBLE9BQU9qSSxLQUFLOzRCQUFFQSxPQUFPNGQsTUFBTTVkLEtBQUs7d0JBQUM7b0JBQ3REO2dCQUNKO1lBQ0o7UUFDSjtRQUNBLElBQUlvTixPQUFPeEgsSUFBSSxLQUFLLGFBQWE7WUFDN0IsSUFBSTRCLElBQUlDLE1BQU0sQ0FBQ2dGLEtBQUssS0FBSyxPQUFPO2dCQUM1QixNQUFNb1IsT0FBTyxJQUFJLENBQUNuVCxJQUFJLENBQUN1QyxNQUFNLENBQUNiLFVBQVUsQ0FBQztvQkFDckM1TCxNQUFNZ0gsSUFBSWhILElBQUk7b0JBQ2RxRCxNQUFNMkQsSUFBSTNELElBQUk7b0JBQ2QyRixRQUFRaEM7Z0JBQ1o7Z0JBQ0EsSUFBSSxDQUFDMEIsUUFBUTJVLE9BQ1QsT0FBT0E7Z0JBQ1gsTUFBTWhVLFNBQVN1RCxPQUFPN0IsU0FBUyxDQUFDc1MsS0FBSzdkLEtBQUssRUFBRXNkO2dCQUM1QyxJQUFJelQsa0JBQWtCVCxTQUFTO29CQUMzQixNQUFNLElBQUl6TCxNQUFNLENBQUMsK0ZBQStGLENBQUM7Z0JBQ3JIO2dCQUNBLE9BQU87b0JBQUVzSyxRQUFRQSxPQUFPakksS0FBSztvQkFBRUEsT0FBTzZKO2dCQUFPO1lBQ2pELE9BQ0s7Z0JBQ0QsT0FBTyxJQUFJLENBQUNhLElBQUksQ0FBQ3VDLE1BQU0sQ0FDbEJYLFdBQVcsQ0FBQztvQkFBRTlMLE1BQU1nSCxJQUFJaEgsSUFBSTtvQkFBRXFELE1BQU0yRCxJQUFJM0QsSUFBSTtvQkFBRTJGLFFBQVFoQztnQkFBSSxHQUMxRG5HLElBQUksQ0FBQyxDQUFDd2M7b0JBQ1AsSUFBSSxDQUFDM1UsUUFBUTJVLE9BQ1QsT0FBT0E7b0JBQ1gsT0FBT3pVLFFBQVFtRCxPQUFPLENBQUNhLE9BQU83QixTQUFTLENBQUNzUyxLQUFLN2QsS0FBSyxFQUFFc2QsV0FBV2pjLElBQUksQ0FBQyxDQUFDd0ksU0FBWTs0QkFBRTVCLFFBQVFBLE9BQU9qSSxLQUFLOzRCQUFFQSxPQUFPNko7d0JBQU87Z0JBQzNIO1lBQ0o7UUFDSjtRQUNBek0sS0FBS0ssV0FBVyxDQUFDMlA7SUFDckI7QUFDSjtBQUNBSixXQUFXMUksTUFBTSxHQUFHLENBQUMySSxRQUFRRyxRQUFReEc7SUFDakMsT0FBTyxJQUFJb0csV0FBVztRQUNsQkM7UUFDQUMsVUFBVUMsc0JBQXNCSCxVQUFVO1FBQzFDSTtRQUNBLEdBQUdwRCxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQW9HLFdBQVc4USxvQkFBb0IsR0FBRyxDQUFDQyxZQUFZOVEsUUFBUXJHO0lBQ25ELE9BQU8sSUFBSW9HLFdBQVc7UUFDbEJDO1FBQ0FHLFFBQVE7WUFBRXhILE1BQU07WUFBYzJGLFdBQVd3UztRQUFXO1FBQ3BEN1EsVUFBVUMsc0JBQXNCSCxVQUFVO1FBQzFDLEdBQUdoRCxvQkFBb0JwRCxPQUFPO0lBQ2xDO0FBQ0o7QUFDQSxNQUFNeUcsb0JBQW9CL0M7SUFDdEIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNRSxhQUFhLElBQUksQ0FBQ0gsUUFBUSxDQUFDQztRQUNqQyxJQUFJRSxlQUFlNUwsY0FBY2xCLFNBQVMsRUFBRTtZQUN4QyxPQUFPMkosR0FBRzNKO1FBQ2Q7UUFDQSxPQUFPLElBQUksQ0FBQ3NMLElBQUksQ0FBQ3FELFNBQVMsQ0FBQzFCLE1BQU0sQ0FBQ0w7SUFDdEM7SUFDQTRKLFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQ2xMLElBQUksQ0FBQ3FELFNBQVM7SUFDOUI7QUFDSjtBQUNBVixZQUFZL0ksTUFBTSxHQUFHLENBQUNzQixNQUFNZ0I7SUFDeEIsT0FBTyxJQUFJeUcsWUFBWTtRQUNuQlUsV0FBV25JO1FBQ1hzSCxVQUFVQyxzQkFBc0JFLFdBQVc7UUFDM0MsR0FBR3JELG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU0wRyxvQkFBb0JoRDtJQUN0QitCLE9BQU9MLEtBQUssRUFBRTtRQUNWLE1BQU1FLGFBQWEsSUFBSSxDQUFDSCxRQUFRLENBQUNDO1FBQ2pDLElBQUlFLGVBQWU1TCxjQUFjYyxJQUFJLEVBQUU7WUFDbkMsT0FBTzJILEdBQUc7UUFDZDtRQUNBLE9BQU8sSUFBSSxDQUFDMkIsSUFBSSxDQUFDcUQsU0FBUyxDQUFDMUIsTUFBTSxDQUFDTDtJQUN0QztJQUNBNEosU0FBUztRQUNMLE9BQU8sSUFBSSxDQUFDbEwsSUFBSSxDQUFDcUQsU0FBUztJQUM5QjtBQUNKO0FBQ0FULFlBQVloSixNQUFNLEdBQUcsQ0FBQ3NCLE1BQU1nQjtJQUN4QixPQUFPLElBQUkwRyxZQUFZO1FBQ25CUyxXQUFXbkk7UUFDWHNILFVBQVVDLHNCQUFzQkcsV0FBVztRQUMzQyxHQUFHdEQsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsTUFBTWtILG1CQUFtQnhEO0lBQ3JCK0IsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTSxFQUFFeEUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ3pDLElBQUl4TCxPQUFPZ0gsSUFBSWhILElBQUk7UUFDbkIsSUFBSWdILElBQUkwRSxVQUFVLEtBQUs1TCxjQUFjbEIsU0FBUyxFQUFFO1lBQzVDb0IsT0FBTyxJQUFJLENBQUNrSyxJQUFJLENBQUNzRCxZQUFZO1FBQ2pDO1FBQ0EsT0FBTyxJQUFJLENBQUN0RCxJQUFJLENBQUNxRCxTQUFTLENBQUMxQixNQUFNLENBQUM7WUFDOUI3TDtZQUNBcUQsTUFBTTJELElBQUkzRCxJQUFJO1lBQ2QyRixRQUFRaEM7UUFDWjtJQUNKO0lBQ0F3VyxnQkFBZ0I7UUFDWixPQUFPLElBQUksQ0FBQ3RULElBQUksQ0FBQ3FELFNBQVM7SUFDOUI7QUFDSjtBQUNBRCxXQUFXeEosTUFBTSxHQUFHLENBQUNzQixNQUFNZ0I7SUFDdkIsT0FBTyxJQUFJa0gsV0FBVztRQUNsQkMsV0FBV25JO1FBQ1hzSCxVQUFVQyxzQkFBc0JXLFVBQVU7UUFDMUNFLGNBQWMsT0FBT3BILE9BQU82RSxPQUFPLEtBQUssYUFDbEM3RSxPQUFPNkUsT0FBTyxHQUNkLElBQU03RSxPQUFPNkUsT0FBTztRQUMxQixHQUFHekIsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsTUFBTXVILGlCQUFpQjdEO0lBQ25CK0IsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTSxFQUFFeEUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ3pDLCtEQUErRDtRQUMvRCxNQUFNaVMsU0FBUztZQUNYLEdBQUd6VyxHQUFHO1lBQ05DLFFBQVE7Z0JBQ0osR0FBR0QsSUFBSUMsTUFBTTtnQkFDYm5GLFFBQVEsRUFBRTtZQUNkO1FBQ0o7UUFDQSxNQUFNdUgsU0FBUyxJQUFJLENBQUNhLElBQUksQ0FBQ3FELFNBQVMsQ0FBQzFCLE1BQU0sQ0FBQztZQUN0QzdMLE1BQU15ZCxPQUFPemQsSUFBSTtZQUNqQnFELE1BQU1vYSxPQUFPcGEsSUFBSTtZQUNqQjJGLFFBQVE7Z0JBQ0osR0FBR3lVLE1BQU07WUFDYjtRQUNKO1FBQ0EsSUFBSTlVLFFBQVFVLFNBQVM7WUFDakIsT0FBT0EsT0FBT3hJLElBQUksQ0FBQyxDQUFDd0k7Z0JBQ2hCLE9BQU87b0JBQ0g1QixRQUFRO29CQUNSakksT0FBTzZKLE9BQU81QixNQUFNLEtBQUssVUFDbkI0QixPQUFPN0osS0FBSyxHQUNaLElBQUksQ0FBQzBLLElBQUksQ0FBQzBELFVBQVUsQ0FBQzt3QkFDbkIsSUFBSTVLLFNBQVE7NEJBQ1IsT0FBTyxJQUFJcEIsU0FBUzZiLE9BQU94VyxNQUFNLENBQUNuRixNQUFNO3dCQUM1Qzt3QkFDQTBKLE9BQU9pUyxPQUFPemQsSUFBSTtvQkFDdEI7Z0JBQ1I7WUFDSjtRQUNKLE9BQ0s7WUFDRCxPQUFPO2dCQUNIeUgsUUFBUTtnQkFDUmpJLE9BQU82SixPQUFPNUIsTUFBTSxLQUFLLFVBQ25CNEIsT0FBTzdKLEtBQUssR0FDWixJQUFJLENBQUMwSyxJQUFJLENBQUMwRCxVQUFVLENBQUM7b0JBQ25CLElBQUk1SyxTQUFRO3dCQUNSLE9BQU8sSUFBSXBCLFNBQVM2YixPQUFPeFcsTUFBTSxDQUFDbkYsTUFBTTtvQkFDNUM7b0JBQ0EwSixPQUFPaVMsT0FBT3pkLElBQUk7Z0JBQ3RCO1lBQ1I7UUFDSjtJQUNKO0lBQ0EwZCxjQUFjO1FBQ1YsT0FBTyxJQUFJLENBQUN4VCxJQUFJLENBQUNxRCxTQUFTO0lBQzlCO0FBQ0o7QUFDQUksU0FBUzdKLE1BQU0sR0FBRyxDQUFDc0IsTUFBTWdCO0lBQ3JCLE9BQU8sSUFBSXVILFNBQVM7UUFDaEJKLFdBQVduSTtRQUNYc0gsVUFBVUMsc0JBQXNCZ0IsUUFBUTtRQUN4Q0MsWUFBWSxPQUFPeEgsT0FBT3RGLEtBQUssS0FBSyxhQUFhc0YsT0FBT3RGLEtBQUssR0FBRyxJQUFNc0YsT0FBT3RGLEtBQUs7UUFDbEYsR0FBRzBJLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU11WCxlQUFlN1Q7SUFDakIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNRSxhQUFhLElBQUksQ0FBQ0gsUUFBUSxDQUFDQztRQUNqQyxJQUFJRSxlQUFlNUwsY0FBY00sR0FBRyxFQUFFO1lBQ2xDLE1BQU00RyxNQUFNLElBQUksQ0FBQ3lFLGVBQWUsQ0FBQ0Q7WUFDakN6RSxrQkFBa0JDLEtBQUs7Z0JBQ25CL0QsTUFBTTNCLGFBQWEyQyxZQUFZO2dCQUMvQkUsVUFBVXJFLGNBQWNNLEdBQUc7Z0JBQzNCOEQsVUFBVThDLElBQUkwRSxVQUFVO1lBQzVCO1lBQ0EsT0FBTzdEO1FBQ1g7UUFDQSxPQUFPO1lBQUVKLFFBQVE7WUFBU2pJLE9BQU9nTSxNQUFNeEwsSUFBSTtRQUFDO0lBQ2hEO0FBQ0o7QUFDQTJkLE9BQU83WixNQUFNLEdBQUcsQ0FBQ3NDO0lBQ2IsT0FBTyxJQUFJdVgsT0FBTztRQUNkalIsVUFBVUMsc0JBQXNCZ1IsTUFBTTtRQUN0QyxHQUFHblUsb0JBQW9CcEQsT0FBTztJQUNsQztBQUNKO0FBQ0EsTUFBTXdYLFFBQVFDLE9BQU87QUFDckIsTUFBTXBRLG1CQUFtQjNEO0lBQ3JCK0IsT0FBT0wsS0FBSyxFQUFFO1FBQ1YsTUFBTSxFQUFFeEUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDMkUsbUJBQW1CLENBQUNIO1FBQ3pDLE1BQU14TCxPQUFPZ0gsSUFBSWhILElBQUk7UUFDckIsT0FBTyxJQUFJLENBQUNrSyxJQUFJLENBQUM5RSxJQUFJLENBQUN5RyxNQUFNLENBQUM7WUFDekI3TDtZQUNBcUQsTUFBTTJELElBQUkzRCxJQUFJO1lBQ2QyRixRQUFRaEM7UUFDWjtJQUNKO0lBQ0FvTyxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUNsTCxJQUFJLENBQUM5RSxJQUFJO0lBQ3pCO0FBQ0o7QUFDQSxNQUFNMkksb0JBQW9CakU7SUFDdEIrQixPQUFPTCxLQUFLLEVBQUU7UUFDVixNQUFNLEVBQUUvRCxNQUFNLEVBQUVULEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzJFLG1CQUFtQixDQUFDSDtRQUNqRCxJQUFJeEUsSUFBSUMsTUFBTSxDQUFDZ0YsS0FBSyxFQUFFO1lBQ2xCLE1BQU02UixjQUFjO2dCQUNoQixNQUFNQyxXQUFXLE1BQU0sSUFBSSxDQUFDN1QsSUFBSSxDQUFDOFQsRUFBRSxDQUFDbFMsV0FBVyxDQUFDO29CQUM1QzlMLE1BQU1nSCxJQUFJaEgsSUFBSTtvQkFDZHFELE1BQU0yRCxJQUFJM0QsSUFBSTtvQkFDZDJGLFFBQVFoQztnQkFDWjtnQkFDQSxJQUFJK1csU0FBU3RXLE1BQU0sS0FBSyxXQUNwQixPQUFPSTtnQkFDWCxJQUFJa1csU0FBU3RXLE1BQU0sS0FBSyxTQUFTO29CQUM3QkEsT0FBT0gsS0FBSztvQkFDWixPQUFPZ0IsTUFBTXlWLFNBQVN2ZSxLQUFLO2dCQUMvQixPQUNLO29CQUNELE9BQU8sSUFBSSxDQUFDMEssSUFBSSxDQUFDK1QsR0FBRyxDQUFDblMsV0FBVyxDQUFDO3dCQUM3QjlMLE1BQU0rZCxTQUFTdmUsS0FBSzt3QkFDcEI2RCxNQUFNMkQsSUFBSTNELElBQUk7d0JBQ2QyRixRQUFRaEM7b0JBQ1o7Z0JBQ0o7WUFDSjtZQUNBLE9BQU84VztRQUNYLE9BQ0s7WUFDRCxNQUFNQyxXQUFXLElBQUksQ0FBQzdULElBQUksQ0FBQzhULEVBQUUsQ0FBQ3BTLFVBQVUsQ0FBQztnQkFDckM1TCxNQUFNZ0gsSUFBSWhILElBQUk7Z0JBQ2RxRCxNQUFNMkQsSUFBSTNELElBQUk7Z0JBQ2QyRixRQUFRaEM7WUFDWjtZQUNBLElBQUkrVyxTQUFTdFcsTUFBTSxLQUFLLFdBQ3BCLE9BQU9JO1lBQ1gsSUFBSWtXLFNBQVN0VyxNQUFNLEtBQUssU0FBUztnQkFDN0JBLE9BQU9ILEtBQUs7Z0JBQ1osT0FBTztvQkFDSEcsUUFBUTtvQkFDUmpJLE9BQU91ZSxTQUFTdmUsS0FBSztnQkFDekI7WUFDSixPQUNLO2dCQUNELE9BQU8sSUFBSSxDQUFDMEssSUFBSSxDQUFDK1QsR0FBRyxDQUFDclMsVUFBVSxDQUFDO29CQUM1QjVMLE1BQU0rZCxTQUFTdmUsS0FBSztvQkFDcEI2RCxNQUFNMkQsSUFBSTNELElBQUk7b0JBQ2QyRixRQUFRaEM7Z0JBQ1o7WUFDSjtRQUNKO0lBQ0o7SUFDQSxPQUFPbEQsT0FBTzRVLENBQUMsRUFBRUMsQ0FBQyxFQUFFO1FBQ2hCLE9BQU8sSUFBSTVLLFlBQVk7WUFDbkJpUSxJQUFJdEY7WUFDSnVGLEtBQUt0RjtZQUNMak0sVUFBVUMsc0JBQXNCb0IsV0FBVztRQUMvQztJQUNKO0FBQ0o7QUFDQSxNQUFNQyxvQkFBb0JsRTtJQUN0QitCLE9BQU9MLEtBQUssRUFBRTtRQUNWLE1BQU1uQyxTQUFTLElBQUksQ0FBQ2EsSUFBSSxDQUFDcUQsU0FBUyxDQUFDMUIsTUFBTSxDQUFDTDtRQUMxQyxJQUFJOUMsUUFBUVcsU0FBUztZQUNqQkEsT0FBTzdKLEtBQUssR0FBR3ZCLE9BQU9vSyxNQUFNLENBQUNnQixPQUFPN0osS0FBSztRQUM3QztRQUNBLE9BQU82SjtJQUNYO0FBQ0o7QUFDQTJFLFlBQVlsSyxNQUFNLEdBQUcsQ0FBQ3NCLE1BQU1nQjtJQUN4QixPQUFPLElBQUk0SCxZQUFZO1FBQ25CVCxXQUFXbkk7UUFDWHNILFVBQVVDLHNCQUFzQnFCLFdBQVc7UUFDM0MsR0FBR3hFLG9CQUFvQnBELE9BQU87SUFDbEM7QUFDSjtBQUNBLE1BQU1WLFNBQVMsQ0FBQ3lHLE9BQU8vRixTQUFTLENBQUMsQ0FBQyxFQUNsQzs7Ozs7Ozs7O0NBU0MsR0FDRDRXO0lBQ0ksSUFBSTdRLE9BQ0EsT0FBT2lJLE9BQU90USxNQUFNLEdBQUcyRyxXQUFXLENBQUMsQ0FBQ3pLLE1BQU1nSDtRQUN0QyxJQUFJZ0YsSUFBSWtLO1FBQ1IsSUFBSSxDQUFDL0osTUFBTW5NLE9BQU87WUFDZCxNQUFNa2UsSUFBSSxPQUFPOVgsV0FBVyxhQUN0QkEsT0FBT3BHLFFBQ1AsT0FBT29HLFdBQVcsV0FDZDtnQkFBRXhELFNBQVN3RDtZQUFPLElBQ2xCQTtZQUNWLE1BQU0rWCxTQUFTLENBQUNqSSxLQUFLLENBQUNsSyxLQUFLa1MsRUFBRWxCLEtBQUssTUFBTSxRQUFRaFIsT0FBTyxLQUFLLElBQUlBLEtBQUtnUixLQUFJLE1BQU8sUUFBUTlHLE9BQU8sS0FBSyxJQUFJQSxLQUFLO1lBQzdHLE1BQU1rSSxLQUFLLE9BQU9GLE1BQU0sV0FBVztnQkFBRXRiLFNBQVNzYjtZQUFFLElBQUlBO1lBQ3BEbFgsSUFBSWpGLFFBQVEsQ0FBQztnQkFBRWtCLE1BQU07Z0JBQVUsR0FBR21iLEVBQUU7Z0JBQUVwQixPQUFPbUI7WUFBTztRQUN4RDtJQUNKO0lBQ0osT0FBTy9KLE9BQU90USxNQUFNO0FBQ3hCO0FBQ0EsTUFBTXVhLE9BQU87SUFDVGxnQixRQUFRNlcsVUFBVXVDLFVBQVU7QUFDaEM7QUFDQSxJQUFJNUs7QUFDSCxVQUFVQSxxQkFBcUI7SUFDNUJBLHFCQUFxQixDQUFDLFlBQVksR0FBRztJQUNyQ0EscUJBQXFCLENBQUMsWUFBWSxHQUFHO0lBQ3JDQSxxQkFBcUIsQ0FBQyxTQUFTLEdBQUc7SUFDbENBLHFCQUFxQixDQUFDLFlBQVksR0FBRztJQUNyQ0EscUJBQXFCLENBQUMsYUFBYSxHQUFHO0lBQ3RDQSxxQkFBcUIsQ0FBQyxVQUFVLEdBQUc7SUFDbkNBLHFCQUFxQixDQUFDLFlBQVksR0FBRztJQUNyQ0EscUJBQXFCLENBQUMsZUFBZSxHQUFHO0lBQ3hDQSxxQkFBcUIsQ0FBQyxVQUFVLEdBQUc7SUFDbkNBLHFCQUFxQixDQUFDLFNBQVMsR0FBRztJQUNsQ0EscUJBQXFCLENBQUMsYUFBYSxHQUFHO0lBQ3RDQSxxQkFBcUIsQ0FBQyxXQUFXLEdBQUc7SUFDcENBLHFCQUFxQixDQUFDLFVBQVUsR0FBRztJQUNuQ0EscUJBQXFCLENBQUMsV0FBVyxHQUFHO0lBQ3BDQSxxQkFBcUIsQ0FBQyxZQUFZLEdBQUc7SUFDckNBLHFCQUFxQixDQUFDLFdBQVcsR0FBRztJQUNwQ0EscUJBQXFCLENBQUMsd0JBQXdCLEdBQUc7SUFDakRBLHFCQUFxQixDQUFDLGtCQUFrQixHQUFHO0lBQzNDQSxxQkFBcUIsQ0FBQyxXQUFXLEdBQUc7SUFDcENBLHFCQUFxQixDQUFDLFlBQVksR0FBRztJQUNyQ0EscUJBQXFCLENBQUMsU0FBUyxHQUFHO0lBQ2xDQSxxQkFBcUIsQ0FBQyxTQUFTLEdBQUc7SUFDbENBLHFCQUFxQixDQUFDLGNBQWMsR0FBRztJQUN2Q0EscUJBQXFCLENBQUMsVUFBVSxHQUFHO0lBQ25DQSxxQkFBcUIsQ0FBQyxhQUFhLEdBQUc7SUFDdENBLHFCQUFxQixDQUFDLFVBQVUsR0FBRztJQUNuQ0EscUJBQXFCLENBQUMsYUFBYSxHQUFHO0lBQ3RDQSxxQkFBcUIsQ0FBQyxnQkFBZ0IsR0FBRztJQUN6Q0EscUJBQXFCLENBQUMsY0FBYyxHQUFHO0lBQ3ZDQSxxQkFBcUIsQ0FBQyxjQUFjLEdBQUc7SUFDdkNBLHFCQUFxQixDQUFDLGFBQWEsR0FBRztJQUN0Q0EscUJBQXFCLENBQUMsV0FBVyxHQUFHO0lBQ3BDQSxxQkFBcUIsQ0FBQyxhQUFhLEdBQUc7SUFDdENBLHFCQUFxQixDQUFDLGFBQWEsR0FBRztJQUN0Q0EscUJBQXFCLENBQUMsY0FBYyxHQUFHO0lBQ3ZDQSxxQkFBcUIsQ0FBQyxjQUFjLEdBQUc7QUFDM0MsR0FBR0EseUJBQTBCQSxDQUFBQSx3QkFBd0IsQ0FBQztBQUN0RCxNQUFNMlIsaUJBQWlCLENBQ3ZCLGtFQUFrRTtBQUNsRUMsS0FBS25ZLFNBQVM7SUFDVnhELFNBQVMsQ0FBQyxzQkFBc0IsRUFBRTJiLElBQUlqYyxJQUFJLENBQUMsQ0FBQztBQUNoRCxDQUFDLEdBQUtvRCxPQUFPLENBQUMxRixPQUFTQSxnQkFBZ0J1ZSxLQUFLblk7QUFDNUMsTUFBTW9ZLGFBQWFyUCxVQUFVckwsTUFBTTtBQUNuQyxNQUFNMmEsYUFBYW5NLFVBQVV4TyxNQUFNO0FBQ25DLE1BQU00YSxVQUFVZixPQUFPN1osTUFBTTtBQUM3QixNQUFNNmEsYUFBYWxMLFVBQVUzUCxNQUFNO0FBQ25DLE1BQU04YSxjQUFjakwsV0FBVzdQLE1BQU07QUFDckMsTUFBTSthLFdBQVdoTCxRQUFRL1AsTUFBTTtBQUMvQixNQUFNZ2IsYUFBYTdLLFVBQVVuUSxNQUFNO0FBQ25DLE1BQU1pYixnQkFBZ0I3SyxhQUFhcFEsTUFBTTtBQUN6QyxNQUFNa2IsV0FBVzdLLFFBQVFyUSxNQUFNO0FBQy9CLE1BQU1tYixVQUFVN0ssT0FBT3RRLE1BQU07QUFDN0IsTUFBTW9iLGNBQWM1SyxXQUFXeFEsTUFBTTtBQUNyQyxNQUFNcWIsWUFBWTNLLFNBQVMxUSxNQUFNO0FBQ2pDLE1BQU1zYixXQUFXMUssUUFBUTVRLE1BQU07QUFDL0IsTUFBTXViLFlBQVl0UyxTQUFTakosTUFBTTtBQUNqQyxNQUFNd2IsYUFBYXRLLFVBQVVsUixNQUFNO0FBQ25DLE1BQU15YixtQkFBbUJ2SyxVQUFVc0MsWUFBWTtBQUMvQyxNQUFNa0ksWUFBWXRTLFNBQVNwSixNQUFNO0FBQ2pDLE1BQU0yYix5QkFBeUJ4SCxzQkFBc0JuVSxNQUFNO0FBQzNELE1BQU00YixtQkFBbUJ0UyxnQkFBZ0J0SixNQUFNO0FBQy9DLE1BQU02YixZQUFZdEssU0FBU3ZSLE1BQU07QUFDakMsTUFBTThiLGFBQWE3RixVQUFValcsTUFBTTtBQUNuQyxNQUFNK2IsVUFBVXhGLE9BQU92VyxNQUFNO0FBQzdCLE1BQU1nYyxVQUFVdEYsT0FBTzFXLE1BQU07QUFDN0IsTUFBTWljLGVBQWU5RSxZQUFZblgsTUFBTTtBQUN2QyxNQUFNa2MsV0FBV3BJLFFBQVE5VCxNQUFNO0FBQy9CLE1BQU1tYyxjQUFjcEksV0FBVy9ULE1BQU07QUFDckMsTUFBTW9jLFdBQVdwSSxRQUFRaFUsTUFBTTtBQUMvQixNQUFNcWMsaUJBQWlCcEksY0FBY2pVLE1BQU07QUFDM0MsTUFBTXNjLGNBQWNwVCxXQUFXbEosTUFBTTtBQUNyQyxNQUFNdWMsY0FBYzdULFdBQVcxSSxNQUFNO0FBQ3JDLE1BQU13YyxlQUFlelQsWUFBWS9JLE1BQU07QUFDdkMsTUFBTXljLGVBQWV6VCxZQUFZaEosTUFBTTtBQUN2QyxNQUFNMGMsaUJBQWlCaFUsV0FBVzhRLG9CQUFvQjtBQUN0RCxNQUFNbUQsZUFBZTFTLFlBQVlqSyxNQUFNO0FBQ3ZDLE1BQU00YyxVQUFVLElBQU1sQyxhQUFhOVQsUUFBUTtBQUMzQyxNQUFNaVcsVUFBVSxJQUFNbEMsYUFBYS9ULFFBQVE7QUFDM0MsTUFBTWtXLFdBQVcsSUFBTWhDLGNBQWNsVSxRQUFRO0FBQzdDLE1BQU0wRSxTQUFTO0lBQ1hsUCxRQUFTLENBQUM2YyxNQUFRNU4sVUFBVXJMLE1BQU0sQ0FBQztZQUFFLEdBQUdpWixHQUFHO1lBQUUzTixRQUFRO1FBQUs7SUFDMUQvTyxRQUFTLENBQUMwYyxNQUFRekssVUFBVXhPLE1BQU0sQ0FBQztZQUFFLEdBQUdpWixHQUFHO1lBQUUzTixRQUFRO1FBQUs7SUFDMUQ5TyxTQUFVLENBQUN5YyxNQUFRcEosV0FBVzdQLE1BQU0sQ0FBQztZQUNqQyxHQUFHaVosR0FBRztZQUNOM04sUUFBUTtRQUNaO0lBQ0E1TyxRQUFTLENBQUN1YyxNQUFRdEosVUFBVTNQLE1BQU0sQ0FBQztZQUFFLEdBQUdpWixHQUFHO1lBQUUzTixRQUFRO1FBQUs7SUFDMURoTyxNQUFPLENBQUMyYixNQUFRbEosUUFBUS9QLE1BQU0sQ0FBQztZQUFFLEdBQUdpWixHQUFHO1lBQUUzTixRQUFRO1FBQUs7QUFDMUQ7QUFDQSxNQUFNeVIsUUFBUWhaO0FBRWQsSUFBSWlaLElBQUksV0FBVyxHQUFFN2lCLE9BQU9vSyxNQUFNLENBQUM7SUFDL0JoRyxXQUFXO0lBQ1gwZSxpQkFBaUJoZDtJQUNqQmtDLGFBQWFBO0lBQ2JDLGFBQWFBO0lBQ2JDLFdBQVdBO0lBQ1hXLFlBQVlBO0lBQ1pDLG1CQUFtQkE7SUFDbkJNLGFBQWFBO0lBQ2JRLFNBQVNBO0lBQ1RTLE9BQU9BO0lBQ1BDLElBQUlBO0lBQ0pDLFdBQVdBO0lBQ1hDLFNBQVNBO0lBQ1RDLFNBQVNBO0lBQ1RDLFNBQVNBO0lBQ1QsSUFBSS9MLFFBQVE7UUFBRSxPQUFPQTtJQUFNO0lBQzNCLElBQUk4QyxjQUFjO1FBQUUsT0FBT0E7SUFBWTtJQUN2Q0ksZUFBZUE7SUFDZkMsZUFBZUE7SUFDZitKLFNBQVNBO0lBQ1RxRixXQUFXQTtJQUNYbUQsV0FBV0E7SUFDWG1CLFdBQVdBO0lBQ1hFLFlBQVlBO0lBQ1pFLFNBQVNBO0lBQ1RJLFdBQVdBO0lBQ1hDLGNBQWNBO0lBQ2RDLFNBQVNBO0lBQ1RDLFFBQVFBO0lBQ1JFLFlBQVlBO0lBQ1pFLFVBQVVBO0lBQ1ZFLFNBQVNBO0lBQ1QzSCxVQUFVQTtJQUNWaUksV0FBV0E7SUFDWDlILFVBQVVBO0lBQ1YrSyx1QkFBdUJBO0lBQ3ZCN0ssaUJBQWlCQTtJQUNqQmlJLFVBQVVBO0lBQ1YwRSxXQUFXQTtJQUNYTSxRQUFRQTtJQUNSRyxRQUFRQTtJQUNSUyxhQUFhQTtJQUNickQsU0FBU0E7SUFDVEMsWUFBWUE7SUFDWkMsU0FBU0E7SUFDVEMsZUFBZUE7SUFDZi9LLFlBQVlBO0lBQ1pSLFlBQVlBO0lBQ1p3VSxnQkFBZ0J4VTtJQUNoQkssYUFBYUE7SUFDYkMsYUFBYUE7SUFDYlEsWUFBWUE7SUFDWkssVUFBVUE7SUFDVmdRLFFBQVFBO0lBQ1JDLE9BQU9BO0lBQ1BuUSxZQUFZQTtJQUNaTSxhQUFhQTtJQUNiQyxhQUFhQTtJQUNidEksUUFBUUE7SUFDUnViLFFBQVFuWDtJQUNSb1gsV0FBV3BYO0lBQ1h1VSxNQUFNQTtJQUNOLElBQUkxUix5QkFBeUI7UUFBRSxPQUFPQTtJQUF1QjtJQUM3RHlDLFFBQVFBO0lBQ1IrUixLQUFLbEM7SUFDTDlmLE9BQU9rZ0I7SUFDUDdlLFFBQVFtZTtJQUNScmUsU0FBU3NlO0lBQ1R4ZCxNQUFNeWQ7SUFDTnVDLG9CQUFvQjNCO0lBQ3BCN1MsUUFBUXlUO0lBQ1IsUUFBUUg7SUFDUixZQUFZSDtJQUNaLGNBQWN6QjtJQUNkK0MsY0FBYzNCO0lBQ2Q0QixNQUFNdEI7SUFDTnVCLFNBQVN0QjtJQUNUbGlCLEtBQUs4aEI7SUFDTHpmLEtBQUtzZTtJQUNMOEMsWUFBWXJCO0lBQ1oxTCxPQUFPMEs7SUFDUCxRQUFRSDtJQUNSclUsVUFBVTRWO0lBQ1ZsZ0IsUUFBUW9lO0lBQ1J0Z0IsUUFBUW1oQjtJQUNSc0IsVUFBVUE7SUFDVkQsU0FBU0E7SUFDVGpXLFVBQVU0VjtJQUNWSSxTQUFTQTtJQUNUZSxVQUFVaEI7SUFDVmxELFlBQVlpRDtJQUNaemYsU0FBU3FmO0lBQ1RzQixRQUFROUI7SUFDUjFlLEtBQUs0ZTtJQUNMNkIsY0FBY3BDO0lBQ2RyZixRQUFRc2U7SUFDUi9kLFFBQVFxZTtJQUNSOEMsYUFBYXZCO0lBQ2J3QixPQUFPbEM7SUFDUCxhQUFhWjtJQUNiK0MsT0FBT3RDO0lBQ1BuZSxTQUFTNmQ7SUFDVCxRQUFRRTtJQUNSeUIsT0FBT0E7SUFDUHZmLGNBQWNBO0lBQ2RDLGVBQWVBO0lBQ2ZLLFVBQVVBO0FBQ2Q7QUFFNnFEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZW1iZWRjaGFpbi1hZG1pbi8uL25vZGVfbW9kdWxlcy96b2QvbGliL2luZGV4Lm1qcz83N2Q4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciB1dGlsO1xuKGZ1bmN0aW9uICh1dGlsKSB7XG4gICAgdXRpbC5hc3NlcnRFcXVhbCA9ICh2YWwpID0+IHZhbDtcbiAgICBmdW5jdGlvbiBhc3NlcnRJcyhfYXJnKSB7IH1cbiAgICB1dGlsLmFzc2VydElzID0gYXNzZXJ0SXM7XG4gICAgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0TmV2ZXIgPSBhc3NlcnROZXZlcjtcbiAgICB1dGlsLmFycmF5VG9FbnVtID0gKGl0ZW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIG9ialtpdGVtXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICAgIHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB1dGlsLm9iamVjdEtleXMob2JqKS5maWx0ZXIoKGspID0+IHR5cGVvZiBvYmpbb2JqW2tdXSAhPT0gXCJudW1iZXJcIik7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0ge307XG4gICAgICAgIGZvciAoY29uc3QgayBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkW2tdID0gb2JqW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyhmaWx0ZXJlZCk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdFZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0S2V5cyhvYmopLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ialtlXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdEtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09IFwiZnVuY3Rpb25cIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgPyAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6IChvYmplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9O1xuICAgIHV0aWwuZmluZCA9IChhcnIsIGNoZWNrZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGNoZWNrZXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHV0aWwuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/ICh2YWwpID0+IE51bWJlci5pc0ludGVnZXIodmFsKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKHZhbCkgJiYgTWF0aC5mbG9vcih2YWwpID09PSB2YWw7XG4gICAgZnVuY3Rpb24gam9pblZhbHVlcyhhcnJheSwgc2VwYXJhdG9yID0gXCIgfCBcIikge1xuICAgICAgICByZXR1cm4gYXJyYXlcbiAgICAgICAgICAgIC5tYXAoKHZhbCkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJyR7dmFsfSdgIDogdmFsKSlcbiAgICAgICAgICAgIC5qb2luKHNlcGFyYXRvcik7XG4gICAgfVxuICAgIHV0aWwuam9pblZhbHVlcyA9IGpvaW5WYWx1ZXM7XG4gICAgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIgPSAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG59KSh1dGlsIHx8ICh1dGlsID0ge30pKTtcbnZhciBvYmplY3RVdGlsO1xuKGZ1bmN0aW9uIChvYmplY3RVdGlsKSB7XG4gICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyA9IChmaXJzdCwgc2Vjb25kKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5maXJzdCxcbiAgICAgICAgICAgIC4uLnNlY29uZCwgLy8gc2Vjb25kIG92ZXJ3cml0ZXMgZmlyc3RcbiAgICAgICAgfTtcbiAgICB9O1xufSkob2JqZWN0VXRpbCB8fCAob2JqZWN0VXRpbCA9IHt9KSk7XG5jb25zdCBab2RQYXJzZWRUeXBlID0gdXRpbC5hcnJheVRvRW51bShbXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm5hblwiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJmbG9hdFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiYmlnaW50XCIsXG4gICAgXCJzeW1ib2xcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJ1bmRlZmluZWRcIixcbiAgICBcIm51bGxcIixcbiAgICBcImFycmF5XCIsXG4gICAgXCJvYmplY3RcIixcbiAgICBcInVua25vd25cIixcbiAgICBcInByb21pc2VcIixcbiAgICBcInZvaWRcIixcbiAgICBcIm5ldmVyXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInNldFwiLFxuXSk7XG5jb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZDtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3RyaW5nO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4oZGF0YSkgPyBab2RQYXJzZWRUeXBlLm5hbiA6IFpvZFBhcnNlZFR5cGUubnVtYmVyO1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuYm9vbGVhbjtcbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbjtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuYmlnaW50O1xuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5zeW1ib2w7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuYXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50aGVuICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgZGF0YS5jYXRjaCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLmNhdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5wcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5zZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIERhdGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5kYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUub2JqZWN0O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUudW5rbm93bjtcbiAgICB9XG59O1xuXG5jb25zdCBab2RJc3N1ZUNvZGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcImludmFsaWRfdHlwZVwiLFxuICAgIFwiaW52YWxpZF9saXRlcmFsXCIsXG4gICAgXCJjdXN0b21cIixcbiAgICBcImludmFsaWRfdW5pb25cIixcbiAgICBcImludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvclwiLFxuICAgIFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIsXG4gICAgXCJ1bnJlY29nbml6ZWRfa2V5c1wiLFxuICAgIFwiaW52YWxpZF9hcmd1bWVudHNcIixcbiAgICBcImludmFsaWRfcmV0dXJuX3R5cGVcIixcbiAgICBcImludmFsaWRfZGF0ZVwiLFxuICAgIFwiaW52YWxpZF9zdHJpbmdcIixcbiAgICBcInRvb19zbWFsbFwiLFxuICAgIFwidG9vX2JpZ1wiLFxuICAgIFwiaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXNcIixcbiAgICBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgIFwibm90X2Zpbml0ZVwiLFxuXSk7XG5jb25zdCBxdW90ZWxlc3NKc29uID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgIHJldHVybiBqc29uLnJlcGxhY2UoL1wiKFteXCJdKylcIjovZywgXCIkMTpcIik7XG59O1xuY2xhc3MgWm9kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoaXNzdWVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gW107XG4gICAgICAgIHRoaXMuYWRkSXNzdWUgPSAoc3ViKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3Vlcywgc3ViXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZXMgPSAoc3VicyA9IFtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3VlcywgLi4uc3Vic107XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFjdHVhbFByb3RvID0gbmV3LnRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgYWN0dWFsUHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fX3Byb3RvX18gPSBhY3R1YWxQcm90bztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hbWUgPSBcIlpvZEVycm9yXCI7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gaXNzdWVzO1xuICAgIH1cbiAgICBnZXQgZXJyb3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZXM7XG4gICAgfVxuICAgIGZvcm1hdChfbWFwcGVyKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlciA9IF9tYXBwZXIgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChpc3N1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3VuaW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWUudW5pb25FcnJvcnMubWFwKHByb2Nlc3NFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9yZXR1cm5fdHlwZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihpc3N1ZS5yZXR1cm5UeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfYXJndW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLmFyZ3VtZW50c0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUucGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnIgPSBmaWVsZEVycm9ycztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGlzc3VlLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbCA9IGkgPT09IGlzc3VlLnBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHR5cGVvZiBlbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc3QgZXJyb3JBcnJheTogYW55ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBlcnJvckFycmF5Ll9lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgZXJyb3JBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXS5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3VycltlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHByb2Nlc3NFcnJvcih0aGlzKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkRXJyb3JzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG4gICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcywgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZmxhdHRlbihtYXBwZXIgPSAoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUVycm9ycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLmlzc3Vlcykge1xuICAgICAgICAgICAgaWYgKHN1Yi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gPSBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gfHwgW107XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybUVycm9ycy5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmb3JtRXJyb3JzLCBmaWVsZEVycm9ycyB9O1xuICAgIH1cbiAgICBnZXQgZm9ybUVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhdHRlbigpO1xuICAgIH1cbn1cblpvZEVycm9yLmNyZWF0ZSA9IChpc3N1ZXMpID0+IHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihpc3N1ZXMpO1xuICAgIHJldHVybiBlcnJvcjtcbn07XG5cbmNvbnN0IGVycm9yTWFwID0gKGlzc3VlLCBfY3R4KSA9PiB7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgc3dpdGNoIChpc3N1ZS5jb2RlKSB7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZTpcbiAgICAgICAgICAgIGlmIChpc3N1ZS5yZWNlaXZlZCA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJSZXF1aXJlZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBFeHBlY3RlZCAke2lzc3VlLmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHtpc3N1ZS5yZWNlaXZlZH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGlzc3VlLmV4cGVjdGVkLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlcil9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgVW5yZWNvZ25pemVkIGtleShzKSBpbiBvYmplY3Q6ICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLmtleXMsIFwiLCBcIil9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtpc3N1ZS5yZWNlaXZlZH0nYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiBhcmd1bWVudHNgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZnVuY3Rpb24gcmV0dXJuIHR5cGVgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkYXRlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChcImluY2x1ZGVzXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSBcIiR7aXNzdWUudmFsaWRhdGlvbi5pbmNsdWRlc31cImA7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbi5wb3NpdGlvbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGAke21lc3NhZ2V9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9ufWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJzdGFydHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3Qgc3RhcnQgd2l0aCBcIiR7aXNzdWUudmFsaWRhdGlvbi5zdGFydHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJlbmRzV2l0aFwiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmVuZHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUudmFsaWRhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudmFsaWRhdGlvbiAhPT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkICR7aXNzdWUudmFsaWRhdGlvbn1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnRvb19zbWFsbDpcbiAgICAgICAgICAgIGlmIChpc3N1ZS50eXBlID09PSBcImFycmF5XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBtb3JlIHRoYW5gfSAke2lzc3VlLm1pbmltdW19IGVsZW1lbnQocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBvdmVyYH0gJHtpc3N1ZS5taW5pbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseSBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZ3JlYXRlciB0aGFuIGB9JHtpc3N1ZS5taW5pbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHkgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGdyZWF0ZXIgdGhhbiBgfSR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1pbmltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fYmlnOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYHVuZGVyYH0gJHtpc3N1ZS5tYXhpbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEJpZ0ludCBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBEYXRlIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgc21hbGxlciB0aGFuYH0gJHtuZXcgRGF0ZShOdW1iZXIoaXNzdWUubWF4aW11bSkpfWA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmN1c3RvbTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludGVyc2VjdGlvbiByZXN1bHRzIGNvdWxkIG5vdCBiZSBtZXJnZWRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke2lzc3VlLm11bHRpcGxlT2Z9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5ub3RfZmluaXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IFwiTnVtYmVyIG11c3QgYmUgZmluaXRlXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBfY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlIH07XG59O1xuXG5sZXQgb3ZlcnJpZGVFcnJvck1hcCA9IGVycm9yTWFwO1xuZnVuY3Rpb24gc2V0RXJyb3JNYXAobWFwKSB7XG4gICAgb3ZlcnJpZGVFcnJvck1hcCA9IG1hcDtcbn1cbmZ1bmN0aW9uIGdldEVycm9yTWFwKCkge1xuICAgIHJldHVybiBvdmVycmlkZUVycm9yTWFwO1xufVxuXG5jb25zdCBtYWtlSXNzdWUgPSAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBwYXRoLCBlcnJvck1hcHMsIGlzc3VlRGF0YSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gWy4uLnBhdGgsIC4uLihpc3N1ZURhdGEucGF0aCB8fCBbXSldO1xuICAgIGNvbnN0IGZ1bGxJc3N1ZSA9IHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICB9O1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBcIlwiO1xuICAgIGNvbnN0IG1hcHMgPSBlcnJvck1hcHNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gISFtKVxuICAgICAgICAuc2xpY2UoKVxuICAgICAgICAucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gbWFwKGZ1bGxJc3N1ZSwgeyBkYXRhLCBkZWZhdWx0RXJyb3I6IGVycm9yTWVzc2FnZSB9KS5tZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICBtZXNzYWdlOiBpc3N1ZURhdGEubWVzc2FnZSB8fCBlcnJvck1lc3NhZ2UsXG4gICAgfTtcbn07XG5jb25zdCBFTVBUWV9QQVRIID0gW107XG5mdW5jdGlvbiBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIGlzc3VlRGF0YSkge1xuICAgIGNvbnN0IGlzc3VlID0gbWFrZUlzc3VlKHtcbiAgICAgICAgaXNzdWVEYXRhOiBpc3N1ZURhdGEsXG4gICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCxcbiAgICAgICAgICAgIGdldEVycm9yTWFwKCksXG4gICAgICAgICAgICBlcnJvck1hcCwgLy8gdGhlbiBnbG9iYWwgZGVmYXVsdCBtYXBcbiAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgfSk7XG4gICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaChpc3N1ZSk7XG59XG5jbGFzcyBQYXJzZVN0YXR1cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcInZhbGlkXCI7XG4gICAgfVxuICAgIGRpcnR5KCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSA9PT0gXCJ2YWxpZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiZGlydHlcIjtcbiAgICB9XG4gICAgYWJvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcImFib3J0ZWRcIjtcbiAgICB9XG4gICAgc3RhdGljIG1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5VmFsdWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAocy5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGFycmF5VmFsdWUucHVzaChzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGFycmF5VmFsdWUgfTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIG1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBhd2FpdCBwYWlyLmtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYXdhaXQgcGFpci52YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgIH1cbiAgICBzdGF0aWMgbWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpIHtcbiAgICAgICAgY29uc3QgZmluYWxPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHBhaXI7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAoa2V5LnZhbHVlICE9PSBcIl9fcHJvdG9fX1wiICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiB8fCBwYWlyLmFsd2F5c1NldCkpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE9iamVjdFtrZXkudmFsdWVdID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE9iamVjdCB9O1xuICAgIH1cbn1cbmNvbnN0IElOVkFMSUQgPSBPYmplY3QuZnJlZXplKHtcbiAgICBzdGF0dXM6IFwiYWJvcnRlZFwiLFxufSk7XG5jb25zdCBESVJUWSA9ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiBcImRpcnR5XCIsIHZhbHVlIH0pO1xuY29uc3QgT0sgPSAodmFsdWUpID0+ICh7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZSB9KTtcbmNvbnN0IGlzQWJvcnRlZCA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCI7XG5jb25zdCBpc0RpcnR5ID0gKHgpID0+IHguc3RhdHVzID09PSBcImRpcnR5XCI7XG5jb25zdCBpc1ZhbGlkID0gKHgpID0+IHguc3RhdHVzID09PSBcInZhbGlkXCI7XG5jb25zdCBpc0FzeW5jID0gKHgpID0+IHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHggaW5zdGFuY2VvZiBQcm9taXNlO1xuXG52YXIgZXJyb3JVdGlsO1xuKGZ1bmN0aW9uIChlcnJvclV0aWwpIHtcbiAgICBlcnJvclV0aWwuZXJyVG9PYmogPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2UgfSA6IG1lc3NhZ2UgfHwge307XG4gICAgZXJyb3JVdGlsLnRvU3RyaW5nID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5tZXNzYWdlO1xufSkoZXJyb3JVdGlsIHx8IChlcnJvclV0aWwgPSB7fSkpO1xuXG5jbGFzcyBQYXJzZUlucHV0TGF6eVBhdGgge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsdWUsIHBhdGgsIGtleSkge1xuICAgICAgICB0aGlzLl9jYWNoZWRQYXRoID0gW107XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGVkUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9rZXkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCAuLi50aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIHRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGg7XG4gICAgfVxufVxuY29uc3QgaGFuZGxlUmVzdWx0ID0gKGN0eCwgcmVzdWx0KSA9PiB7XG4gICAgaWYgKGlzVmFsaWQocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHQudmFsdWUgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcylcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIGNvbnN0IHsgZXJyb3JNYXAsIGludmFsaWRfdHlwZV9lcnJvciwgcmVxdWlyZWRfZXJyb3IsIGRlc2NyaXB0aW9uIH0gPSBwYXJhbXM7XG4gICAgaWYgKGVycm9yTWFwICYmIChpbnZhbGlkX3R5cGVfZXJyb3IgfHwgcmVxdWlyZWRfZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdXNlIFwiaW52YWxpZF90eXBlX2Vycm9yXCIgb3IgXCJyZXF1aXJlZF9lcnJvclwiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yTWFwKVxuICAgICAgICByZXR1cm4geyBlcnJvck1hcDogZXJyb3JNYXAsIGRlc2NyaXB0aW9uIH07XG4gICAgY29uc3QgY3VzdG9tTWFwID0gKGlzcywgY3R4KSA9PiB7XG4gICAgICAgIGlmIChpc3MuY29kZSAhPT0gXCJpbnZhbGlkX3R5cGVcIilcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdHguZGF0YSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogcmVxdWlyZWRfZXJyb3IgIT09IG51bGwgJiYgcmVxdWlyZWRfZXJyb3IgIT09IHZvaWQgMCA/IHJlcXVpcmVkX2Vycm9yIDogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGludmFsaWRfdHlwZV9lcnJvciAhPT0gbnVsbCAmJiBpbnZhbGlkX3R5cGVfZXJyb3IgIT09IHZvaWQgMCA/IGludmFsaWRfdHlwZV9lcnJvciA6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICB9O1xuICAgIHJldHVybiB7IGVycm9yTWFwOiBjdXN0b21NYXAsIGRlc2NyaXB0aW9uIH07XG59XG5jbGFzcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihkZWYpIHtcbiAgICAgICAgLyoqIEFsaWFzIG9mIHNhZmVQYXJzZUFzeW5jICovXG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zYWZlUGFyc2VBc3luYztcbiAgICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZSA9IHRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGFyc2VBc3luYyA9IHRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZUFzeW5jID0gdGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNwYSA9IHRoaXMuc3BhLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVmaW5lID0gdGhpcy5yZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmVtZW50ID0gdGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3VwZXJSZWZpbmUgPSB0aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGFibGUgPSB0aGlzLm51bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGlzaCA9IHRoaXMubnVsbGlzaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFycmF5ID0gdGhpcy5hcnJheS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLnByb21pc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vciA9IHRoaXMub3IuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5hbmQgPSB0aGlzLmFuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYnJhbmQgPSB0aGlzLmJyYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNhdGNoID0gdGhpcy5jYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlID0gdGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnBpcGUgPSB0aGlzLnBpcGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWFkb25seSA9IHRoaXMucmVhZG9ubHkuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc051bGxhYmxlID0gdGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNPcHRpb25hbCA9IHRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIF9nZXRUeXBlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBfZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCkge1xuICAgICAgICByZXR1cm4gKGN0eCB8fCB7XG4gICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICBkYXRhOiBpbnB1dC5kYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXRoOiBpbnB1dC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IG5ldyBQYXJzZVN0YXR1cygpLFxuICAgICAgICAgICAgY3R4OiB7XG4gICAgICAgICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLFxuICAgICAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSxcbiAgICAgICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBfcGFyc2VTeW5jKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKGlzQXN5bmMocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX3BhcnNlQXN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuICAgIHBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNhZmVQYXJzZShkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgc2FmZVBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgYXN5bmM6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5hc3luYykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuZXJyb3JNYXAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzdWx0KGN0eCwgcmVzdWx0KTtcbiAgICB9XG4gICAgYXN5bmMgcGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgYXN5bmMgc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWF5YmVBc3luY1Jlc3VsdCA9IHRoaXMuX3BhcnNlKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoaXNBc3luYyhtYXliZUFzeW5jUmVzdWx0KVxuICAgICAgICAgICAgPyBtYXliZUFzeW5jUmVzdWx0XG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShtYXliZUFzeW5jUmVzdWx0KSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICByZWZpbmUoY2hlY2ssIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZ2V0SXNzdWVQcm9wZXJ0aWVzID0gKHZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBtZXNzYWdlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVjayh2YWwpO1xuICAgICAgICAgICAgY29uc3Qgc2V0RXJyb3IgPSAoKSA9PiBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICAgICAgLi4uZ2V0SXNzdWVQcm9wZXJ0aWVzKHZhbCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHNldEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWZpbmVtZW50KGNoZWNrLCByZWZpbmVtZW50RGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGlmICghY2hlY2sodmFsKSkge1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh0eXBlb2YgcmVmaW5lbWVudERhdGEgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IHJlZmluZW1lbnREYXRhKHZhbCwgY3R4KVxuICAgICAgICAgICAgICAgICAgICA6IHJlZmluZW1lbnREYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWZpbmVtZW50KHJlZmluZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInJlZmluZW1lbnRcIiwgcmVmaW5lbWVudCB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3VwZXJSZWZpbmUocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudChyZWZpbmVtZW50KTtcbiAgICB9XG4gICAgb3B0aW9uYWwoKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGlzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpO1xuICAgIH1cbiAgICBhcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZEFycmF5LmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gWm9kUHJvbWlzZS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgb3Iob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBab2RVbmlvbi5jcmVhdGUoW3RoaXMsIG9wdGlvbl0sIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIGFuZChpbmNvbWluZykge1xuICAgICAgICByZXR1cm4gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZSh0aGlzLCBpbmNvbWluZywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtKHRyYW5zZm9ybSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmYXVsdChkZWYpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09IFwiZnVuY3Rpb25cIiA/IGRlZiA6ICgpID0+IGRlZjtcbiAgICAgICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlRnVuYyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGJyYW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJyYW5kZWQoe1xuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCcmFuZGVkLFxuICAgICAgICAgICAgdHlwZTogdGhpcyxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoKGRlZikge1xuICAgICAgICBjb25zdCBjYXRjaFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09IFwiZnVuY3Rpb25cIiA/IGRlZiA6ICgpID0+IGRlZjtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBpbm5lclR5cGU6IHRoaXMsXG4gICAgICAgICAgICBjYXRjaFZhbHVlOiBjYXRjaFZhbHVlRnVuYyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZXNjcmliZShkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCBUaGlzID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBUaGlzKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGlwZSh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFpvZFBpcGVsaW5lLmNyZWF0ZSh0aGlzLCB0YXJnZXQpO1xuICAgIH1cbiAgICByZWFkb25seSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZFJlYWRvbmx5LmNyZWF0ZSh0aGlzKTtcbiAgICB9XG4gICAgaXNPcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKHVuZGVmaW5lZCkuc3VjY2VzcztcbiAgICB9XG4gICAgaXNOdWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKG51bGwpLnN1Y2Nlc3M7XG4gICAgfVxufVxuY29uc3QgY3VpZFJlZ2V4ID0gL15jW15cXHMtXXs4LH0kL2k7XG5jb25zdCBjdWlkMlJlZ2V4ID0gL15bYS16XVthLXowLTldKiQvO1xuY29uc3QgdWxpZFJlZ2V4ID0gL15bMC05QS1ISktNTlAtVFYtWl17MjZ9JC87XG4vLyBjb25zdCB1dWlkUmVnZXggPVxuLy8gICAvXihbYS1mMC05XXs4fS1bYS1mMC05XXs0fS1bMS01XVthLWYwLTldezN9LVthLWYwLTldezR9LVthLWYwLTldezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO1xuY29uc3QgdXVpZFJlZ2V4ID0gL15bMC05YS1mQS1GXXs4fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXsxMn0kL2k7XG4vLyBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjE4MS8xNTUwMTU1XG4vLyBvbGQgdmVyc2lvbjogdG9vIHNsb3csIGRpZG4ndCBzdXBwb3J0IHVuaWNvZGVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPSAvXigoKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSsoXFwuKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSspKil8KChcXHgyMikoKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPygoW1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4N2ZdfFxceDIxfFtcXHgyMy1cXHg1Yl18W1xceDVkLVxceDdlXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KFxcXFwoW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBkLVxceDdmXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSkqKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPyhcXHgyMikpKUAoKChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuKSsoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSkkL2k7XG4vL29sZCBlbWFpbCByZWdleFxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKChbXjw+KClbXFxdLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF0uLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoPyEtKShbXjw+KClbXFxdLiw7Olxcc0BcIl0rXFwuKStbXjw+KClbXFxdLiw7Olxcc0BcIl17MSx9KVteLTw+KClbXFxdLiw7Olxcc0BcIl0kL2k7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXigoW148PigpW1xcXVxcXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChcXFsoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXF0pfChcXFtJUHY2OigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSlcXF0pfChbQS1aYS16MC05XShbQS1aYS16MC05LV0qW0EtWmEtejAtOV0pKihcXC5bQS1aYS16XXsyLH0pKykpJC87XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16QS1aMC05XFwuXFwhXFwjXFwkXFwlXFwmXFwnXFwqXFwrXFwvXFw9XFw/XFxeXFxfXFxgXFx7XFx8XFx9XFx+XFwtXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXig/OlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcXC5bYS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSp8XCIoPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMVxceDIzLVxceDViXFx4NWQtXFx4N2ZdfFxcXFxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSpcIilAKD86KD86W2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP1xcLikrW2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP3xcXFsoPzooPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldP3xbYS16MC05LV0qW2EtejAtOV06KD86W1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4MjEtXFx4NWFcXHg1My1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKylcXF0pJC9pO1xuY29uc3QgZW1haWxSZWdleCA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aMC05XystXFwuXSopW0EtWjAtOV8rLV1AKFtBLVowLTldW0EtWjAtOVxcLV0qXFwuKStbQS1aXXsyLH0kL2k7XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16MC05LiEjJCUm4oCZKisvPT9eX2B7fH1+LV0rQFthLXowLTktXSsoPzpcXC5bYS16MC05XFwtXSspKiQvaTtcbi8vIGZyb20gaHR0cHM6Ly90aGVrZXZpbnNjb3R0LmNvbS9lbW9qaXMtaW4tamF2YXNjcmlwdC8jd3JpdGluZy1hLXJlZ3VsYXItZXhwcmVzc2lvblxuY29uc3QgX2Vtb2ppUmVnZXggPSBgXihcXFxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9fFxcXFxwe0Vtb2ppX0NvbXBvbmVudH0pKyRgO1xubGV0IGVtb2ppUmVnZXg7XG5jb25zdCBpcHY0UmVnZXggPSAvXigoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSQvO1xuY29uc3QgaXB2NlJlZ2V4ID0gL14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC87XG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMxNDMyMzFcbmNvbnN0IGRhdGV0aW1lUmVnZXggPSAoYXJncykgPT4ge1xuICAgIGlmIChhcmdzLnByZWNpc2lvbikge1xuICAgICAgICBpZiAoYXJncy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1cXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fSgoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9XFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1aJGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MucHJlY2lzaW9uID09PSAwKSB7XG4gICAgICAgIGlmIChhcmdzLm9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfSgoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9WiRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGFyZ3Mub2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KFxcXFwuXFxcXGQrKT8oKFsrLV1cXFxcZHsyfSg6P1xcXFxkezJ9KT8pfFopJGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfShcXFxcLlxcXFxkKyk/WiRgKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5mdW5jdGlvbiBpc1ZhbGlkSVAoaXAsIHZlcnNpb24pIHtcbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjRcIiB8fCAhdmVyc2lvbikgJiYgaXB2NFJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjZcIiB8fCAhdmVyc2lvbikgJiYgaXB2NlJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jbGFzcyBab2RTdHJpbmcgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBTdHJpbmcoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGlucHV0LmRhdGEubGVuZ3RoIDwgY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtYWlsXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtYWlsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbW9qaVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgICAgIGVtb2ppUmVnZXggPSBuZXcgUmVnRXhwKF9lbW9qaVJlZ2V4LCBcInVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW1vamlSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1vamlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXVpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1dWlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY3VpZDJcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZDJSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVsaWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1bGlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwicmVnZXhcIikge1xuICAgICAgICAgICAgICAgIGNoZWNrLnJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IGNoZWNrLnJlZ2V4LnRlc3QoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXN0UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwicmVnZXhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRyaW1cIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaW5jbHVkZXNcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5pbmNsdWRlcyhjaGVjay52YWx1ZSwgY2hlY2sucG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGNoZWNrLnZhbHVlLCBwb3NpdGlvbjogY2hlY2sucG9zaXRpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvTG93ZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0b1VwcGVyQ2FzZVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwic3RhcnRzV2l0aFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLnN0YXJ0c1dpdGgoY2hlY2sudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgc3RhcnRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVuZHNXaXRoXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuZW5kc1dpdGgoY2hlY2sudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgZW5kc1dpdGg6IGNoZWNrLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBkYXRldGltZVJlZ2V4KGNoZWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaXBcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZElQKGlucHV0LmRhdGEsIGNoZWNrLnZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiaXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgX3JlZ2V4KHJlZ2V4LCB2YWxpZGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmluZW1lbnQoKGRhdGEpID0+IHJlZ2V4LnRlc3QoZGF0YSksIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW1haWwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImVtYWlsXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdXJsKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1cmxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBlbW9qaShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1vamlcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1dWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1dWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGN1aWQyKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkMlwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHVsaWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVsaWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBpcChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiaXBcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pO1xuICAgIH1cbiAgICBkYXRldGltZShvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdHlwZW9mIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJlY2lzaW9uKSA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJlY2lzaW9uLFxuICAgICAgICAgICAgb2Zmc2V0OiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub2Zmc2V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWdleChyZWdleCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJyZWdleFwiLFxuICAgICAgICAgICAgcmVnZXg6IHJlZ2V4LFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5jbHVkZXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucG9zaXRpb24sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhcnRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJzdGFydHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbmRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJlbmRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5MZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heExlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICB2YWx1ZTogbGVuLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHouc3RyaW5nKCkubWluKDEpIGluc3RlYWQuXG4gICAgICogQHNlZSB7QGxpbmsgWm9kU3RyaW5nLm1pbn1cbiAgICAgKi9cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBlcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkpO1xuICAgIH1cbiAgICB0cmltKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidHJpbVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9Mb3dlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b0xvd2VyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9VcHBlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b1VwcGVyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGlzRGF0ZXRpbWUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZXRpbWVcIik7XG4gICAgfVxuICAgIGdldCBpc0VtYWlsKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtYWlsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVUkwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidXJsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNFbW9qaSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJlbW9qaVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVVVJRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1dWlkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNDVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQyKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWQyXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVTElEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInVsaWRcIik7XG4gICAgfVxuICAgIGdldCBpc0lQKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImlwXCIpO1xuICAgIH1cbiAgICBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhMZW5ndGgoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG59XG5ab2RTdHJpbmcuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLFxuICAgICAgICBjb2VyY2U6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzk2NjQ4NC93aHktZG9lcy1tb2R1bHVzLW9wZXJhdG9yLXJldHVybi1mcmFjdGlvbmFsLW51bWJlci1pbi1qYXZhc2NyaXB0LzMxNzExMDM0IzMxNzExMDM0XG5mdW5jdGlvbiBmbG9hdFNhZmVSZW1haW5kZXIodmFsLCBzdGVwKSB7XG4gICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBzdGVwRGVjQ291bnQgPSAoc3RlcC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3QgZGVjQ291bnQgPSB2YWxEZWNDb3VudCA+IHN0ZXBEZWNDb3VudCA/IHZhbERlY0NvdW50IDogc3RlcERlY0NvdW50O1xuICAgIGNvbnN0IHZhbEludCA9IHBhcnNlSW50KHZhbC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgY29uc3Qgc3RlcEludCA9IHBhcnNlSW50KHN0ZXAudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIHJldHVybiAodmFsSW50ICUgc3RlcEludCkgLyBNYXRoLnBvdygxMCwgZGVjQ291bnQpO1xufVxuY2xhc3MgWm9kTnVtYmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgICAgIHRoaXMuc3RlcCA9IHRoaXMubXVsdGlwbGVPZjtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gTnVtYmVyKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bWJlcixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcImludFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGlsLmlzSW50ZWdlcihpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IFwiZmxvYXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPiBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPj0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsb2F0U2FmZVJlbWFpbmRlcihpbnB1dC5kYXRhLCBjaGVjay52YWx1ZSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlT2Y6IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZmluaXRlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X2Zpbml0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiaW50XCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3NpdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbm5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZmluaXRlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZmluaXRlXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzYWZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbiAgICBnZXQgaXNJbnQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaW50XCIgfHxcbiAgICAgICAgICAgIChjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIiAmJiB1dGlsLmlzSW50ZWdlcihjaC52YWx1ZSkpKTtcbiAgICB9XG4gICAgZ2V0IGlzRmluaXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbCwgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJmaW5pdGVcIiB8fFxuICAgICAgICAgICAgICAgIGNoLmtpbmQgPT09IFwiaW50XCIgfHxcbiAgICAgICAgICAgICAgICBjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobWluKSAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KTtcbiAgICB9XG59XG5ab2ROdW1iZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdW1iZXIsXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQmlnSW50IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IEJpZ0ludChpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJpZ2ludCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5iaWdpbnQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhICUgY2hlY2sudmFsdWUgIT09IEJpZ0ludCgwKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cblpvZEJpZ0ludC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCaWdJbnQsXG4gICAgICAgIGNvZXJjZTogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RCb29sZWFuIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gQm9vbGVhbihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJvb2xlYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYm9vbGVhbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RCb29sZWFuLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEJvb2xlYW4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJvb2xlYW4sXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRGF0ZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IG5ldyBEYXRlKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5kYXRlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGlucHV0LmRhdGEuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEuZ2V0VGltZSgpID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShpbnB1dC5kYXRhLmdldFRpbWUoKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkRhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluRGF0ZS5nZXRUaW1lKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4RGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhEYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5EYXRlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCA/IG5ldyBEYXRlKG1pbikgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbWF4RGF0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4ICE9IG51bGwgPyBuZXcgRGF0ZShtYXgpIDogbnVsbDtcbiAgICB9XG59XG5ab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICBjb2VyY2U6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSB8fCBmYWxzZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REYXRlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kU3ltYm9sIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3ltYm9sKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnN5bWJvbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RTeW1ib2wuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU3ltYm9sKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTeW1ib2wsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmRlZmluZWQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFVuZGVmaW5lZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmRlZmluZWQoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuZGVmaW5lZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE51bGwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bGwsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kTnVsbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQW55IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgZnJvbSBleHRlbmRpbmcgWm9kQW55LiB0aGlzIGNhdXNlcyBpc3N1ZXMgd2l0aCBjYXRjaGFsbCBpbiBab2RPYmplY3QuXG4gICAgICAgIHRoaXMuX2FueSA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFueSh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQW55LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVW5rbm93biBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyByZXF1aXJlZFxuICAgICAgICB0aGlzLl91bmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RVbmtub3duLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVua25vd24oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVua25vd24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROZXZlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5ldmVyLFxuICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgfVxufVxuWm9kTmV2ZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmV2ZXIoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5ldmVyLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS52b2lkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVm9pZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVm9pZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEFycmF5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4LCBzdGF0dXMgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5leGFjdExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY3R4LmRhdGEubGVuZ3RoID4gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjdHguZGF0YS5sZW5ndGggPCBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRvb0JpZyA/IFpvZElzc3VlQ29kZS50b29fYmlnIDogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogKHRvb1NtYWxsID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogKHRvb0JpZyA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLmV4YWN0TGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5taW5MZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCBkZWYubWluTGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5MZW5ndGgudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5MZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1heExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5tYXhMZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhMZW5ndGgudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZi50eXBlLl9wYXJzZUFzeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICAgICAgfSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlU3luYyhuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTtcbiAgICB9XG4gICAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogbWluTGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhMZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtYXhMZW5ndGg6IHsgdmFsdWU6IG1heExlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZXhhY3RMZW5ndGg6IHsgdmFsdWU6IGxlbiwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTtcbiAgICB9XG59XG5ab2RBcnJheS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgdHlwZTogc2NoZW1hLFxuICAgICAgICBtaW5MZW5ndGg6IG51bGwsXG4gICAgICAgIG1heExlbmd0aDogbnVsbCxcbiAgICAgICAgZXhhY3RMZW5ndGg6IG51bGwsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQXJyYXksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBkZWVwUGFydGlhbGlmeShzY2hlbWEpIHtcbiAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5zaGFwZSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSBzY2hlbWEuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoZmllbGRTY2hlbWEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZEFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4uc2NoZW1hLl9kZWYsXG4gICAgICAgICAgICB0eXBlOiBkZWVwUGFydGlhbGlmeShzY2hlbWEuZWxlbWVudCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gWm9kT3B0aW9uYWwuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS51bndyYXAoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2ROdWxsYWJsZSkge1xuICAgICAgICByZXR1cm4gWm9kTnVsbGFibGUuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS51bndyYXAoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RUdXBsZSkge1xuICAgICAgICByZXR1cm4gWm9kVHVwbGUuY3JlYXRlKHNjaGVtYS5pdGVtcy5tYXAoKGl0ZW0pID0+IGRlZXBQYXJ0aWFsaWZ5KGl0ZW0pKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH1cbn1cbmNsYXNzIFpvZE9iamVjdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9jYWNoZWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgSW4gbW9zdCBjYXNlcywgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkIC0gdW5rbm93biBwcm9wZXJ0aWVzIGFyZSBub3cgc2lsZW50bHkgc3RyaXBwZWQuXG4gICAgICAgICAqIElmIHlvdSB3YW50IHRvIHBhc3MgdGhyb3VnaCB1bmtub3duIHByb3BlcnRpZXMsIHVzZSBgLnBhc3N0aHJvdWdoKClgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5vbnN0cmljdCA9IHRoaXMucGFzc3Rocm91Z2g7XG4gICAgICAgIC8vIGV4dGVuZDxcbiAgICAgICAgLy8gICBBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZSxcbiAgICAgICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgICAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gICAgICAgIC8vICAgICAgID8gT3V0cHV0W2tdXG4gICAgICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgICAgIC8vICAgfT4sXG4gICAgICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgSW5wdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIElucHV0XG4gICAgICAgIC8vICAgICAgID8gSW5wdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PlxuICAgICAgICAvLyA+KFxuICAgICAgICAvLyAgIGF1Z21lbnRhdGlvbjogQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICk6IFpvZE9iamVjdDxcbiAgICAgICAgLy8gICBleHRlbmRTaGFwZTxULCBBdWdtZW50YXRpb24+LFxuICAgICAgICAvLyAgIFVua25vd25LZXlzLFxuICAgICAgICAvLyAgIENhdGNoYWxsLFxuICAgICAgICAvLyAgIE5ld091dHB1dCxcbiAgICAgICAgLy8gICBOZXdJbnB1dFxuICAgICAgICAvLyA+IHtcbiAgICAgICAgLy8gICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIC8vICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgIC8vICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgLy8gICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgIC8vICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgLy8gICAgIH0pLFxuICAgICAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGAuZXh0ZW5kYCBpbnN0ZWFkXG4gICAgICAgICAqICAqL1xuICAgICAgICB0aGlzLmF1Z21lbnQgPSB0aGlzLmV4dGVuZDtcbiAgICB9XG4gICAgX2dldENhY2hlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZGVmLnNoYXBlKCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSB1dGlsLm9iamVjdEtleXMoc2hhcGUpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2NhY2hlZCA9IHsgc2hhcGUsIGtleXMgfSk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IHNoYXBlLCBrZXlzOiBzaGFwZUtleXMgfSA9IHRoaXMuX2dldENhY2hlZCgpO1xuICAgICAgICBjb25zdCBleHRyYUtleXMgPSBbXTtcbiAgICAgICAgaWYgKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIgJiZcbiAgICAgICAgICAgIHRoaXMuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXBlS2V5cykge1xuICAgICAgICAgICAgY29uc3Qga2V5VmFsaWRhdG9yID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXlWYWxpZGF0b3IuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIFpvZE5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB1bmtub3duS2V5cyA9IHRoaXMuX2RlZi51bmtub3duS2V5cztcbiAgICAgICAgICAgIGlmICh1bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGN0eC5kYXRhW2tleV0gfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwic3RyaWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiBleHRyYUtleXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIFpvZE9iamVjdCBlcnJvcjogaW52YWxpZCB1bmtub3duS2V5cyB2YWx1ZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJ1biBjYXRjaGFsbCB2YWxpZGF0aW9uXG4gICAgICAgICAgICBjb25zdCBjYXRjaGFsbCA9IHRoaXMuX2RlZi5jYXRjaGFsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4dHJhS2V5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRjaGFsbC5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSAvLywgY3R4LmNoaWxkKGtleSksIHZhbHVlLCBnZXRQYXJzZWRUeXBlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IGtleSBpbiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICAgICAgc3luY1BhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHBhaXIudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IHBhaXIuYWx3YXlzU2V0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNQYWlycztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHN5bmNQYWlycykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzaGFwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zaGFwZSgpO1xuICAgIH1cbiAgICBzdHJpY3QobWVzc2FnZSkge1xuICAgICAgICBlcnJvclV0aWwuZXJyVG9PYmo7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICAgICAgLi4uKG1lc3NhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcDogKGlzc3VlLCBjdHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRFcnJvciA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuX2RlZikuZXJyb3JNYXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBpc3N1ZSwgY3R4KS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdHguZGVmYXVsdEVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwidW5yZWNvZ25pemVkX2tleXNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAoX2QgPSBlcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkubWVzc2FnZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RyaXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXNzdGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwicGFzc3Rocm91Z2hcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID1cbiAgICAvLyAgIDxEZWYgZXh0ZW5kcyBab2RPYmplY3REZWY+KGRlZjogRGVmKSA9PlxuICAgIC8vICAgPEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlPihcbiAgICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAvLyAgICk6IFpvZE9iamVjdDxcbiAgICAvLyAgICAgZXh0ZW5kU2hhcGU8UmV0dXJuVHlwZTxEZWZbXCJzaGFwZVwiXT4sIEF1Z21lbnRhdGlvbj4sXG4gICAgLy8gICAgIERlZltcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgICBEZWZbXCJjYXRjaGFsbFwiXVxuICAgIC8vICAgPiA9PiB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgICAuLi5kZWYsXG4gICAgLy8gICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSxcbiAgICAvLyAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAvLyAgICAgICB9KSxcbiAgICAvLyAgICAgfSkgYXMgYW55O1xuICAgIC8vICAgfTtcbiAgICBleHRlbmQoYXVnbWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJpb3IgdG8gem9kQDEuMC4xMiB0aGVyZSB3YXMgYSBidWcgaW4gdGhlXG4gICAgICogaW5mZXJyZWQgdHlwZSBvZiBtZXJnZWQgb2JqZWN0cy4gUGxlYXNlXG4gICAgICogdXBncmFkZSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBpc3N1ZXMuXG4gICAgICovXG4gICAgbWVyZ2UobWVyZ2luZykge1xuICAgICAgICBjb25zdCBtZXJnZWQgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgICAgICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4ubWVyZ2luZy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gICAgLy8gbWVyZ2U8XG4gICAgLy8gICBJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdCxcbiAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIEluY29taW5nW1wic2hhcGVcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIE91dHB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAvLyAgICAgICA/IE91dHB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9LFxuICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAvLyAgICAgICA/IElucHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH1cbiAgICAvLyA+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0LFxuICAgIC8vICAgTmV3SW5wdXRcbiAgICAvLyA+IHtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBzZXRLZXkoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVnbWVudCh7IFtrZXldOiBzY2hlbWEgfSk7XG4gICAgfVxuICAgIC8vIG1lcmdlPEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0PihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogLy9ab2RPYmplY3Q8VCAmIEluY29taW5nW1wiX3NoYXBlXCJdLCBVbmtub3duS2V5cywgQ2F0Y2hhbGw+ID0gKG1lcmdpbmcpID0+IHtcbiAgICAvLyBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdXG4gICAgLy8gPiB7XG4gICAgLy8gICAvLyBjb25zdCBtZXJnZWRTaGFwZSA9IG9iamVjdFV0aWwubWVyZ2VTaGFwZXMoXG4gICAgLy8gICAvLyAgIHRoaXMuX2RlZi5zaGFwZSgpLFxuICAgIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKVxuICAgIC8vICAgLy8gKTtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBjYXRjaGFsbChpbmRleCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaWNrKG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKG1hc2spLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1hc2tba2V5XSAmJiB0aGlzLnNoYXBlW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb21pdChtYXNrKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGVlcFBhcnRpYWwoKSB7XG4gICAgICAgIHJldHVybiBkZWVwUGFydGlhbGlmeSh0aGlzKTtcbiAgICB9XG4gICAgcGFydGlhbChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYS5vcHRpb25hbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWlyZWQobWFzaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIGxldCBuZXdGaWVsZCA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdGaWVsZCBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0ZpZWxkID0gbmV3RmllbGQuX2RlZi5pbm5lclR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBuZXdGaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGtleW9mKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlWm9kRW51bSh1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpO1xuICAgIH1cbn1cblpvZE9iamVjdC5jcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LnN0cmljdENyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LmxhenljcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2RlZi5vcHRpb25zO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVSZXN1bHRzKHJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIHJldHVybiBmaXJzdCBpc3N1ZS1mcmVlIHZhbGlkYXRpb24gaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpc3N1ZXMgZnJvbSBkaXJ0eSBvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5yZXN1bHQuY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4gaW52YWxpZFxuICAgICAgICAgICAgY29uc3QgdW5pb25FcnJvcnMgPSByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiBuZXcgWm9kRXJyb3IocmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKSk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbixcbiAgICAgICAgICAgICAgICB1bmlvbkVycm9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChvcHRpb25zLm1hcChhc3luYyAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBhd2FpdCBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBjdHg6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSkudGhlbihoYW5kbGVSZXN1bHRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkaXJ0eSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiICYmICFkaXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHsgcmVzdWx0LCBjdHg6IGNoaWxkQ3R4IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZEN0eC5jb21tb24uaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXMucHVzaChjaGlsZEN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGlydHkpIHtcbiAgICAgICAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLmRpcnR5LmN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlydHkucmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdW5pb25FcnJvcnMgPSBpc3N1ZXMubWFwKChpc3N1ZXMpID0+IG5ldyBab2RFcnJvcihpc3N1ZXMpKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICAgICAgICAgIHVuaW9uRXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zO1xuICAgIH1cbn1cblpvZFVuaW9uLmNyZWF0ZSA9ICh0eXBlcywgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmlvbih7XG4gICAgICAgIG9wdGlvbnM6IHR5cGVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuaW9uLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmNvbnN0IGdldERpc2NyaW1pbmF0b3IgPSAodHlwZSkgPT4ge1xuICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTGF6eSkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNjaGVtYSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFZmZlY3RzKSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuaW5uZXJUeXBlKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTGl0ZXJhbCkge1xuICAgICAgICByZXR1cm4gW3R5cGUudmFsdWVdO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRW51bSkge1xuICAgICAgICByZXR1cm4gdHlwZS5vcHRpb25zO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTmF0aXZlRW51bSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYmFuL2JhblxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModHlwZS5lbnVtKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZERlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5fZGVmLmlubmVyVHlwZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RVbmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTnVsbCkge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcbmNsYXNzIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yID0gdGhpcy5kaXNjcmltaW5hdG9yO1xuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBjdHguZGF0YVtkaXNjcmltaW5hdG9yXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zTWFwLmdldChkaXNjcmltaW5hdG9yVmFsdWUpO1xuICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5mcm9tKHRoaXMub3B0aW9uc01hcC5rZXlzKCkpLFxuICAgICAgICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRpc2NyaW1pbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAgICogaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgZWFjaCBvYmplY3QgaW4gdGhlIHVuaW9uLlxuICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICAgIC8vIEdldCBhbGwgdGhlIHZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWVzXG4gICAgICAgIGNvbnN0IG9wdGlvbnNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWVzID0gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNoYXBlW2Rpc2NyaW1pbmF0b3JdKTtcbiAgICAgICAgICAgIGlmICghZGlzY3JpbWluYXRvclZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQSBkaXNjcmltaW5hdG9yIHZhbHVlIGZvciBrZXkgXFxgJHtkaXNjcmltaW5hdG9yfVxcYCBjb3VsZCBub3QgYmUgZXh0cmFjdGVkIGZyb20gYWxsIHNjaGVtYSBvcHRpb25zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRpc2NyaW1pbmF0b3JWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc01hcC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzY3JpbWluYXRvciBwcm9wZXJ0eSAke1N0cmluZyhkaXNjcmltaW5hdG9yKX0gaGFzIGR1cGxpY2F0ZSB2YWx1ZSAke1N0cmluZyh2YWx1ZSl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAuc2V0KHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc01hcCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VWYWx1ZXMoYSwgYikge1xuICAgIGNvbnN0IGFUeXBlID0gZ2V0UGFyc2VkVHlwZShhKTtcbiAgICBjb25zdCBiVHlwZSA9IGdldFBhcnNlZFR5cGUoYik7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IGEgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICBjb25zdCBiS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhiKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IHV0aWxcbiAgICAgICAgICAgIC5vYmplY3RLZXlzKGEpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEsIC4uLmIgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld09iaiB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChzaGFyZWRWYWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3QXJyYXkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUuZGF0ZSAmJlxuICAgICAgICBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmXG4gICAgICAgICthID09PSArYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgfVxufVxuY2xhc3MgWm9kSW50ZXJzZWN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZVBhcnNlZCA9IChwYXJzZWRMZWZ0LCBwYXJzZWRSaWdodCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQWJvcnRlZChwYXJzZWRMZWZ0KSB8fCBpc0Fib3J0ZWQocGFyc2VkUmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVZhbHVlcyhwYXJzZWRMZWZ0LnZhbHVlLCBwYXJzZWRSaWdodC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIW1lcmdlZC52YWxpZCkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEaXJ0eShwYXJzZWRMZWZ0KSB8fCBpc0RpcnR5KHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBtZXJnZWQuZGF0YSB9O1xuICAgICAgICB9O1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pLnRoZW4oKFtsZWZ0LCByaWdodF0pID0+IGhhbmRsZVBhcnNlZChsZWZ0LCByaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBhcnNlZCh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pLCB0aGlzLl9kZWYucmlnaHQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5ab2RJbnRlcnNlY3Rpb24uY3JlYXRlID0gKGxlZnQsIHJpZ2h0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEludGVyc2VjdGlvbih7XG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RJbnRlcnNlY3Rpb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RUdXBsZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN0ID0gdGhpcy5fZGVmLnJlc3Q7XG4gICAgICAgIGlmICghcmVzdCAmJiBjdHguZGF0YS5sZW5ndGggPiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICBtYXhpbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi5jdHguZGF0YV1cbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGl0ZW1JbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5fZGVmLml0ZW1zW2l0ZW1JbmRleF0gfHwgdGhpcy5fZGVmLnJlc3Q7XG4gICAgICAgICAgICBpZiAoIXNjaGVtYSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaXRlbUluZGV4KSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiAhIXgpOyAvLyBmaWx0ZXIgbnVsbHNcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChpdGVtcykudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgaXRlbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pdGVtcztcbiAgICB9XG4gICAgcmVzdChyZXN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgcmVzdCxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuWm9kVHVwbGUuY3JlYXRlID0gKHNjaGVtYXMsIHBhcmFtcykgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWFzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgIGl0ZW1zOiBzY2hlbWFzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFR1cGxlLFxuICAgICAgICByZXN0OiBudWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kUmVjb3JkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWlycyA9IFtdO1xuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN0eC5kYXRhKSB7XG4gICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBrZXksIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgY3R4LmRhdGFba2V5XSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdEFzeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoZmlyc3QsIHNlY29uZCwgdGhpcmQpIHtcbiAgICAgICAgaWYgKHNlY29uZCBpbnN0YW5jZW9mIFpvZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgICAgICBrZXlUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IHNlY29uZCxcbiAgICAgICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXJkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgIGtleVR5cGU6IFpvZFN0cmluZy5jcmVhdGUoKSxcbiAgICAgICAgICAgIHZhbHVlVHlwZTogZmlyc3QsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMoc2Vjb25kKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY2xhc3MgWm9kTWFwIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm1hcCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5tYXAsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gWy4uLmN0eC5kYXRhLmVudHJpZXMoKV0ubWFwKChba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIFtpbmRleCwgXCJrZXlcIl0pKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBbaW5kZXgsIFwidmFsdWVcIl0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZE1hcC5jcmVhdGUgPSAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RTZXQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnNldCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zZXQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIGlmIChkZWYubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPCBkZWYubWluU2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluU2l6ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5TaXplLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5tYXhTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA+IGRlZi5tYXhTaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4U2l6ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhTaXplLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZnVuY3Rpb24gZmluYWxpemVTZXQoZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICBwYXJzZWRTZXQuYWRkKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBwYXJzZWRTZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IFsuLi5jdHguZGF0YS52YWx1ZXMoKV0ubWFwKChpdGVtLCBpKSA9PiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpKTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChlbGVtZW50cykudGhlbigoZWxlbWVudHMpID0+IGZpbmFsaXplU2V0KGVsZW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmluYWxpemVTZXQoZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1pbihtaW5TaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1pblNpemU6IHsgdmFsdWU6IG1pblNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heFNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWF4U2l6ZTogeyB2YWx1ZTogbWF4U2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaXplKHNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKHNpemUsIG1lc3NhZ2UpLm1heChzaXplLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgbWVzc2FnZSk7XG4gICAgfVxufVxuWm9kU2V0LmNyZWF0ZSA9ICh2YWx1ZVR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICBtaW5TaXplOiBudWxsLFxuICAgICAgICBtYXhTaXplOiBudWxsLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFNldCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEZ1bmN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSB0aGlzLmltcGxlbWVudDtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlQXJnc0lzc3VlKGFyZ3MsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBhcmdzLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW1xuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1hcCgpLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcCxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VSZXR1cm5zSXNzdWUocmV0dXJucywgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSXNzdWUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHJldHVybnMsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWFwKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZUVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAgfTtcbiAgICAgICAgY29uc3QgZm4gPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5yZXR1cm5zIGluc3RhbmNlb2YgWm9kUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoW10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBhd2FpdCBtZS5fZGVmLmFyZ3NcbiAgICAgICAgICAgICAgICAgICAgLnBhcnNlQXN5bmMoYXJncywgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZUFyZ3NJc3N1ZShhcmdzLCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBhd2FpdCBtZS5fZGVmLnJldHVybnMuX2RlZi50eXBlXG4gICAgICAgICAgICAgICAgICAgIC5wYXJzZUFzeW5jKHJlc3VsdCwgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdvdWxkIGxvdmUgYSB3YXkgdG8gYXZvaWQgZGlzYWJsaW5nIHRoaXMgcnVsZSwgYnV0IHdlIG5lZWRcbiAgICAgICAgICAgIC8vIGFuIGFsaWFzICh1c2luZyBhbiBhcnJvdyBmdW5jdGlvbiB3YXMgd2hhdCBjYXVzZWQgMjY1MSkuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBPSyhmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBtZS5fZGVmLmFyZ3Muc2FmZVBhcnNlKGFyZ3MsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBcmdzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yKFttYWtlQXJnc0lzc3VlKGFyZ3MsIHBhcnNlZEFyZ3MuZXJyb3IpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmV0dXJucyA9IG1lLl9kZWYucmV0dXJucy5zYWZlUGFyc2UocmVzdWx0LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkUmV0dXJucy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBab2RFcnJvcihbbWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIHBhcnNlZFJldHVybnMuZXJyb3IpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zLmRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhbWV0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmFyZ3M7XG4gICAgfVxuICAgIHJldHVyblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYucmV0dXJucztcbiAgICB9XG4gICAgYXJncyguLi5pdGVtcykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGFyZ3M6IFpvZFR1cGxlLmNyZWF0ZShpdGVtcykucmVzdChab2RVbmtub3duLmNyZWF0ZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybnMocmV0dXJuVHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVyblR5cGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0cmljdEltcGxlbWVudChmdW5jKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZ1bmMgPSB0aGlzLnBhcnNlKGZ1bmMpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVkRnVuYztcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhcmdzLCByZXR1cm5zLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICBhcmdzOiAoYXJnc1xuICAgICAgICAgICAgICAgID8gYXJnc1xuICAgICAgICAgICAgICAgIDogWm9kVHVwbGUuY3JlYXRlKFtdKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpKSxcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVybnMgfHwgWm9kVW5rbm93bi5jcmVhdGUoKSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIFpvZExhenkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQgc2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGxhenlTY2hlbWEgPSB0aGlzLl9kZWYuZ2V0dGVyKCk7XG4gICAgICAgIHJldHVybiBsYXp5U2NoZW1hLl9wYXJzZSh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgfVxufVxuWm9kTGF6eS5jcmVhdGUgPSAoZ2V0dGVyLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExhenkoe1xuICAgICAgICBnZXR0ZXI6IGdldHRlcixcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMYXp5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTGl0ZXJhbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQuZGF0YSAhPT0gdGhpcy5fZGVmLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdGhpcy5fZGVmLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlO1xuICAgIH1cbn1cblpvZExpdGVyYWwuY3JlYXRlID0gKHZhbHVlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGl0ZXJhbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVpvZEVudW0odmFsdWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRW51bSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufVxuY2xhc3MgWm9kRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLnZhbHVlcy5pbmRleE9mKGlucHV0LmRhdGEpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogZXhwZWN0ZWRWYWx1ZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzO1xuICAgIH1cbiAgICBnZXQgZW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBnZXQgRW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGV4dHJhY3QodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh2YWx1ZXMpO1xuICAgIH1cbiAgICBleGNsdWRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gWm9kRW51bS5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcigob3B0KSA9PiAhdmFsdWVzLmluY2x1ZGVzKG9wdCkpKTtcbiAgICB9XG59XG5ab2RFbnVtLmNyZWF0ZSA9IGNyZWF0ZVpvZEVudW07XG5jbGFzcyBab2ROYXRpdmVFbnVtIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVudW1WYWx1ZXMgPSB1dGlsLmdldFZhbGlkRW51bVZhbHVlcyh0aGlzLl9kZWYudmFsdWVzKTtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3RyaW5nICYmXG4gICAgICAgICAgICBjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbC5qb2luVmFsdWVzKGV4cGVjdGVkVmFsdWVzKSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdGl2ZUVudW1WYWx1ZXMuaW5kZXhPZihpbnB1dC5kYXRhKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgZW51bSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxufVxuWm9kTmF0aXZlRW51bS5jcmVhdGUgPSAodmFsdWVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE5hdGl2ZUVudW0oe1xuICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYXRpdmVFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kUHJvbWlzZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5wcm9taXNlICYmXG4gICAgICAgICAgICBjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5wcm9taXNlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzaWZpZWQgPSBjdHgucGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5wcm9taXNlXG4gICAgICAgICAgICA/IGN0eC5kYXRhXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShjdHguZGF0YSk7XG4gICAgICAgIHJldHVybiBPSyhwcm9taXNpZmllZC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhkYXRhLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXA6IGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5ab2RQcm9taXNlLmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUHJvbWlzZSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RQcm9taXNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRWZmZWN0cyBleHRlbmRzIFpvZFR5cGUge1xuICAgIGlubmVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWE7XG4gICAgfVxuICAgIHNvdXJjZVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzXG4gICAgICAgICAgICA/IHRoaXMuX2RlZi5zY2hlbWEuc291cmNlVHlwZSgpXG4gICAgICAgICAgICA6IHRoaXMuX2RlZi5zY2hlbWE7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBlZmZlY3QgPSB0aGlzLl9kZWYuZWZmZWN0IHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGNoZWNrQ3R4ID0ge1xuICAgICAgICAgICAgYWRkSXNzdWU6IChhcmcpID0+IHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIGFyZyk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5mYXRhbCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhdGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjaGVja0N0eC5hZGRJc3N1ZSA9IGNoZWNrQ3R4LmFkZElzc3VlLmJpbmQoY2hlY2tDdHgpO1xuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwicHJlcHJvY2Vzc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBlZmZlY3QudHJhbnNmb3JtKGN0eC5kYXRhLCBjaGVja0N0eCk7XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImRpcnR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2Nlc3NlZCkudGhlbigocHJvY2Vzc2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJyZWZpbmVtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZWZpbmVtZW50ID0gKGFjY1xuICAgICAgICAgICAgLy8gZWZmZWN0OiBSZWZpbmVtZW50RWZmZWN0PGFueT5cbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC5yZWZpbmVtZW50KGFjYywgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgICAgZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgIC5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGlubmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwidHJhbnNmb3JtXCIpIHtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZChiYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoYmFzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KSkudGhlbigocmVzdWx0KSA9PiAoeyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXRpbC5hc3NlcnROZXZlcihlZmZlY3QpO1xuICAgIH1cbn1cblpvZEVmZmVjdHMuY3JlYXRlID0gKHNjaGVtYSwgZWZmZWN0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kRWZmZWN0cy5jcmVhdGVXaXRoUHJlcHJvY2VzcyA9IChwcmVwcm9jZXNzLCBzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicHJlcHJvY2Vzc1wiLCB0cmFuc2Zvcm06IHByZXByb2Nlc3MgfSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kT3B0aW9uYWwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kT3B0aW9uYWwuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROdWxsYWJsZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyhudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZE51bGxhYmxlLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGxhYmxlKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGxhYmxlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRGVmYXVsdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgbGV0IGRhdGEgPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2REZWZhdWx0LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgcGFyYW1zLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBwYXJhbXMuZGVmYXVsdFxuICAgICAgICAgICAgOiAoKSA9PiBwYXJhbXMuZGVmYXVsdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZENhdGNoIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICAvLyBuZXdDdHggaXMgdXNlZCB0byBub3QgY29sbGVjdCBpc3N1ZXMgZnJvbSBpbm5lciB0eXBlcyBpbiBjdHhcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0ge1xuICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YTogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICBwYXRoOiBuZXdDdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDoge1xuICAgICAgICAgICAgICAgIC4uLm5ld0N0eCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvZEVycm9yKG5ld0N0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcInZhbGlkXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvZEVycm9yKG5ld0N0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVDYXRjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kQ2F0Y2guY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBwYXJhbXMuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IHBhcmFtcy5jYXRjaCA6ICgpID0+IHBhcmFtcy5jYXRjaCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE5hTiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm5hbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5uYW4sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG59XG5ab2ROYU4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmFOKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYU4sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jb25zdCBCUkFORCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmNsYXNzIFpvZEJyYW5kZWQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHguZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbn1cbmNsYXNzIFpvZFBpcGVsaW5lIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVBc3luYyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5pbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKGluUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVBc3luYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5SZXN1bHQgPSB0aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImRpcnR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhLCBiKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kUGlwZWxpbmUoe1xuICAgICAgICAgICAgaW46IGEsXG4gICAgICAgICAgICBvdXQ6IGIsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFBpcGVsaW5lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5jbGFzcyBab2RSZWFkb25seSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGlmIChpc1ZhbGlkKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IE9iamVjdC5mcmVlemUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblpvZFJlYWRvbmx5LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFJlYWRvbmx5KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlYWRvbmx5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY29uc3QgY3VzdG9tID0gKGNoZWNrLCBwYXJhbXMgPSB7fSwgXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKlxuICogUGFzcyBgZmF0YWxgIGludG8gdGhlIHBhcmFtcyBvYmplY3QgaW5zdGVhZDpcbiAqXG4gKiBgYGB0c1xuICogei5zdHJpbmcoKS5jdXN0b20oKHZhbCkgPT4gdmFsLmxlbmd0aCA+IDUsIHsgZmF0YWw6IGZhbHNlIH0pXG4gKiBgYGBcbiAqXG4gKi9cbmZhdGFsKSA9PiB7XG4gICAgaWYgKGNoZWNrKVxuICAgICAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBpZiAoIWNoZWNrKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IHBhcmFtcyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICA6IHR5cGVvZiBwYXJhbXMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8geyBtZXNzYWdlOiBwYXJhbXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJhbXM7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZhdGFsID0gKF9iID0gKF9hID0gcC5mYXRhbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmF0YWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcDIgPSB0eXBlb2YgcCA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZTogcCB9IDogcDtcbiAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiBcImN1c3RvbVwiLCAuLi5wMiwgZmF0YWw6IF9mYXRhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIFpvZEFueS5jcmVhdGUoKTtcbn07XG5jb25zdCBsYXRlID0ge1xuICAgIG9iamVjdDogWm9kT2JqZWN0LmxhenljcmVhdGUsXG59O1xudmFyIFpvZEZpcnN0UGFydHlUeXBlS2luZDtcbihmdW5jdGlvbiAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKSB7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3RyaW5nXCJdID0gXCJab2RTdHJpbmdcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdW1iZXJcIl0gPSBcIlpvZE51bWJlclwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hTlwiXSA9IFwiWm9kTmFOXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQmlnSW50XCJdID0gXCJab2RCaWdJbnRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCb29sZWFuXCJdID0gXCJab2RCb29sZWFuXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGF0ZVwiXSA9IFwiWm9kRGF0ZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFN5bWJvbFwiXSA9IFwiWm9kU3ltYm9sXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5kZWZpbmVkXCJdID0gXCJab2RVbmRlZmluZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsXCJdID0gXCJab2ROdWxsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQW55XCJdID0gXCJab2RBbnlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmtub3duXCJdID0gXCJab2RVbmtub3duXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmV2ZXJcIl0gPSBcIlpvZE5ldmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVm9pZFwiXSA9IFwiWm9kVm9pZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEFycmF5XCJdID0gXCJab2RBcnJheVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE9iamVjdFwiXSA9IFwiWm9kT2JqZWN0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5pb25cIl0gPSBcIlpvZFVuaW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCJdID0gXCJab2REaXNjcmltaW5hdGVkVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RJbnRlcnNlY3Rpb25cIl0gPSBcIlpvZEludGVyc2VjdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFR1cGxlXCJdID0gXCJab2RUdXBsZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFJlY29yZFwiXSA9IFwiWm9kUmVjb3JkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTWFwXCJdID0gXCJab2RNYXBcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTZXRcIl0gPSBcIlpvZFNldFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEZ1bmN0aW9uXCJdID0gXCJab2RGdW5jdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExhenlcIl0gPSBcIlpvZExhenlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RMaXRlcmFsXCJdID0gXCJab2RMaXRlcmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRW51bVwiXSA9IFwiWm9kRW51bVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEVmZmVjdHNcIl0gPSBcIlpvZEVmZmVjdHNcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROYXRpdmVFbnVtXCJdID0gXCJab2ROYXRpdmVFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT3B0aW9uYWxcIl0gPSBcIlpvZE9wdGlvbmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVsbGFibGVcIl0gPSBcIlpvZE51bGxhYmxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGVmYXVsdFwiXSA9IFwiWm9kRGVmYXVsdFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZENhdGNoXCJdID0gXCJab2RDYXRjaFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFByb21pc2VcIl0gPSBcIlpvZFByb21pc2VcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCcmFuZGVkXCJdID0gXCJab2RCcmFuZGVkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUGlwZWxpbmVcIl0gPSBcIlpvZFBpcGVsaW5lXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVhZG9ubHlcIl0gPSBcIlpvZFJlYWRvbmx5XCI7XG59KShab2RGaXJzdFBhcnR5VHlwZUtpbmQgfHwgKFpvZEZpcnN0UGFydHlUeXBlS2luZCA9IHt9KSk7XG5jb25zdCBpbnN0YW5jZU9mVHlwZSA9IChcbi8vIGNvbnN0IGluc3RhbmNlT2ZUeXBlID0gPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuY2xzLCBwYXJhbXMgPSB7XG4gICAgbWVzc2FnZTogYElucHV0IG5vdCBpbnN0YW5jZSBvZiAke2Nscy5uYW1lfWAsXG59KSA9PiBjdXN0b20oKGRhdGEpID0+IGRhdGEgaW5zdGFuY2VvZiBjbHMsIHBhcmFtcyk7XG5jb25zdCBzdHJpbmdUeXBlID0gWm9kU3RyaW5nLmNyZWF0ZTtcbmNvbnN0IG51bWJlclR5cGUgPSBab2ROdW1iZXIuY3JlYXRlO1xuY29uc3QgbmFuVHlwZSA9IFpvZE5hTi5jcmVhdGU7XG5jb25zdCBiaWdJbnRUeXBlID0gWm9kQmlnSW50LmNyZWF0ZTtcbmNvbnN0IGJvb2xlYW5UeXBlID0gWm9kQm9vbGVhbi5jcmVhdGU7XG5jb25zdCBkYXRlVHlwZSA9IFpvZERhdGUuY3JlYXRlO1xuY29uc3Qgc3ltYm9sVHlwZSA9IFpvZFN5bWJvbC5jcmVhdGU7XG5jb25zdCB1bmRlZmluZWRUeXBlID0gWm9kVW5kZWZpbmVkLmNyZWF0ZTtcbmNvbnN0IG51bGxUeXBlID0gWm9kTnVsbC5jcmVhdGU7XG5jb25zdCBhbnlUeXBlID0gWm9kQW55LmNyZWF0ZTtcbmNvbnN0IHVua25vd25UeXBlID0gWm9kVW5rbm93bi5jcmVhdGU7XG5jb25zdCBuZXZlclR5cGUgPSBab2ROZXZlci5jcmVhdGU7XG5jb25zdCB2b2lkVHlwZSA9IFpvZFZvaWQuY3JlYXRlO1xuY29uc3QgYXJyYXlUeXBlID0gWm9kQXJyYXkuY3JlYXRlO1xuY29uc3Qgb2JqZWN0VHlwZSA9IFpvZE9iamVjdC5jcmVhdGU7XG5jb25zdCBzdHJpY3RPYmplY3RUeXBlID0gWm9kT2JqZWN0LnN0cmljdENyZWF0ZTtcbmNvbnN0IHVuaW9uVHlwZSA9IFpvZFVuaW9uLmNyZWF0ZTtcbmNvbnN0IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgPSBab2REaXNjcmltaW5hdGVkVW5pb24uY3JlYXRlO1xuY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IFpvZEludGVyc2VjdGlvbi5jcmVhdGU7XG5jb25zdCB0dXBsZVR5cGUgPSBab2RUdXBsZS5jcmVhdGU7XG5jb25zdCByZWNvcmRUeXBlID0gWm9kUmVjb3JkLmNyZWF0ZTtcbmNvbnN0IG1hcFR5cGUgPSBab2RNYXAuY3JlYXRlO1xuY29uc3Qgc2V0VHlwZSA9IFpvZFNldC5jcmVhdGU7XG5jb25zdCBmdW5jdGlvblR5cGUgPSBab2RGdW5jdGlvbi5jcmVhdGU7XG5jb25zdCBsYXp5VHlwZSA9IFpvZExhenkuY3JlYXRlO1xuY29uc3QgbGl0ZXJhbFR5cGUgPSBab2RMaXRlcmFsLmNyZWF0ZTtcbmNvbnN0IGVudW1UeXBlID0gWm9kRW51bS5jcmVhdGU7XG5jb25zdCBuYXRpdmVFbnVtVHlwZSA9IFpvZE5hdGl2ZUVudW0uY3JlYXRlO1xuY29uc3QgcHJvbWlzZVR5cGUgPSBab2RQcm9taXNlLmNyZWF0ZTtcbmNvbnN0IGVmZmVjdHNUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGU7XG5jb25zdCBvcHRpb25hbFR5cGUgPSBab2RPcHRpb25hbC5jcmVhdGU7XG5jb25zdCBudWxsYWJsZVR5cGUgPSBab2ROdWxsYWJsZS5jcmVhdGU7XG5jb25zdCBwcmVwcm9jZXNzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3M7XG5jb25zdCBwaXBlbGluZVR5cGUgPSBab2RQaXBlbGluZS5jcmVhdGU7XG5jb25zdCBvc3RyaW5nID0gKCkgPT4gc3RyaW5nVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvbnVtYmVyID0gKCkgPT4gbnVtYmVyVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvYm9vbGVhbiA9ICgpID0+IGJvb2xlYW5UeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IGNvZXJjZSA9IHtcbiAgICBzdHJpbmc6ICgoYXJnKSA9PiBab2RTdHJpbmcuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIG51bWJlcjogKChhcmcpID0+IFpvZE51bWJlci5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgYm9vbGVhbjogKChhcmcpID0+IFpvZEJvb2xlYW4uY3JlYXRlKHtcbiAgICAgICAgLi4uYXJnLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgfSkpLFxuICAgIGJpZ2ludDogKChhcmcpID0+IFpvZEJpZ0ludC5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgZGF0ZTogKChhcmcpID0+IFpvZERhdGUuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxufTtcbmNvbnN0IE5FVkVSID0gSU5WQUxJRDtcblxudmFyIHogPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGRlZmF1bHRFcnJvck1hcDogZXJyb3JNYXAsXG4gICAgc2V0RXJyb3JNYXA6IHNldEVycm9yTWFwLFxuICAgIGdldEVycm9yTWFwOiBnZXRFcnJvck1hcCxcbiAgICBtYWtlSXNzdWU6IG1ha2VJc3N1ZSxcbiAgICBFTVBUWV9QQVRIOiBFTVBUWV9QQVRILFxuICAgIGFkZElzc3VlVG9Db250ZXh0OiBhZGRJc3N1ZVRvQ29udGV4dCxcbiAgICBQYXJzZVN0YXR1czogUGFyc2VTdGF0dXMsXG4gICAgSU5WQUxJRDogSU5WQUxJRCxcbiAgICBESVJUWTogRElSVFksXG4gICAgT0s6IE9LLFxuICAgIGlzQWJvcnRlZDogaXNBYm9ydGVkLFxuICAgIGlzRGlydHk6IGlzRGlydHksXG4gICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICBpc0FzeW5jOiBpc0FzeW5jLFxuICAgIGdldCB1dGlsICgpIHsgcmV0dXJuIHV0aWw7IH0sXG4gICAgZ2V0IG9iamVjdFV0aWwgKCkgeyByZXR1cm4gb2JqZWN0VXRpbDsgfSxcbiAgICBab2RQYXJzZWRUeXBlOiBab2RQYXJzZWRUeXBlLFxuICAgIGdldFBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUsXG4gICAgWm9kVHlwZTogWm9kVHlwZSxcbiAgICBab2RTdHJpbmc6IFpvZFN0cmluZyxcbiAgICBab2ROdW1iZXI6IFpvZE51bWJlcixcbiAgICBab2RCaWdJbnQ6IFpvZEJpZ0ludCxcbiAgICBab2RCb29sZWFuOiBab2RCb29sZWFuLFxuICAgIFpvZERhdGU6IFpvZERhdGUsXG4gICAgWm9kU3ltYm9sOiBab2RTeW1ib2wsXG4gICAgWm9kVW5kZWZpbmVkOiBab2RVbmRlZmluZWQsXG4gICAgWm9kTnVsbDogWm9kTnVsbCxcbiAgICBab2RBbnk6IFpvZEFueSxcbiAgICBab2RVbmtub3duOiBab2RVbmtub3duLFxuICAgIFpvZE5ldmVyOiBab2ROZXZlcixcbiAgICBab2RWb2lkOiBab2RWb2lkLFxuICAgIFpvZEFycmF5OiBab2RBcnJheSxcbiAgICBab2RPYmplY3Q6IFpvZE9iamVjdCxcbiAgICBab2RVbmlvbjogWm9kVW5pb24sXG4gICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBab2REaXNjcmltaW5hdGVkVW5pb24sXG4gICAgWm9kSW50ZXJzZWN0aW9uOiBab2RJbnRlcnNlY3Rpb24sXG4gICAgWm9kVHVwbGU6IFpvZFR1cGxlLFxuICAgIFpvZFJlY29yZDogWm9kUmVjb3JkLFxuICAgIFpvZE1hcDogWm9kTWFwLFxuICAgIFpvZFNldDogWm9kU2V0LFxuICAgIFpvZEZ1bmN0aW9uOiBab2RGdW5jdGlvbixcbiAgICBab2RMYXp5OiBab2RMYXp5LFxuICAgIFpvZExpdGVyYWw6IFpvZExpdGVyYWwsXG4gICAgWm9kRW51bTogWm9kRW51bSxcbiAgICBab2ROYXRpdmVFbnVtOiBab2ROYXRpdmVFbnVtLFxuICAgIFpvZFByb21pc2U6IFpvZFByb21pc2UsXG4gICAgWm9kRWZmZWN0czogWm9kRWZmZWN0cyxcbiAgICBab2RUcmFuc2Zvcm1lcjogWm9kRWZmZWN0cyxcbiAgICBab2RPcHRpb25hbDogWm9kT3B0aW9uYWwsXG4gICAgWm9kTnVsbGFibGU6IFpvZE51bGxhYmxlLFxuICAgIFpvZERlZmF1bHQ6IFpvZERlZmF1bHQsXG4gICAgWm9kQ2F0Y2g6IFpvZENhdGNoLFxuICAgIFpvZE5hTjogWm9kTmFOLFxuICAgIEJSQU5EOiBCUkFORCxcbiAgICBab2RCcmFuZGVkOiBab2RCcmFuZGVkLFxuICAgIFpvZFBpcGVsaW5lOiBab2RQaXBlbGluZSxcbiAgICBab2RSZWFkb25seTogWm9kUmVhZG9ubHksXG4gICAgY3VzdG9tOiBjdXN0b20sXG4gICAgU2NoZW1hOiBab2RUeXBlLFxuICAgIFpvZFNjaGVtYTogWm9kVHlwZSxcbiAgICBsYXRlOiBsYXRlLFxuICAgIGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQgKCkgeyByZXR1cm4gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kOyB9LFxuICAgIGNvZXJjZTogY29lcmNlLFxuICAgIGFueTogYW55VHlwZSxcbiAgICBhcnJheTogYXJyYXlUeXBlLFxuICAgIGJpZ2ludDogYmlnSW50VHlwZSxcbiAgICBib29sZWFuOiBib29sZWFuVHlwZSxcbiAgICBkYXRlOiBkYXRlVHlwZSxcbiAgICBkaXNjcmltaW5hdGVkVW5pb246IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUsXG4gICAgZWZmZWN0OiBlZmZlY3RzVHlwZSxcbiAgICAnZW51bSc6IGVudW1UeXBlLFxuICAgICdmdW5jdGlvbic6IGZ1bmN0aW9uVHlwZSxcbiAgICAnaW5zdGFuY2VvZic6IGluc3RhbmNlT2ZUeXBlLFxuICAgIGludGVyc2VjdGlvbjogaW50ZXJzZWN0aW9uVHlwZSxcbiAgICBsYXp5OiBsYXp5VHlwZSxcbiAgICBsaXRlcmFsOiBsaXRlcmFsVHlwZSxcbiAgICBtYXA6IG1hcFR5cGUsXG4gICAgbmFuOiBuYW5UeXBlLFxuICAgIG5hdGl2ZUVudW06IG5hdGl2ZUVudW1UeXBlLFxuICAgIG5ldmVyOiBuZXZlclR5cGUsXG4gICAgJ251bGwnOiBudWxsVHlwZSxcbiAgICBudWxsYWJsZTogbnVsbGFibGVUeXBlLFxuICAgIG51bWJlcjogbnVtYmVyVHlwZSxcbiAgICBvYmplY3Q6IG9iamVjdFR5cGUsXG4gICAgb2Jvb2xlYW46IG9ib29sZWFuLFxuICAgIG9udW1iZXI6IG9udW1iZXIsXG4gICAgb3B0aW9uYWw6IG9wdGlvbmFsVHlwZSxcbiAgICBvc3RyaW5nOiBvc3RyaW5nLFxuICAgIHBpcGVsaW5lOiBwaXBlbGluZVR5cGUsXG4gICAgcHJlcHJvY2VzczogcHJlcHJvY2Vzc1R5cGUsXG4gICAgcHJvbWlzZTogcHJvbWlzZVR5cGUsXG4gICAgcmVjb3JkOiByZWNvcmRUeXBlLFxuICAgIHNldDogc2V0VHlwZSxcbiAgICBzdHJpY3RPYmplY3Q6IHN0cmljdE9iamVjdFR5cGUsXG4gICAgc3RyaW5nOiBzdHJpbmdUeXBlLFxuICAgIHN5bWJvbDogc3ltYm9sVHlwZSxcbiAgICB0cmFuc2Zvcm1lcjogZWZmZWN0c1R5cGUsXG4gICAgdHVwbGU6IHR1cGxlVHlwZSxcbiAgICAndW5kZWZpbmVkJzogdW5kZWZpbmVkVHlwZSxcbiAgICB1bmlvbjogdW5pb25UeXBlLFxuICAgIHVua25vd246IHVua25vd25UeXBlLFxuICAgICd2b2lkJzogdm9pZFR5cGUsXG4gICAgTkVWRVI6IE5FVkVSLFxuICAgIFpvZElzc3VlQ29kZTogWm9kSXNzdWVDb2RlLFxuICAgIHF1b3RlbGVzc0pzb246IHF1b3RlbGVzc0pzb24sXG4gICAgWm9kRXJyb3I6IFpvZEVycm9yXG59KTtcblxuZXhwb3J0IHsgQlJBTkQsIERJUlRZLCBFTVBUWV9QQVRILCBJTlZBTElELCBORVZFUiwgT0ssIFBhcnNlU3RhdHVzLCBab2RUeXBlIGFzIFNjaGVtYSwgWm9kQW55LCBab2RBcnJheSwgWm9kQmlnSW50LCBab2RCb29sZWFuLCBab2RCcmFuZGVkLCBab2RDYXRjaCwgWm9kRGF0ZSwgWm9kRGVmYXVsdCwgWm9kRGlzY3JpbWluYXRlZFVuaW9uLCBab2RFZmZlY3RzLCBab2RFbnVtLCBab2RFcnJvciwgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLCBab2RGdW5jdGlvbiwgWm9kSW50ZXJzZWN0aW9uLCBab2RJc3N1ZUNvZGUsIFpvZExhenksIFpvZExpdGVyYWwsIFpvZE1hcCwgWm9kTmFOLCBab2ROYXRpdmVFbnVtLCBab2ROZXZlciwgWm9kTnVsbCwgWm9kTnVsbGFibGUsIFpvZE51bWJlciwgWm9kT2JqZWN0LCBab2RPcHRpb25hbCwgWm9kUGFyc2VkVHlwZSwgWm9kUGlwZWxpbmUsIFpvZFByb21pc2UsIFpvZFJlYWRvbmx5LCBab2RSZWNvcmQsIFpvZFR5cGUgYXMgWm9kU2NoZW1hLCBab2RTZXQsIFpvZFN0cmluZywgWm9kU3ltYm9sLCBab2RFZmZlY3RzIGFzIFpvZFRyYW5zZm9ybWVyLCBab2RUdXBsZSwgWm9kVHlwZSwgWm9kVW5kZWZpbmVkLCBab2RVbmlvbiwgWm9kVW5rbm93biwgWm9kVm9pZCwgYWRkSXNzdWVUb0NvbnRleHQsIGFueVR5cGUgYXMgYW55LCBhcnJheVR5cGUgYXMgYXJyYXksIGJpZ0ludFR5cGUgYXMgYmlnaW50LCBib29sZWFuVHlwZSBhcyBib29sZWFuLCBjb2VyY2UsIGN1c3RvbSwgZGF0ZVR5cGUgYXMgZGF0ZSwgeiBhcyBkZWZhdWx0LCBlcnJvck1hcCBhcyBkZWZhdWx0RXJyb3JNYXAsIGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgYXMgZGlzY3JpbWluYXRlZFVuaW9uLCBlZmZlY3RzVHlwZSBhcyBlZmZlY3QsIGVudW1UeXBlIGFzIGVudW0sIGZ1bmN0aW9uVHlwZSBhcyBmdW5jdGlvbiwgZ2V0RXJyb3JNYXAsIGdldFBhcnNlZFR5cGUsIGluc3RhbmNlT2ZUeXBlIGFzIGluc3RhbmNlb2YsIGludGVyc2VjdGlvblR5cGUgYXMgaW50ZXJzZWN0aW9uLCBpc0Fib3J0ZWQsIGlzQXN5bmMsIGlzRGlydHksIGlzVmFsaWQsIGxhdGUsIGxhenlUeXBlIGFzIGxhenksIGxpdGVyYWxUeXBlIGFzIGxpdGVyYWwsIG1ha2VJc3N1ZSwgbWFwVHlwZSBhcyBtYXAsIG5hblR5cGUgYXMgbmFuLCBuYXRpdmVFbnVtVHlwZSBhcyBuYXRpdmVFbnVtLCBuZXZlclR5cGUgYXMgbmV2ZXIsIG51bGxUeXBlIGFzIG51bGwsIG51bGxhYmxlVHlwZSBhcyBudWxsYWJsZSwgbnVtYmVyVHlwZSBhcyBudW1iZXIsIG9iamVjdFR5cGUgYXMgb2JqZWN0LCBvYmplY3RVdGlsLCBvYm9vbGVhbiwgb251bWJlciwgb3B0aW9uYWxUeXBlIGFzIG9wdGlvbmFsLCBvc3RyaW5nLCBwaXBlbGluZVR5cGUgYXMgcGlwZWxpbmUsIHByZXByb2Nlc3NUeXBlIGFzIHByZXByb2Nlc3MsIHByb21pc2VUeXBlIGFzIHByb21pc2UsIHF1b3RlbGVzc0pzb24sIHJlY29yZFR5cGUgYXMgcmVjb3JkLCBzZXRUeXBlIGFzIHNldCwgc2V0RXJyb3JNYXAsIHN0cmljdE9iamVjdFR5cGUgYXMgc3RyaWN0T2JqZWN0LCBzdHJpbmdUeXBlIGFzIHN0cmluZywgc3ltYm9sVHlwZSBhcyBzeW1ib2wsIGVmZmVjdHNUeXBlIGFzIHRyYW5zZm9ybWVyLCB0dXBsZVR5cGUgYXMgdHVwbGUsIHVuZGVmaW5lZFR5cGUgYXMgdW5kZWZpbmVkLCB1bmlvblR5cGUgYXMgdW5pb24sIHVua25vd25UeXBlIGFzIHVua25vd24sIHV0aWwsIHZvaWRUeXBlIGFzIHZvaWQsIHogfTtcbiJdLCJuYW1lcyI6WyJ1dGlsIiwiYXNzZXJ0RXF1YWwiLCJ2YWwiLCJhc3NlcnRJcyIsIl9hcmciLCJhc3NlcnROZXZlciIsIl94IiwiRXJyb3IiLCJhcnJheVRvRW51bSIsIml0ZW1zIiwib2JqIiwiaXRlbSIsImdldFZhbGlkRW51bVZhbHVlcyIsInZhbGlkS2V5cyIsIm9iamVjdEtleXMiLCJmaWx0ZXIiLCJrIiwiZmlsdGVyZWQiLCJvYmplY3RWYWx1ZXMiLCJtYXAiLCJlIiwiT2JqZWN0Iiwia2V5cyIsIm9iamVjdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInB1c2giLCJmaW5kIiwiYXJyIiwiY2hlY2tlciIsInVuZGVmaW5lZCIsImlzSW50ZWdlciIsIk51bWJlciIsImlzRmluaXRlIiwiTWF0aCIsImZsb29yIiwiam9pblZhbHVlcyIsImFycmF5Iiwic2VwYXJhdG9yIiwiam9pbiIsImpzb25TdHJpbmdpZnlSZXBsYWNlciIsIl8iLCJ2YWx1ZSIsInRvU3RyaW5nIiwib2JqZWN0VXRpbCIsIm1lcmdlU2hhcGVzIiwiZmlyc3QiLCJzZWNvbmQiLCJab2RQYXJzZWRUeXBlIiwiZ2V0UGFyc2VkVHlwZSIsImRhdGEiLCJ0Iiwic3RyaW5nIiwiaXNOYU4iLCJuYW4iLCJudW1iZXIiLCJib29sZWFuIiwiZnVuY3Rpb24iLCJiaWdpbnQiLCJzeW1ib2wiLCJBcnJheSIsImlzQXJyYXkiLCJudWxsIiwidGhlbiIsImNhdGNoIiwicHJvbWlzZSIsIk1hcCIsIlNldCIsInNldCIsIkRhdGUiLCJkYXRlIiwidW5rbm93biIsIlpvZElzc3VlQ29kZSIsInF1b3RlbGVzc0pzb24iLCJqc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcGxhY2UiLCJab2RFcnJvciIsImNvbnN0cnVjdG9yIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJzdWIiLCJhZGRJc3N1ZXMiLCJzdWJzIiwiYWN0dWFsUHJvdG8iLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIm5hbWUiLCJlcnJvcnMiLCJmb3JtYXQiLCJfbWFwcGVyIiwibWFwcGVyIiwiaXNzdWUiLCJtZXNzYWdlIiwiZmllbGRFcnJvcnMiLCJfZXJyb3JzIiwicHJvY2Vzc0Vycm9yIiwiZXJyb3IiLCJjb2RlIiwidW5pb25FcnJvcnMiLCJyZXR1cm5UeXBlRXJyb3IiLCJhcmd1bWVudHNFcnJvciIsInBhdGgiLCJsZW5ndGgiLCJjdXJyIiwiaSIsImVsIiwidGVybWluYWwiLCJpc0VtcHR5IiwiZmxhdHRlbiIsImZvcm1FcnJvcnMiLCJjcmVhdGUiLCJlcnJvck1hcCIsIl9jdHgiLCJpbnZhbGlkX3R5cGUiLCJyZWNlaXZlZCIsImV4cGVjdGVkIiwiaW52YWxpZF9saXRlcmFsIiwidW5yZWNvZ25pemVkX2tleXMiLCJpbnZhbGlkX3VuaW9uIiwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yIiwib3B0aW9ucyIsImludmFsaWRfZW51bV92YWx1ZSIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidmFsaWRhdGlvbiIsImluY2x1ZGVzIiwicG9zaXRpb24iLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJ0b29fc21hbGwiLCJ0eXBlIiwiZXhhY3QiLCJpbmNsdXNpdmUiLCJtaW5pbXVtIiwidG9vX2JpZyIsIm1heGltdW0iLCJjdXN0b20iLCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyIsIm5vdF9tdWx0aXBsZV9vZiIsIm11bHRpcGxlT2YiLCJub3RfZmluaXRlIiwiZGVmYXVsdEVycm9yIiwib3ZlcnJpZGVFcnJvck1hcCIsInNldEVycm9yTWFwIiwiZ2V0RXJyb3JNYXAiLCJtYWtlSXNzdWUiLCJwYXJhbXMiLCJlcnJvck1hcHMiLCJpc3N1ZURhdGEiLCJmdWxsUGF0aCIsImZ1bGxJc3N1ZSIsImVycm9yTWVzc2FnZSIsIm1hcHMiLCJtIiwic2xpY2UiLCJyZXZlcnNlIiwiRU1QVFlfUEFUSCIsImFkZElzc3VlVG9Db250ZXh0IiwiY3R4IiwiY29tbW9uIiwiY29udGV4dHVhbEVycm9yTWFwIiwic2NoZW1hRXJyb3JNYXAiLCJ4IiwiUGFyc2VTdGF0dXMiLCJkaXJ0eSIsImFib3J0IiwibWVyZ2VBcnJheSIsInN0YXR1cyIsInJlc3VsdHMiLCJhcnJheVZhbHVlIiwicyIsIklOVkFMSUQiLCJtZXJnZU9iamVjdEFzeW5jIiwicGFpcnMiLCJzeW5jUGFpcnMiLCJwYWlyIiwibWVyZ2VPYmplY3RTeW5jIiwiZmluYWxPYmplY3QiLCJhbHdheXNTZXQiLCJmcmVlemUiLCJESVJUWSIsIk9LIiwiaXNBYm9ydGVkIiwiaXNEaXJ0eSIsImlzVmFsaWQiLCJpc0FzeW5jIiwiUHJvbWlzZSIsImVycm9yVXRpbCIsImVyclRvT2JqIiwiUGFyc2VJbnB1dExhenlQYXRoIiwicGFyZW50IiwiX2NhY2hlZFBhdGgiLCJfcGF0aCIsIl9rZXkiLCJoYW5kbGVSZXN1bHQiLCJyZXN1bHQiLCJzdWNjZXNzIiwiX2Vycm9yIiwicHJvY2Vzc0NyZWF0ZVBhcmFtcyIsImludmFsaWRfdHlwZV9lcnJvciIsInJlcXVpcmVkX2Vycm9yIiwiZGVzY3JpcHRpb24iLCJjdXN0b21NYXAiLCJpc3MiLCJab2RUeXBlIiwiZGVmIiwic3BhIiwic2FmZVBhcnNlQXN5bmMiLCJfZGVmIiwicGFyc2UiLCJiaW5kIiwic2FmZVBhcnNlIiwicGFyc2VBc3luYyIsInJlZmluZSIsInJlZmluZW1lbnQiLCJzdXBlclJlZmluZSIsIm9wdGlvbmFsIiwibnVsbGFibGUiLCJudWxsaXNoIiwib3IiLCJhbmQiLCJ0cmFuc2Zvcm0iLCJicmFuZCIsImRlZmF1bHQiLCJkZXNjcmliZSIsInBpcGUiLCJyZWFkb25seSIsImlzTnVsbGFibGUiLCJpc09wdGlvbmFsIiwiX2dldFR5cGUiLCJpbnB1dCIsIl9nZXRPclJldHVybkN0eCIsInBhcnNlZFR5cGUiLCJfcHJvY2Vzc0lucHV0UGFyYW1zIiwiX3BhcnNlU3luYyIsIl9wYXJzZSIsIl9wYXJzZUFzeW5jIiwicmVzb2x2ZSIsIl9hIiwiYXN5bmMiLCJtYXliZUFzeW5jUmVzdWx0IiwiY2hlY2siLCJnZXRJc3N1ZVByb3BlcnRpZXMiLCJfcmVmaW5lbWVudCIsInNldEVycm9yIiwicmVmaW5lbWVudERhdGEiLCJab2RFZmZlY3RzIiwic2NoZW1hIiwidHlwZU5hbWUiLCJab2RGaXJzdFBhcnR5VHlwZUtpbmQiLCJlZmZlY3QiLCJab2RPcHRpb25hbCIsIlpvZE51bGxhYmxlIiwiWm9kQXJyYXkiLCJab2RQcm9taXNlIiwib3B0aW9uIiwiWm9kVW5pb24iLCJpbmNvbWluZyIsIlpvZEludGVyc2VjdGlvbiIsImRlZmF1bHRWYWx1ZUZ1bmMiLCJab2REZWZhdWx0IiwiaW5uZXJUeXBlIiwiZGVmYXVsdFZhbHVlIiwiWm9kQnJhbmRlZCIsImNhdGNoVmFsdWVGdW5jIiwiWm9kQ2F0Y2giLCJjYXRjaFZhbHVlIiwiVGhpcyIsInRhcmdldCIsIlpvZFBpcGVsaW5lIiwiWm9kUmVhZG9ubHkiLCJjdWlkUmVnZXgiLCJjdWlkMlJlZ2V4IiwidWxpZFJlZ2V4IiwidXVpZFJlZ2V4IiwiZW1haWxSZWdleCIsIl9lbW9qaVJlZ2V4IiwiZW1vamlSZWdleCIsImlwdjRSZWdleCIsImlwdjZSZWdleCIsImRhdGV0aW1lUmVnZXgiLCJhcmdzIiwicHJlY2lzaW9uIiwib2Zmc2V0IiwiUmVnRXhwIiwiaXNWYWxpZElQIiwiaXAiLCJ2ZXJzaW9uIiwidGVzdCIsIlpvZFN0cmluZyIsImNvZXJjZSIsIlN0cmluZyIsImNoZWNrcyIsImtpbmQiLCJ0b29CaWciLCJ0b29TbWFsbCIsIlVSTCIsInJlZ2V4IiwibGFzdEluZGV4IiwidGVzdFJlc3VsdCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiX3JlZ2V4IiwiX2FkZENoZWNrIiwiZW1haWwiLCJ1cmwiLCJlbW9qaSIsInV1aWQiLCJjdWlkIiwiY3VpZDIiLCJ1bGlkIiwiZGF0ZXRpbWUiLCJtaW4iLCJtaW5MZW5ndGgiLCJtYXgiLCJtYXhMZW5ndGgiLCJsZW4iLCJub25lbXB0eSIsImlzRGF0ZXRpbWUiLCJjaCIsImlzRW1haWwiLCJpc1VSTCIsImlzRW1vamkiLCJpc1VVSUQiLCJpc0NVSUQiLCJpc0NVSUQyIiwiaXNVTElEIiwiaXNJUCIsImZsb2F0U2FmZVJlbWFpbmRlciIsInN0ZXAiLCJ2YWxEZWNDb3VudCIsInNwbGl0Iiwic3RlcERlY0NvdW50IiwiZGVjQ291bnQiLCJ2YWxJbnQiLCJwYXJzZUludCIsInRvRml4ZWQiLCJzdGVwSW50IiwicG93IiwiWm9kTnVtYmVyIiwiYXJndW1lbnRzIiwiZ3RlIiwibHRlIiwic2V0TGltaXQiLCJndCIsImx0IiwiaW50IiwicG9zaXRpdmUiLCJuZWdhdGl2ZSIsIm5vbnBvc2l0aXZlIiwibm9ubmVnYXRpdmUiLCJmaW5pdGUiLCJzYWZlIiwiTUlOX1NBRkVfSU5URUdFUiIsIk1BWF9TQUZFX0lOVEVHRVIiLCJtaW5WYWx1ZSIsIm1heFZhbHVlIiwiaXNJbnQiLCJab2RCaWdJbnQiLCJCaWdJbnQiLCJab2RCb29sZWFuIiwiQm9vbGVhbiIsIlpvZERhdGUiLCJnZXRUaW1lIiwibWluRGF0ZSIsIm1heERhdGUiLCJab2RTeW1ib2wiLCJab2RVbmRlZmluZWQiLCJab2ROdWxsIiwiWm9kQW55IiwiX2FueSIsIlpvZFVua25vd24iLCJfdW5rbm93biIsIlpvZE5ldmVyIiwibmV2ZXIiLCJab2RWb2lkIiwidm9pZCIsImV4YWN0TGVuZ3RoIiwiYWxsIiwiZWxlbWVudCIsImRlZXBQYXJ0aWFsaWZ5IiwiWm9kT2JqZWN0IiwibmV3U2hhcGUiLCJzaGFwZSIsImZpZWxkU2NoZW1hIiwidW53cmFwIiwiWm9kVHVwbGUiLCJfY2FjaGVkIiwibm9uc3RyaWN0IiwicGFzc3Rocm91Z2giLCJhdWdtZW50IiwiZXh0ZW5kIiwiX2dldENhY2hlZCIsInNoYXBlS2V5cyIsImV4dHJhS2V5cyIsImNhdGNoYWxsIiwidW5rbm93bktleXMiLCJrZXlWYWxpZGF0b3IiLCJzdHJpY3QiLCJfYiIsIl9jIiwiX2QiLCJzdHJpcCIsImF1Z21lbnRhdGlvbiIsIm1lcmdlIiwibWVyZ2luZyIsIm1lcmdlZCIsInNldEtleSIsImluZGV4IiwicGljayIsIm1hc2siLCJmb3JFYWNoIiwib21pdCIsImRlZXBQYXJ0aWFsIiwicGFydGlhbCIsInJlcXVpcmVkIiwibmV3RmllbGQiLCJrZXlvZiIsImNyZWF0ZVpvZEVudW0iLCJzdHJpY3RDcmVhdGUiLCJsYXp5Y3JlYXRlIiwiaGFuZGxlUmVzdWx0cyIsImNoaWxkQ3R4IiwidHlwZXMiLCJnZXREaXNjcmltaW5hdG9yIiwiWm9kTGF6eSIsIlpvZExpdGVyYWwiLCJab2RFbnVtIiwiWm9kTmF0aXZlRW51bSIsImVudW0iLCJab2REaXNjcmltaW5hdGVkVW5pb24iLCJkaXNjcmltaW5hdG9yIiwiZGlzY3JpbWluYXRvclZhbHVlIiwib3B0aW9uc01hcCIsImdldCIsImZyb20iLCJkaXNjcmltaW5hdG9yVmFsdWVzIiwiaGFzIiwibWVyZ2VWYWx1ZXMiLCJhIiwiYiIsImFUeXBlIiwiYlR5cGUiLCJ2YWxpZCIsImJLZXlzIiwic2hhcmVkS2V5cyIsImluZGV4T2YiLCJuZXdPYmoiLCJzaGFyZWRWYWx1ZSIsIm5ld0FycmF5IiwiaXRlbUEiLCJpdGVtQiIsImhhbmRsZVBhcnNlZCIsInBhcnNlZExlZnQiLCJwYXJzZWRSaWdodCIsImxlZnQiLCJyaWdodCIsInJlc3QiLCJpdGVtSW5kZXgiLCJzY2hlbWFzIiwiWm9kUmVjb3JkIiwia2V5U2NoZW1hIiwia2V5VHlwZSIsInZhbHVlU2NoZW1hIiwidmFsdWVUeXBlIiwidGhpcmQiLCJab2RNYXAiLCJlbnRyaWVzIiwiZmluYWxNYXAiLCJab2RTZXQiLCJtaW5TaXplIiwic2l6ZSIsIm1heFNpemUiLCJmaW5hbGl6ZVNldCIsImVsZW1lbnRzIiwicGFyc2VkU2V0IiwiYWRkIiwidmFsdWVzIiwiWm9kRnVuY3Rpb24iLCJ2YWxpZGF0ZSIsImltcGxlbWVudCIsIm1ha2VBcmdzSXNzdWUiLCJtYWtlUmV0dXJuc0lzc3VlIiwicmV0dXJucyIsImZuIiwibWUiLCJwYXJzZWRBcmdzIiwiUmVmbGVjdCIsImFwcGx5IiwicGFyc2VkUmV0dXJucyIsInBhcmFtZXRlcnMiLCJyZXR1cm5UeXBlIiwiZnVuYyIsInZhbGlkYXRlZEZ1bmMiLCJzdHJpY3RJbXBsZW1lbnQiLCJnZXR0ZXIiLCJsYXp5U2NoZW1hIiwiZXhwZWN0ZWRWYWx1ZXMiLCJlbnVtVmFsdWVzIiwiVmFsdWVzIiwiRW51bSIsImV4dHJhY3QiLCJleGNsdWRlIiwib3B0IiwibmF0aXZlRW51bVZhbHVlcyIsInByb21pc2lmaWVkIiwic291cmNlVHlwZSIsImNoZWNrQ3R4IiwiYXJnIiwiZmF0YWwiLCJwcm9jZXNzZWQiLCJleGVjdXRlUmVmaW5lbWVudCIsImFjYyIsImlubmVyIiwiYmFzZSIsImNyZWF0ZVdpdGhQcmVwcm9jZXNzIiwicHJlcHJvY2VzcyIsInJlbW92ZURlZmF1bHQiLCJuZXdDdHgiLCJyZW1vdmVDYXRjaCIsIlpvZE5hTiIsIkJSQU5EIiwiU3ltYm9sIiwiaGFuZGxlQXN5bmMiLCJpblJlc3VsdCIsImluIiwib3V0IiwicCIsIl9mYXRhbCIsInAyIiwibGF0ZSIsImluc3RhbmNlT2ZUeXBlIiwiY2xzIiwic3RyaW5nVHlwZSIsIm51bWJlclR5cGUiLCJuYW5UeXBlIiwiYmlnSW50VHlwZSIsImJvb2xlYW5UeXBlIiwiZGF0ZVR5cGUiLCJzeW1ib2xUeXBlIiwidW5kZWZpbmVkVHlwZSIsIm51bGxUeXBlIiwiYW55VHlwZSIsInVua25vd25UeXBlIiwibmV2ZXJUeXBlIiwidm9pZFR5cGUiLCJhcnJheVR5cGUiLCJvYmplY3RUeXBlIiwic3RyaWN0T2JqZWN0VHlwZSIsInVuaW9uVHlwZSIsImRpc2NyaW1pbmF0ZWRVbmlvblR5cGUiLCJpbnRlcnNlY3Rpb25UeXBlIiwidHVwbGVUeXBlIiwicmVjb3JkVHlwZSIsIm1hcFR5cGUiLCJzZXRUeXBlIiwiZnVuY3Rpb25UeXBlIiwibGF6eVR5cGUiLCJsaXRlcmFsVHlwZSIsImVudW1UeXBlIiwibmF0aXZlRW51bVR5cGUiLCJwcm9taXNlVHlwZSIsImVmZmVjdHNUeXBlIiwib3B0aW9uYWxUeXBlIiwibnVsbGFibGVUeXBlIiwicHJlcHJvY2Vzc1R5cGUiLCJwaXBlbGluZVR5cGUiLCJvc3RyaW5nIiwib251bWJlciIsIm9ib29sZWFuIiwiTkVWRVIiLCJ6IiwiZGVmYXVsdEVycm9yTWFwIiwiWm9kVHJhbnNmb3JtZXIiLCJTY2hlbWEiLCJab2RTY2hlbWEiLCJhbnkiLCJkaXNjcmltaW5hdGVkVW5pb24iLCJpbnRlcnNlY3Rpb24iLCJsYXp5IiwibGl0ZXJhbCIsIm5hdGl2ZUVudW0iLCJwaXBlbGluZSIsInJlY29yZCIsInN0cmljdE9iamVjdCIsInRyYW5zZm9ybWVyIiwidHVwbGUiLCJ1bmlvbiIsImluc3RhbmNlb2YiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/zod/lib/index.mjs\n"); /***/ }) }; ;