UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

328 lines (327 loc) • 39.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "ListDrawerContent", { enumerable: true, get: function() { return ListDrawerContent; } }); const _modal = require("@faceless-ui/modal"); const _react = /*#__PURE__*/ _interop_require_wildcard(require("react")); const _reacti18next = require("react-i18next"); const _ = require("."); const _getTranslation = require("../../../../utilities/getTranslation"); const _usePayloadAPI = /*#__PURE__*/ _interop_require_default(require("../../../hooks/usePayloadAPI")); const _useUseAsTitle = require("../../../hooks/useUseAsTitle"); const _Label = /*#__PURE__*/ _interop_require_default(require("../../forms/Label")); const _X = /*#__PURE__*/ _interop_require_default(require("../../icons/X")); const _Auth = require("../../utilities/Auth"); const _Config = require("../../utilities/Config"); const _DocumentInfo = require("../../utilities/DocumentInfo"); const _Preferences = require("../../utilities/Preferences"); const _RenderCustomComponent = /*#__PURE__*/ _interop_require_default(require("../../utilities/RenderCustomComponent")); const _Default = /*#__PURE__*/ _interop_require_default(require("../../views/collections/List/Default")); const _formatFields = /*#__PURE__*/ _interop_require_default(require("../../views/collections/List/formatFields")); const _DocumentDrawer = require("../DocumentDrawer"); const _Pill = /*#__PURE__*/ _interop_require_default(require("../Pill")); const _ReactSelect = /*#__PURE__*/ _interop_require_default(require("../ReactSelect")); const _TableColumns = require("../TableColumns"); const _ViewDescription = /*#__PURE__*/ _interop_require_default(require("../ViewDescription")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const hoistQueryParamsToAnd = (where, queryParams)=>{ if ('and' in where) { where.and.push(queryParams); } else if ('or' in where) { where = { and: [ where, queryParams ] }; } else { where = { and: [ where, queryParams ] }; } return where; }; const ListDrawerContent = ({ collectionSlugs, customHeader, drawerSlug, filterOptions, onSelect, selectedCollection })=>{ const { i18n, t } = (0, _reacti18next.useTranslation)([ 'upload', 'general' ]); const { permissions } = (0, _Auth.useAuth)(); const { setPreference } = (0, _Preferences.usePreferences)(); const { closeModal, isModalOpen } = (0, _modal.useModal)(); const [limit, setLimit] = (0, _react.useState)(); const [sort, setSort] = (0, _react.useState)(null); const [page, setPage] = (0, _react.useState)(1); const [where, setWhere] = (0, _react.useState)(null); const [search, setSearch] = (0, _react.useState)(''); const { collections, routes: { api }, serverURL } = (0, _Config.useConfig)(); const enabledCollectionConfigs = collections.filter(({ slug })=>{ return collectionSlugs.includes(slug); }); const [selectedCollectionConfig, setSelectedCollectionConfig] = (0, _react.useState)(()=>{ return enabledCollectionConfigs.find(({ slug })=>slug === selectedCollection) || enabledCollectionConfigs?.[0]; }); const [selectedOption, setSelectedOption] = (0, _react.useState)(()=>selectedCollectionConfig ? { label: (0, _getTranslation.getTranslation)(selectedCollectionConfig.labels.singular, i18n), value: selectedCollectionConfig.slug } : undefined); const [fields, setFields] = (0, _react.useState)(()=>(0, _formatFields.default)(selectedCollectionConfig)); const titleField = (0, _useUseAsTitle.useUseTitleField)(selectedCollectionConfig); (0, _react.useEffect)(()=>{ setFields((0, _formatFields.default)(selectedCollectionConfig)); }, [ selectedCollectionConfig ]); // allow external control of selected collection, same as the initial state logic above (0, _react.useEffect)(()=>{ if (selectedCollection) { // if passed a selection, find it and check if it's enabled const selectedConfig = enabledCollectionConfigs.find(({ slug })=>slug === selectedCollection) || enabledCollectionConfigs?.[0]; setSelectedCollectionConfig(selectedConfig); } }, [ selectedCollection, enabledCollectionConfigs, onSelect, t ]); const preferenceKey = `${selectedCollectionConfig.slug}-list`; // this is the 'create new' drawer const [DocumentDrawer, DocumentDrawerToggler, { drawerSlug: documentDrawerSlug }] = (0, _DocumentDrawer.useDocumentDrawer)({ collectionSlug: selectedCollectionConfig.slug }); (0, _react.useEffect)(()=>{ if (selectedOption) { setSelectedCollectionConfig(enabledCollectionConfigs.find(({ slug })=>selectedOption.value === slug)); } }, [ selectedOption, enabledCollectionConfigs ]); const collectionPermissions = permissions?.collections?.[selectedCollectionConfig?.slug]; const hasCreatePermission = collectionPermissions?.create?.permission; // If modal is open, get active page of upload gallery const isOpen = isModalOpen(drawerSlug); const apiURL = isOpen ? `${serverURL}${api}/${selectedCollectionConfig.slug}` : null; const [cacheBust, dispatchCacheBust] = (0, _react.useReducer)((state)=>state + 1, 0) // used to force a re-fetch even when apiURL is unchanged ; const [{ data, isError }, { setParams }] = (0, _usePayloadAPI.default)(apiURL, {}); const moreThanOneAvailableCollection = enabledCollectionConfigs.length > 1; (0, _react.useEffect)(()=>{ const { slug, admin: { listSearchableFields } = {}, versions } = selectedCollectionConfig; const params = {}; let copyOfWhere = { ...where || {} }; const filterOption = filterOptions?.[slug]; if (filterOptions && typeof filterOption !== 'boolean') { copyOfWhere = hoistQueryParamsToAnd(copyOfWhere, filterOption); } if (search) { const searchAsConditions = (listSearchableFields || [ titleField?.name ]).map((fieldName)=>{ return { [fieldName]: { like: search } }; }, []); if (searchAsConditions.length > 0) { const searchFilter = { or: [ ...searchAsConditions ] }; copyOfWhere = hoistQueryParamsToAnd(copyOfWhere, searchFilter); } } if (page) params.page = page; if (sort) params.sort = sort; if (cacheBust) params.cacheBust = cacheBust; if (copyOfWhere) params.where = copyOfWhere; if (versions?.drafts) params.draft = 'true'; setParams(params); }, [ page, sort, where, search, cacheBust, filterOptions, selectedCollectionConfig, t, setParams, titleField?.name ]); (0, _react.useEffect)(()=>{ const newPreferences = { limit, sort }; setPreference(preferenceKey, newPreferences, true); }, [ sort, limit, setPreference, preferenceKey ]); const onCreateNew = (0, _react.useCallback)(({ doc })=>{ if (typeof onSelect === 'function') { onSelect({ collectionConfig: selectedCollectionConfig, docID: doc.id }); } dispatchCacheBust(); closeModal(documentDrawerSlug); closeModal(drawerSlug); }, [ closeModal, documentDrawerSlug, drawerSlug, onSelect, selectedCollectionConfig ]); if (!selectedCollectionConfig || isError) { return null; } const listComponent = selectedCollectionConfig?.admin?.components?.views?.List; let ListToRender = null; if (listComponent && typeof listComponent === 'function') { ListToRender = listComponent; } else if (typeof listComponent === 'object' && typeof listComponent.Component === 'function') { ListToRender = listComponent.Component; } return /*#__PURE__*/ _react.default.createElement(_TableColumns.TableColumnsProvider, { cellProps: [ { className: `${_.baseClass}__first-cell`, link: false, onClick: ({ collection: rowColl, rowData })=>{ if (typeof onSelect === 'function') { onSelect({ collectionConfig: rowColl, docID: rowData.id }); } } } ], collection: selectedCollectionConfig }, /*#__PURE__*/ _react.default.createElement(_DocumentInfo.DocumentInfoProvider, { collection: selectedCollectionConfig }, /*#__PURE__*/ _react.default.createElement(_RenderCustomComponent.default, { CustomComponent: ListToRender, DefaultComponent: _Default.default, componentProps: { collection: { ...selectedCollectionConfig, fields }, customHeader: /*#__PURE__*/ _react.default.createElement("header", { className: `${_.baseClass}__header` }, /*#__PURE__*/ _react.default.createElement("div", { className: `${_.baseClass}__header-wrap` }, /*#__PURE__*/ _react.default.createElement("div", { className: `${_.baseClass}__header-content` }, /*#__PURE__*/ _react.default.createElement("h2", { className: `${_.baseClass}__header-text` }, !customHeader ? (0, _getTranslation.getTranslation)(selectedCollectionConfig?.labels?.plural, i18n) : customHeader), hasCreatePermission && /*#__PURE__*/ _react.default.createElement(DocumentDrawerToggler, { className: `${_.baseClass}__create-new-button` }, /*#__PURE__*/ _react.default.createElement(_Pill.default, null, t('general:createNew')))), /*#__PURE__*/ _react.default.createElement("button", { className: `${_.baseClass}__header-close`, onClick: ()=>{ closeModal(drawerSlug); }, type: "button" }, /*#__PURE__*/ _react.default.createElement(_X.default, null))), selectedCollectionConfig?.admin?.description && /*#__PURE__*/ _react.default.createElement("div", { className: `${_.baseClass}__sub-header` }, /*#__PURE__*/ _react.default.createElement(_ViewDescription.default, { description: selectedCollectionConfig.admin.description })), moreThanOneAvailableCollection && /*#__PURE__*/ _react.default.createElement("div", { className: `${_.baseClass}__select-collection-wrap` }, /*#__PURE__*/ _react.default.createElement(_Label.default, { label: t('selectCollectionToBrowse') }), /*#__PURE__*/ _react.default.createElement(_ReactSelect.default, { className: `${_.baseClass}__select-collection`, onChange: setSelectedOption, options: enabledCollectionConfigs.map((coll)=>({ label: (0, _getTranslation.getTranslation)(coll.labels.singular, i18n), value: coll.slug })), value: selectedOption }))), data, handlePageChange: setPage, handlePerPageChange: setLimit, handleSearchChange: setSearch, handleSortChange: setSort, handleWhereChange: setWhere, hasCreatePermission, limit: limit || selectedCollectionConfig?.admin?.pagination?.defaultLimit, modifySearchParams: false, newDocumentURL: null, setLimit, setSort, titleField } })), /*#__PURE__*/ _react.default.createElement(DocumentDrawer, { onSave: onCreateNew })); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL2VsZW1lbnRzL0xpc3REcmF3ZXIvRHJhd2VyQ29udGVudC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlTW9kYWwgfSBmcm9tICdAZmFjZWxlc3MtdWkvbW9kYWwnXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVkdWNlciwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcblxuaW1wb3J0IHR5cGUgeyBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29sbGVjdGlvbnMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBXaGVyZSB9IGZyb20gJy4uLy4uLy4uLy4uL2V4cG9ydHMvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgTGlzdERyYXdlclByb3BzIH0gZnJvbSAnLi90eXBlcydcblxuaW1wb3J0IHsgYmFzZUNsYXNzIH0gZnJvbSAnLidcbmltcG9ydCB7IGdldFRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbGl0aWVzL2dldFRyYW5zbGF0aW9uJ1xuaW1wb3J0IHVzZVBheWxvYWRBUEkgZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUGF5bG9hZEFQSSdcbmltcG9ydCB7IHVzZVVzZVRpdGxlRmllbGQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VVc2VBc1RpdGxlJ1xuaW1wb3J0IExhYmVsIGZyb20gJy4uLy4uL2Zvcm1zL0xhYmVsJ1xuaW1wb3J0IFggZnJvbSAnLi4vLi4vaWNvbnMvWCdcbmltcG9ydCB7IHVzZUF1dGggfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvQXV0aCdcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Db25maWcnXG5pbXBvcnQgeyBEb2N1bWVudEluZm9Qcm92aWRlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Eb2N1bWVudEluZm8nXG5pbXBvcnQgeyB1c2VQcmVmZXJlbmNlcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9QcmVmZXJlbmNlcydcbmltcG9ydCBSZW5kZXJDdXN0b21Db21wb25lbnQgZnJvbSAnLi4vLi4vdXRpbGl0aWVzL1JlbmRlckN1c3RvbUNvbXBvbmVudCdcbmltcG9ydCBEZWZhdWx0TGlzdCBmcm9tICcuLi8uLi92aWV3cy9jb2xsZWN0aW9ucy9MaXN0L0RlZmF1bHQnXG5pbXBvcnQgZm9ybWF0RmllbGRzIGZyb20gJy4uLy4uL3ZpZXdzL2NvbGxlY3Rpb25zL0xpc3QvZm9ybWF0RmllbGRzJ1xuaW1wb3J0IHsgdXNlRG9jdW1lbnREcmF3ZXIgfSBmcm9tICcuLi9Eb2N1bWVudERyYXdlcidcbmltcG9ydCBQaWxsIGZyb20gJy4uL1BpbGwnXG5pbXBvcnQgUmVhY3RTZWxlY3QgZnJvbSAnLi4vUmVhY3RTZWxlY3QnXG5pbXBvcnQgeyBUYWJsZUNvbHVtbnNQcm92aWRlciB9IGZyb20gJy4uL1RhYmxlQ29sdW1ucydcbmltcG9ydCBWaWV3RGVzY3JpcHRpb24gZnJvbSAnLi4vVmlld0Rlc2NyaXB0aW9uJ1xuXG5jb25zdCBob2lzdFF1ZXJ5UGFyYW1zVG9BbmQgPSAod2hlcmU6IFdoZXJlLCBxdWVyeVBhcmFtczogV2hlcmUpID0+IHtcbiAgaWYgKCdhbmQnIGluIHdoZXJlKSB7XG4gICAgd2hlcmUuYW5kLnB1c2gocXVlcnlQYXJhbXMpXG4gIH0gZWxzZSBpZiAoJ29yJyBpbiB3aGVyZSkge1xuICAgIHdoZXJlID0ge1xuICAgICAgYW5kOiBbd2hlcmUsIHF1ZXJ5UGFyYW1zXSxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hlcmUgPSB7XG4gICAgICBhbmQ6IFt3aGVyZSwgcXVlcnlQYXJhbXNdLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3aGVyZVxufVxuXG5leHBvcnQgY29uc3QgTGlzdERyYXdlckNvbnRlbnQ6IFJlYWN0LkZDPExpc3REcmF3ZXJQcm9wcz4gPSAoe1xuICBjb2xsZWN0aW9uU2x1Z3MsXG4gIGN1c3RvbUhlYWRlcixcbiAgZHJhd2VyU2x1ZyxcbiAgZmlsdGVyT3B0aW9ucyxcbiAgb25TZWxlY3QsXG4gIHNlbGVjdGVkQ29sbGVjdGlvbixcbn0pID0+IHtcbiAgY29uc3QgeyBpMThuLCB0IH0gPSB1c2VUcmFuc2xhdGlvbihbJ3VwbG9hZCcsICdnZW5lcmFsJ10pXG4gIGNvbnN0IHsgcGVybWlzc2lvbnMgfSA9IHVzZUF1dGgoKVxuICBjb25zdCB7IHNldFByZWZlcmVuY2UgfSA9IHVzZVByZWZlcmVuY2VzKClcbiAgY29uc3QgeyBjbG9zZU1vZGFsLCBpc01vZGFsT3BlbiB9ID0gdXNlTW9kYWwoKVxuICBjb25zdCBbbGltaXQsIHNldExpbWl0XSA9IHVzZVN0YXRlPG51bWJlcj4oKVxuICBjb25zdCBbc29ydCwgc2V0U29ydF0gPSB1c2VTdGF0ZShudWxsKVxuICBjb25zdCBbcGFnZSwgc2V0UGFnZV0gPSB1c2VTdGF0ZSgxKVxuICBjb25zdCBbd2hlcmUsIHNldFdoZXJlXSA9IHVzZVN0YXRlKG51bGwpXG4gIGNvbnN0IFtzZWFyY2gsIHNldFNlYXJjaF0gPSB1c2VTdGF0ZSgnJylcblxuICBjb25zdCB7XG4gICAgY29sbGVjdGlvbnMsXG4gICAgcm91dGVzOiB7IGFwaSB9LFxuICAgIHNlcnZlclVSTCxcbiAgfSA9IHVzZUNvbmZpZygpXG5cbiAgY29uc3QgZW5hYmxlZENvbGxlY3Rpb25Db25maWdzID0gY29sbGVjdGlvbnMuZmlsdGVyKCh7IHNsdWcgfSkgPT4ge1xuICAgIHJldHVybiBjb2xsZWN0aW9uU2x1Z3MuaW5jbHVkZXMoc2x1ZylcbiAgfSlcblxuICBjb25zdCBbc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnLCBzZXRTZWxlY3RlZENvbGxlY3Rpb25Db25maWddID1cbiAgICB1c2VTdGF0ZTxTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnPigoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBlbmFibGVkQ29sbGVjdGlvbkNvbmZpZ3MuZmluZCgoeyBzbHVnIH0pID0+IHNsdWcgPT09IHNlbGVjdGVkQ29sbGVjdGlvbikgfHxcbiAgICAgICAgZW5hYmxlZENvbGxlY3Rpb25Db25maWdzPy5bMF1cbiAgICAgIClcbiAgICB9KVxuXG4gIGNvbnN0IFtzZWxlY3RlZE9wdGlvbiwgc2V0U2VsZWN0ZWRPcHRpb25dID0gdXNlU3RhdGU8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KCgpID0+XG4gICAgc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnXG4gICAgICA/IHtcbiAgICAgICAgICBsYWJlbDogZ2V0VHJhbnNsYXRpb24oc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnLmxhYmVscy5zaW5ndWxhciwgaTE4biksXG4gICAgICAgICAgdmFsdWU6IHNlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZCxcbiAgKVxuXG4gIGNvbnN0IFtmaWVsZHMsIHNldEZpZWxkc10gPSB1c2VTdGF0ZTxGaWVsZFtdPigoKSA9PiBmb3JtYXRGaWVsZHMoc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnKSlcblxuICBjb25zdCB0aXRsZUZpZWxkID0gdXNlVXNlVGl0bGVGaWVsZChzZWxlY3RlZENvbGxlY3Rpb25Db25maWcpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRGaWVsZHMoZm9ybWF0RmllbGRzKHNlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZykpXG4gIH0sIFtzZWxlY3RlZENvbGxlY3Rpb25Db25maWddKVxuXG4gIC8vIGFsbG93IGV4dGVybmFsIGNvbnRyb2wgb2Ygc2VsZWN0ZWQgY29sbGVjdGlvbiwgc2FtZSBhcyB0aGUgaW5pdGlhbCBzdGF0ZSBsb2dpYyBhYm92ZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzZWxlY3RlZENvbGxlY3Rpb24pIHtcbiAgICAgIC8vIGlmIHBhc3NlZCBhIHNlbGVjdGlvbiwgZmluZCBpdCBhbmQgY2hlY2sgaWYgaXQncyBlbmFibGVkXG4gICAgICBjb25zdCBzZWxlY3RlZENvbmZpZyA9XG4gICAgICAgIGVuYWJsZWRDb2xsZWN0aW9uQ29uZmlncy5maW5kKCh7IHNsdWcgfSkgPT4gc2x1ZyA9PT0gc2VsZWN0ZWRDb2xsZWN0aW9uKSB8fFxuICAgICAgICBlbmFibGVkQ29sbGVjdGlvbkNvbmZpZ3M/LlswXVxuICAgICAgc2V0U2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnKHNlbGVjdGVkQ29uZmlnKVxuICAgIH1cbiAgfSwgW3NlbGVjdGVkQ29sbGVjdGlvbiwgZW5hYmxlZENvbGxlY3Rpb25Db25maWdzLCBvblNlbGVjdCwgdF0pXG5cbiAgY29uc3QgcHJlZmVyZW5jZUtleSA9IGAke3NlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZy5zbHVnfS1saXN0YFxuXG4gIC8vIHRoaXMgaXMgdGhlICdjcmVhdGUgbmV3JyBkcmF3ZXJcbiAgY29uc3QgW0RvY3VtZW50RHJhd2VyLCBEb2N1bWVudERyYXdlclRvZ2dsZXIsIHsgZHJhd2VyU2x1ZzogZG9jdW1lbnREcmF3ZXJTbHVnIH1dID1cbiAgICB1c2VEb2N1bWVudERyYXdlcih7XG4gICAgICBjb2xsZWN0aW9uU2x1Zzogc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnLnNsdWcsXG4gICAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0U2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnKFxuICAgICAgICBlbmFibGVkQ29sbGVjdGlvbkNvbmZpZ3MuZmluZCgoeyBzbHVnIH0pID0+IHNlbGVjdGVkT3B0aW9uLnZhbHVlID09PSBzbHVnKSxcbiAgICAgIClcbiAgICB9XG4gIH0sIFtzZWxlY3RlZE9wdGlvbiwgZW5hYmxlZENvbGxlY3Rpb25Db25maWdzXSlcblxuICBjb25zdCBjb2xsZWN0aW9uUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucz8uY29sbGVjdGlvbnM/LltzZWxlY3RlZENvbGxlY3Rpb25Db25maWc/LnNsdWddXG4gIGNvbnN0IGhhc0NyZWF0ZVBlcm1pc3Npb24gPSBjb2xsZWN0aW9uUGVybWlzc2lvbnM/LmNyZWF0ZT8ucGVybWlzc2lvblxuXG4gIC8vIElmIG1vZGFsIGlzIG9wZW4sIGdldCBhY3RpdmUgcGFnZSBvZiB1cGxvYWQgZ2FsbGVyeVxuICBjb25zdCBpc09wZW4gPSBpc01vZGFsT3BlbihkcmF3ZXJTbHVnKVxuICBjb25zdCBhcGlVUkwgPSBpc09wZW4gPyBgJHtzZXJ2ZXJVUkx9JHthcGl9LyR7c2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnLnNsdWd9YCA6IG51bGxcbiAgY29uc3QgW2NhY2hlQnVzdCwgZGlzcGF0Y2hDYWNoZUJ1c3RdID0gdXNlUmVkdWNlcigoc3RhdGUpID0+IHN0YXRlICsgMSwgMCkgLy8gdXNlZCB0byBmb3JjZSBhIHJlLWZldGNoIGV2ZW4gd2hlbiBhcGlVUkwgaXMgdW5jaGFuZ2VkXG4gIGNvbnN0IFt7IGRhdGEsIGlzRXJyb3IgfSwgeyBzZXRQYXJhbXMgfV0gPSB1c2VQYXlsb2FkQVBJKGFwaVVSTCwge30pXG4gIGNvbnN0IG1vcmVUaGFuT25lQXZhaWxhYmxlQ29sbGVjdGlvbiA9IGVuYWJsZWRDb2xsZWN0aW9uQ29uZmlncy5sZW5ndGggPiAxXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IHNsdWcsIGFkbWluOiB7IGxpc3RTZWFyY2hhYmxlRmllbGRzIH0gPSB7fSwgdmVyc2lvbnMgfSA9IHNlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZ1xuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgY2FjaGVCdXN0PzogbnVtYmVyXG4gICAgICBkcmFmdD86IHN0cmluZ1xuICAgICAgbGltaXQ/OiBudW1iZXJcbiAgICAgIHBhZ2U/OiBudW1iZXJcbiAgICAgIHNlYXJjaD86IHN0cmluZ1xuICAgICAgc29ydD86IHN0cmluZ1xuICAgICAgd2hlcmU/OiB1bmtub3duXG4gICAgfSA9IHt9XG5cbiAgICBsZXQgY29weU9mV2hlcmUgPSB7IC4uLih3aGVyZSB8fCB7fSkgfVxuICAgIGNvbnN0IGZpbHRlck9wdGlvbiA9IGZpbHRlck9wdGlvbnM/LltzbHVnXVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMgJiYgdHlwZW9mIGZpbHRlck9wdGlvbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBjb3B5T2ZXaGVyZSA9IGhvaXN0UXVlcnlQYXJhbXNUb0FuZChjb3B5T2ZXaGVyZSwgZmlsdGVyT3B0aW9uKVxuICAgIH1cblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIGNvbnN0IHNlYXJjaEFzQ29uZGl0aW9ucyA9IChsaXN0U2VhcmNoYWJsZUZpZWxkcyB8fCBbdGl0bGVGaWVsZD8ubmFtZV0pLm1hcCgoZmllbGROYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW2ZpZWxkTmFtZV06IHtcbiAgICAgICAgICAgIGxpa2U6IHNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9LCBbXSlcblxuICAgICAgaWYgKHNlYXJjaEFzQ29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaEZpbHRlcjogV2hlcmUgPSB7XG4gICAgICAgICAgb3I6IFsuLi5zZWFyY2hBc0NvbmRpdGlvbnNdLFxuICAgICAgICB9XG5cbiAgICAgICAgY29weU9mV2hlcmUgPSBob2lzdFF1ZXJ5UGFyYW1zVG9BbmQoY29weU9mV2hlcmUsIHNlYXJjaEZpbHRlcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFnZSkgcGFyYW1zLnBhZ2UgPSBwYWdlXG4gICAgaWYgKHNvcnQpIHBhcmFtcy5zb3J0ID0gc29ydFxuICAgIGlmIChjYWNoZUJ1c3QpIHBhcmFtcy5jYWNoZUJ1c3QgPSBjYWNoZUJ1c3RcbiAgICBpZiAoY29weU9mV2hlcmUpIHBhcmFtcy53aGVyZSA9IGNvcHlPZldoZXJlXG4gICAgaWYgKHZlcnNpb25zPy5kcmFmdHMpIHBhcmFtcy5kcmFmdCA9ICd0cnVlJ1xuXG4gICAgc2V0UGFyYW1zKHBhcmFtcylcbiAgfSwgW1xuICAgIHBhZ2UsXG4gICAgc29ydCxcbiAgICB3aGVyZSxcbiAgICBzZWFyY2gsXG4gICAgY2FjaGVCdXN0LFxuICAgIGZpbHRlck9wdGlvbnMsXG4gICAgc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnLFxuICAgIHQsXG4gICAgc2V0UGFyYW1zLFxuICAgIHRpdGxlRmllbGQ/Lm5hbWUsXG4gIF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBuZXdQcmVmZXJlbmNlcyA9IHtcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICB9XG5cbiAgICBzZXRQcmVmZXJlbmNlKHByZWZlcmVuY2VLZXksIG5ld1ByZWZlcmVuY2VzLCB0cnVlKVxuICB9LCBbc29ydCwgbGltaXQsIHNldFByZWZlcmVuY2UsIHByZWZlcmVuY2VLZXldKVxuXG4gIGNvbnN0IG9uQ3JlYXRlTmV3ID0gdXNlQ2FsbGJhY2soXG4gICAgKHsgZG9jIH0pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb25TZWxlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25TZWxlY3Qoe1xuICAgICAgICAgIGNvbGxlY3Rpb25Db25maWc6IHNlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBkb2NJRDogZG9jLmlkLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZGlzcGF0Y2hDYWNoZUJ1c3QoKVxuICAgICAgY2xvc2VNb2RhbChkb2N1bWVudERyYXdlclNsdWcpXG4gICAgICBjbG9zZU1vZGFsKGRyYXdlclNsdWcpXG4gICAgfSxcbiAgICBbY2xvc2VNb2RhbCwgZG9jdW1lbnREcmF3ZXJTbHVnLCBkcmF3ZXJTbHVnLCBvblNlbGVjdCwgc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnXSxcbiAgKVxuXG4gIGlmICghc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnIHx8IGlzRXJyb3IpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgbGlzdENvbXBvbmVudCA9IHNlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZz8uYWRtaW4/LmNvbXBvbmVudHM/LnZpZXdzPy5MaXN0XG4gIGxldCBMaXN0VG9SZW5kZXIgPSBudWxsXG5cbiAgaWYgKGxpc3RDb21wb25lbnQgJiYgdHlwZW9mIGxpc3RDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBMaXN0VG9SZW5kZXIgPSBsaXN0Q29tcG9uZW50XG4gIH0gZWxzZSBpZiAodHlwZW9mIGxpc3RDb21wb25lbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBsaXN0Q29tcG9uZW50LkNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIExpc3RUb1JlbmRlciA9IGxpc3RDb21wb25lbnQuQ29tcG9uZW50XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxUYWJsZUNvbHVtbnNQcm92aWRlclxuICAgICAgY2VsbFByb3BzPXtbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGAke2Jhc2VDbGFzc31fX2ZpcnN0LWNlbGxgLFxuICAgICAgICAgIGxpbms6IGZhbHNlLFxuICAgICAgICAgIG9uQ2xpY2s6ICh7IGNvbGxlY3Rpb246IHJvd0NvbGwsIHJvd0RhdGEgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblNlbGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblNlbGVjdCh7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbkNvbmZpZzogcm93Q29sbCxcbiAgICAgICAgICAgICAgICBkb2NJRDogcm93RGF0YS5pZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXX1cbiAgICAgIGNvbGxlY3Rpb249e3NlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZ31cbiAgICA+XG4gICAgICA8RG9jdW1lbnRJbmZvUHJvdmlkZXIgY29sbGVjdGlvbj17c2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnfT5cbiAgICAgICAgPFJlbmRlckN1c3RvbUNvbXBvbmVudFxuICAgICAgICAgIEN1c3RvbUNvbXBvbmVudD17TGlzdFRvUmVuZGVyfVxuICAgICAgICAgIERlZmF1bHRDb21wb25lbnQ9e0RlZmF1bHRMaXN0fVxuICAgICAgICAgIGNvbXBvbmVudFByb3BzPXt7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnNlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1c3RvbUhlYWRlcjogKFxuICAgICAgICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9faGVhZGVyYH0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2hlYWRlci13cmFwYH0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9faGVhZGVyLWNvbnRlbnRgfT5cbiAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9faGVhZGVyLXRleHRgfT5cbiAgICAgICAgICAgICAgICAgICAgICB7IWN1c3RvbUhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRUcmFuc2xhdGlvbihzZWxlY3RlZENvbGxlY3Rpb25Db25maWc/LmxhYmVscz8ucGx1cmFsLCBpMThuKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXN0b21IZWFkZXJ9XG4gICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgIHtoYXNDcmVhdGVQZXJtaXNzaW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RG9jdW1lbnREcmF3ZXJUb2dnbGVyIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fY3JlYXRlLW5ldy1idXR0b25gfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQaWxsPnt0KCdnZW5lcmFsOmNyZWF0ZU5ldycpfTwvUGlsbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L0RvY3VtZW50RHJhd2VyVG9nZ2xlcj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2hlYWRlci1jbG9zZWB9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbG9zZU1vZGFsKGRyYXdlclNsdWcpXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8WCAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge3NlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZz8uYWRtaW4/LmRlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtiYXNlQ2xhc3N9X19zdWItaGVhZGVyYH0+XG4gICAgICAgICAgICAgICAgICAgIDxWaWV3RGVzY3JpcHRpb24gZGVzY3JpcHRpb249e3NlbGVjdGVkQ29sbGVjdGlvbkNvbmZpZy5hZG1pbi5kZXNjcmlwdGlvbn0gLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge21vcmVUaGFuT25lQXZhaWxhYmxlQ29sbGVjdGlvbiAmJiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fc2VsZWN0LWNvbGxlY3Rpb24td3JhcGB9PlxuICAgICAgICAgICAgICAgICAgICA8TGFiZWwgbGFiZWw9e3QoJ3NlbGVjdENvbGxlY3Rpb25Ub0Jyb3dzZScpfSAvPlxuICAgICAgICAgICAgICAgICAgICA8UmVhY3RTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX3NlbGVjdC1jb2xsZWN0aW9uYH1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17c2V0U2VsZWN0ZWRPcHRpb259IC8vIHRoaXMgaXMgb25seSBjaGFuZ2luZyB0aGUgb3B0aW9ucyB3aGljaCBpcyBub3QgcmVydW5uaW5nIG15IGVmZmVjdFxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e2VuYWJsZWRDb2xsZWN0aW9uQ29uZmlncy5tYXAoKGNvbGwpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZ2V0VHJhbnNsYXRpb24oY29sbC5sYWJlbHMuc2luZ3VsYXIsIGkxOG4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNvbGwuc2x1ZyxcbiAgICAgICAgICAgICAgICAgICAgICB9KSl9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkT3B0aW9ufVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGhhbmRsZVBhZ2VDaGFuZ2U6IHNldFBhZ2UsXG4gICAgICAgICAgICBoYW5kbGVQZXJQYWdlQ2hhbmdlOiBzZXRMaW1pdCxcbiAgICAgICAgICAgIGhhbmRsZVNlYXJjaENoYW5nZTogc2V0U2VhcmNoLFxuICAgICAgICAgICAgaGFuZGxlU29ydENoYW5nZTogc2V0U29ydCxcbiAgICAgICAgICAgIGhhbmRsZVdoZXJlQ2hhbmdlOiBzZXRXaGVyZSxcbiAgICAgICAgICAgIGhhc0NyZWF0ZVBlcm1pc3Npb24sXG4gICAgICAgICAgICBsaW1pdDogbGltaXQgfHwgc2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnPy5hZG1pbj8ucGFnaW5hdGlvbj8uZGVmYXVsdExpbWl0LFxuICAgICAgICAgICAgbW9kaWZ5U2VhcmNoUGFyYW1zOiBmYWxzZSxcbiAgICAgICAgICAgIG5ld0RvY3VtZW50VVJMOiBudWxsLFxuICAgICAgICAgICAgc2V0TGltaXQsXG4gICAgICAgICAgICBzZXRTb3J0LFxuICAgICAgICAgICAgdGl0bGVGaWVsZCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgPC9Eb2N1bWVudEluZm9Qcm92aWRlcj5cbiAgICAgIDxEb2N1bWVudERyYXdlciBvblNhdmU9e29uQ3JlYXRlTmV3fSAvPlxuICAgIDwvVGFibGVDb2x1bW5zUHJvdmlkZXI+XG4gIClcbn1cbiJdLCJuYW1lcyI6WyJMaXN0RHJhd2VyQ29udGVudCIsImhvaXN0UXVlcnlQYXJhbXNUb0FuZCIsIndoZXJlIiwicXVlcnlQYXJhbXMiLCJhbmQiLCJwdXNoIiwiY29sbGVjdGlvblNsdWdzIiwiY3VzdG9tSGVhZGVyIiwiZHJhd2VyU2x1ZyIsImZpbHRlck9wdGlvbnMiLCJvblNlbGVjdCIsInNlbGVjdGVkQ29sbGVjdGlvbiIsImkxOG4iLCJ0IiwidXNlVHJhbnNsYXRpb24iLCJwZXJtaXNzaW9ucyIsInVzZUF1dGgiLCJzZXRQcmVmZXJlbmNlIiwidXNlUHJlZmVyZW5jZXMiLCJjbG9zZU1vZGFsIiwiaXNNb2RhbE9wZW4iLCJ1c2VNb2RhbCIsImxpbWl0Iiwic2V0TGltaXQiLCJ1c2VTdGF0ZSIsInNvcnQiLCJzZXRTb3J0IiwicGFnZSIsInNldFBhZ2UiLCJzZXRXaGVyZSIsInNlYXJjaCIsInNldFNlYXJjaCIsImNvbGxlY3Rpb25zIiwicm91dGVzIiwiYXBpIiwic2VydmVyVVJMIiwidXNlQ29uZmlnIiwiZW5hYmxlZENvbGxlY3Rpb25Db25maWdzIiwiZmlsdGVyIiwic2x1ZyIsImluY2x1ZGVzIiwic2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnIiwic2V0U2VsZWN0ZWRDb2xsZWN0aW9uQ29uZmlnIiwiZmluZCIsInNlbGVjdGVkT3B0aW9uIiwic2V0U2VsZWN0ZWRPcHRpb24iLCJsYWJlbCIsImdldFRyYW5zbGF0aW9uIiwibGFiZWxzIiwic2luZ3VsYXIiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsImZpZWxkcyIsInNldEZpZWxkcyIsImZvcm1hdEZpZWxkcyIsInRpdGxlRmllbGQiLCJ1c2VVc2VUaXRsZUZpZWxkIiwidXNlRWZmZWN0Iiwic2VsZWN0ZWRDb25maWciLCJwcmVmZXJlbmNlS2V5IiwiRG9jdW1lbnREcmF3ZXIiLCJEb2N1bWVudERyYXdlclRvZ2dsZXIiLCJkb2N1bWVudERyYXdlclNsdWciLCJ1c2VEb2N1bWVudERyYXdlciIsImNvbGxlY3Rpb25TbHVnIiwiY29sbGVjdGlvblBlcm1pc3Npb25zIiwiaGFzQ3JlYXRlUGVybWlzc2lvbiIsImNyZWF0ZSIsInBlcm1pc3Npb24iLCJpc09wZW4iLCJhcGlVUkwiLCJjYWNoZUJ1c3QiLCJkaXNwYXRjaENhY2hlQnVzdCIsInVzZVJlZHVjZXIiLCJzdGF0ZSIsImRhdGEiLCJpc0Vycm9yIiwic2V0UGFyYW1zIiwidXNlUGF5bG9hZEFQSSIsIm1vcmVUaGFuT25lQXZhaWxhYmxlQ29sbGVjdGlvbiIsImxlbmd0aCIsImFkbWluIiwibGlzdFNlYXJjaGFibGVGaWVsZHMiLCJ2ZXJzaW9ucyIsInBhcmFtcyIsImNvcHlPZldoZXJlIiwiZmlsdGVyT3B0aW9uIiwic2VhcmNoQXNDb25kaXRpb25zIiwibmFtZSIsIm1hcCIsImZpZWxkTmFtZSIsImxpa2UiLCJzZWFyY2hGaWx0ZXIiLCJvciIsImRyYWZ0cyIsImRyYWZ0IiwibmV3UHJlZmVyZW5jZXMiLCJvbkNyZWF0ZU5ldyIsInVzZUNhbGxiYWNrIiwiZG9jIiwiY29sbGVjdGlvbkNvbmZpZyIsImRvY0lEIiwiaWQiLCJsaXN0Q29tcG9uZW50IiwiY29tcG9uZW50cyIsInZpZXdzIiwiTGlzdCIsIkxpc3RUb1JlbmRlciIsIkNvbXBvbmVudCIsIlRhYmxlQ29sdW1uc1Byb3ZpZGVyIiwiY2VsbFByb3BzIiwiY2xhc3NOYW1lIiwiYmFzZUNsYXNzIiwibGluayIsIm9uQ2xpY2siLCJjb2xsZWN0aW9uIiwicm93Q29sbCIsInJvd0RhdGEiLCJEb2N1bWVudEluZm9Qcm92aWRlciIsIlJlbmRlckN1c3RvbUNvbXBvbmVudCIsIkN1c3RvbUNvbXBvbmVudCIsIkRlZmF1bHRDb21wb25lbnQiLCJEZWZhdWx0TGlzdCIsImNvbXBvbmVudFByb3BzIiwiaGVhZGVyIiwiZGl2IiwiaDIiLCJwbHVyYWwiLCJQaWxsIiwiYnV0dG9uIiwidHlwZSIsIlgiLCJkZXNjcmlwdGlvbiIsIlZpZXdEZXNjcmlwdGlvbiIsIkxhYmVsIiwiUmVhY3RTZWxlY3QiLCJvbkNoYW5nZSIsIm9wdGlvbnMiLCJjb2xsIiwiaGFuZGxlUGFnZUNoYW5nZSIsImhhbmRsZVBlclBhZ2VDaGFuZ2UiLCJoYW5kbGVTZWFyY2hDaGFuZ2UiLCJoYW5kbGVTb3J0Q2hhbmdlIiwiaGFuZGxlV2hlcmVDaGFuZ2UiLCJwYWdpbmF0aW9uIiwiZGVmYXVsdExpbWl0IiwibW9kaWZ5U2VhcmNoUGFyYW1zIiwibmV3RG9jdW1lbnRVUkwiLCJvblNhdmUiXSwibWFwcGluZ3MiOiI7Ozs7K0JBNENhQTs7O2VBQUFBOzs7dUJBNUNZOytEQUMyQzs4QkFDckM7a0JBT0w7Z0NBQ0s7c0VBQ0w7K0JBQ087OERBQ2Y7MERBQ0o7c0JBQ1U7d0JBQ0U7OEJBQ1c7NkJBQ047OEVBQ0c7Z0VBQ1Y7cUVBQ0M7Z0NBQ1M7NkRBQ2pCO29FQUNPOzhCQUNhO3dFQUNUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU1QixNQUFNQyx3QkFBd0IsQ0FBQ0MsT0FBY0M7SUFDM0MsSUFBSSxTQUFTRCxPQUFPO1FBQ2xCQSxNQUFNRSxHQUFH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