diff --git a/bundle/API/Repository/Values/Enums/TagSortBy.php b/bundle/API/Repository/Values/Enums/TagSortBy.php new file mode 100644 index 00000000..af37cdf0 --- /dev/null +++ b/bundle/API/Repository/Values/Enums/TagSortBy.php @@ -0,0 +1,13 @@ + "Hrvatska", "eng-GB" => "Croatia" ). diff --git a/bundle/Controller/Admin/TagController.php b/bundle/Controller/Admin/TagController.php index 7d9030df..93072315 100644 --- a/bundle/Controller/Admin/TagController.php +++ b/bundle/Controller/Admin/TagController.php @@ -7,7 +7,10 @@ use Ibexa\Contracts\Core\Repository\ContentTypeService; use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException; use Netgen\TagsBundle\API\Repository\TagsService; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortBy; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortOrder; use Netgen\TagsBundle\API\Repository\Values\Tags\Tag; +use Netgen\TagsBundle\API\Repository\Values\Tags\TagUpdateStruct; use Netgen\TagsBundle\Core\Pagination\Pagerfanta\SearchTagsAdapter; use Netgen\TagsBundle\Form\Type\CopyTagsType; use Netgen\TagsBundle\Form\Type\LanguageSelectType; @@ -19,6 +22,7 @@ use Pagerfanta\Adapter\AdapterInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use function count; use function in_array; @@ -44,7 +48,6 @@ public function showTagAction(Request $request, ?Tag $tag = null): Response if (!$tag instanceof Tag || !$tag->isSynonym()) { $configResolver = $this->getConfigResolver(); - $currentPage = (int) $request->query->get('page'); $pager = $this->createPager( $this->tagChildrenAdapter, @@ -230,6 +233,7 @@ public function updateTagAction(Request $request, Tag $tag, string $languageCode $tagUpdateStruct = $this->tagsService->newTagUpdateStruct(); $tagUpdateStruct->remoteId = $tag->remoteId; $tagUpdateStruct->alwaysAvailable = $tag->alwaysAvailable; + $tagUpdateStruct->priority = $tag->priority; foreach ($tag->keywords as $keywordLanguageCode => $keyword) { $tagUpdateStruct->setKeyword($keyword ?? '', $keywordLanguageCode); @@ -264,6 +268,28 @@ public function updateTagAction(Request $request, Tag $tag, string $languageCode ); } + public function updateTagSortAction(Request $request, Tag $tag): Response + { + if (!$this->isCsrfTokenValid('netgen_tags_admin', (string) ($request->request->get('_csrf_token') ?? ''))) { + $this->addFlashMessage('errors', 'invalid_csrf_token'); + + return $this->redirectToTag($tag); + } + + $sortBy = $request->request->get('sort_by'); + $sortOrder = $request->request->get('sort_order'); + + $tagUpdateStruct = new TagUpdateStruct(); + $tagUpdateStruct->sortBy = TagSortBy::tryFrom((string) $sortBy) + ?? throw new BadRequestHttpException('Invalid enum value for sortBy when trying to update children sorting'); + $tagUpdateStruct->sortOrder = TagSortOrder::tryFrom((string) $sortOrder) + ?? throw new BadRequestHttpException('Invalid enum value for sortOrder when trying to update children sorting'); + + $this->tagsService->updateTag($tag, $tagUpdateStruct); + + return $this->redirectToTag($tag); + } + /** * This method is called for delete tag or synonym action. * It shows a confirmation view. diff --git a/bundle/Core/Pagination/Pagerfanta/ChildrenTagsAdapter.php b/bundle/Core/Pagination/Pagerfanta/ChildrenTagsAdapter.php index 1882190d..a4c159b2 100644 --- a/bundle/Core/Pagination/Pagerfanta/ChildrenTagsAdapter.php +++ b/bundle/Core/Pagination/Pagerfanta/ChildrenTagsAdapter.php @@ -11,10 +11,9 @@ final class ChildrenTagsAdapter implements AdapterInterface, TagAdapterInterface { private ?Tag $tag = null; - private int $nbResults; - public function __construct(private TagsService $tagsService) {} + public function __construct(private readonly TagsService $tagsService) {} public function setTag(Tag $tag): void { @@ -30,7 +29,11 @@ public function getNbResults(): int public function getSlice($offset, $length): iterable { - $childrenTags = $this->tagsService->loadTagChildren($this->tag, $offset, $length); + $childrenTags = $this->tagsService->loadTagChildren( + $this->tag, + $offset, + $length, + ); $this->nbResults = $this->nbResults ?? $this->tagsService->getTagChildrenCount($this->tag); diff --git a/bundle/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabase.php b/bundle/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabase.php index 02a857dd..957f2a90 100644 --- a/bundle/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabase.php +++ b/bundle/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabase.php @@ -9,8 +9,11 @@ use Doctrine\DBAL\Query\QueryBuilder; use Doctrine\DBAL\Types\Types; use Ibexa\Contracts\Core\Persistence\Content\Language\Handler as LanguageHandler; +use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; use Ibexa\Core\Base\Exceptions\NotFoundException; use Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator as LanguageMaskGenerator; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortBy; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortOrder; use Netgen\TagsBundle\Core\Persistence\Legacy\Tags\Gateway; use Netgen\TagsBundle\SPI\Persistence\Tags\CreateStruct; use Netgen\TagsBundle\SPI\Persistence\Tags\SynonymCreateStruct; @@ -35,9 +38,10 @@ final class DoctrineDatabase extends Gateway { public function __construct( - private Connection $connection, - private LanguageHandler $languageHandler, - private LanguageMaskGenerator $languageMaskGenerator, + private readonly Connection $connection, + private readonly LanguageHandler $languageHandler, + private readonly LanguageMaskGenerator $languageMaskGenerator, + private readonly ConfigResolverInterface $configResolver, ) {} public function getBasicTagData(int $tagId): array @@ -128,6 +132,21 @@ public function getFullTagDataByKeywordAndParentId(string $keyword, int $parentI public function getChildren(int $tagId, int $offset = 0, int $limit = -1, ?array $translations = null, bool $useAlwaysAvailable = true): array { + if ($tagId === 0) { + $sortBy = TagSortBy::from($this->configResolver->getParameter('sort.root.by', 'netgen_tags')); + $sortOrder = TagSortOrder::from($this->configResolver->getParameter('sort.root.order', 'netgen_tags')); + } else { + $tagData = $this->getBasicTagData($tagId); + $sortBy = $tagData['sort_by'] === null + ? TagSortBy::from($this->configResolver->getParameter('sort.by', 'netgen_tags')) + : TagSortBy::tryFrom($tagData['sort_by']) + ?? TagSortBy::from($this->configResolver->getParameter('sort.by', 'netgen_tags')); + $sortOrder = $tagData['sort_order'] === null + ? TagSortOrder::from($this->configResolver->getParameter('sort.order', 'netgen_tags')) + : TagSortOrder::tryFrom($tagData['sort_order']) + ?? TagSortOrder::from($this->configResolver->getParameter('sort.order', 'netgen_tags')); + } + $tagIdsQuery = $this->createTagIdsQuery($translations, $useAlwaysAvailable); $tagIdsQuery->andWhere( $tagIdsQuery->expr()->andX( @@ -137,10 +156,11 @@ public function getChildren(int $tagId, int $offset = 0, int $limit = -1, ?array ), $tagIdsQuery->expr()->eq('eztags.main_tag_id', 0), ), - )->setParameter('parent_id', $tagId, Types::INTEGER) - ->orderBy('eztags.keyword', 'ASC') - ->setFirstResult($offset) - ->setMaxResults($limit > 0 ? $limit : PHP_INT_MAX); + ) + ->orderBy('eztags.' . $sortBy->value, $sortOrder->value) + ->setParameter('parent_id', $tagId, Types::INTEGER) + ->setFirstResult($offset) + ->setMaxResults($limit > 0 ? $limit : PHP_INT_MAX); $statement = $tagIdsQuery->execute(); @@ -160,8 +180,8 @@ public function getChildren(int $tagId, int $offset = 0, int $limit = -1, ?array [':id'], ), ) - ->setParameter('id', $tagIds, Connection::PARAM_INT_ARRAY) - ->orderBy('eztags_keyword.keyword', 'ASC'); + ->orderBy('eztags.' . $sortBy->value, $sortOrder->value) + ->setParameter('id', $tagIds, Connection::PARAM_INT_ARRAY); return $query->execute()->fetchAll(FetchMode::ASSOCIATIVE); } @@ -446,6 +466,15 @@ public function update(UpdateStruct $updateStruct, int $tagId): void )->set( 'language_mask', ':language_mask', + )->set( + 'priority', + ':priority', + )->set( + 'sort_by', + ':sort_by', + )->set( + 'sort_order', + ':sort_order', )->where( $query->expr()->eq( 'id', @@ -469,7 +498,10 @@ public function update(UpdateStruct $updateStruct, int $tagId): void is_bool($updateStruct->alwaysAvailable) ? $updateStruct->alwaysAvailable : true, ), Types::INTEGER, - ); + ) + ->setParameter('priority', $updateStruct->priority, Types::INTEGER) + ->setParameter('sort_by', $updateStruct->sortBy?->value, Types::STRING) + ->setParameter('sort_order', $updateStruct->sortOrder?->value, Types::STRING); $query->execute(); @@ -847,7 +879,7 @@ public function deleteTag(int $tagId): void private function createTagIdsQuery(?array $translations = null, bool $useAlwaysAvailable = true): QueryBuilder { $query = $this->connection->createQueryBuilder(); - $query->select('DISTINCT eztags.id, eztags.keyword') + $query->select('DISTINCT eztags.id, eztags.keyword, eztags.modified, eztags.priority') ->from('eztags', 'eztags') // @todo: Joining with eztags_keyword is probably a VERY bad way to gather that information // since it creates an additional cartesian product with translations. @@ -930,6 +962,9 @@ private function createTagFindQuery(?array $translations = null, bool $useAlways 'eztags.remote_id', 'eztags.main_language_id', 'eztags.language_mask', + 'eztags.priority', + 'eztags.sort_by', + 'eztags.sort_order', // Tag keywords 'eztags_keyword.keyword', 'eztags_keyword.locale', diff --git a/bundle/Core/Persistence/Legacy/Tags/Mapper.php b/bundle/Core/Persistence/Legacy/Tags/Mapper.php index 024eecdf..32600259 100644 --- a/bundle/Core/Persistence/Legacy/Tags/Mapper.php +++ b/bundle/Core/Persistence/Legacy/Tags/Mapper.php @@ -5,7 +5,10 @@ namespace Netgen\TagsBundle\Core\Persistence\Legacy\Tags; use Ibexa\Contracts\Core\Persistence\Content\Language\Handler as LanguageHandler; +use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; use Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator as LanguageMaskGenerator; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortBy; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortOrder; use Netgen\TagsBundle\SPI\Persistence\Tags\Tag; use Netgen\TagsBundle\SPI\Persistence\Tags\TagInfo; @@ -16,7 +19,11 @@ */ class Mapper { - public function __construct(private LanguageHandler $languageHandler, private LanguageMaskGenerator $languageMaskGenerator) {} + public function __construct( + private readonly LanguageHandler $languageHandler, + private readonly LanguageMaskGenerator $languageMaskGenerator, + private readonly ConfigResolverInterface $configResolver, + ) {} /** * Creates a tag from a $data row. @@ -35,6 +42,9 @@ public function createTagInfoFromRow(array $row): TagInfo $tagInfo->alwaysAvailable = (bool) ((int) $row['language_mask'] & 1); $tagInfo->mainLanguageCode = $this->languageHandler->load($row['main_language_id'])->languageCode; $tagInfo->languageIds = $this->languageMaskGenerator->extractLanguageIdsFromMask((int) $row['language_mask']); + $tagInfo->priority = (int) $row['priority']; + + $this->mapSortingFromRow($row, $tagInfo); return $tagInfo; } @@ -60,6 +70,10 @@ public function extractTagListFromRows(array $rows): array $tag->alwaysAvailable = (bool) ((int) $row['language_mask'] & 1); $tag->mainLanguageCode = $this->languageHandler->load($row['main_language_id'])->languageCode; $tag->languageIds = $this->languageMaskGenerator->extractLanguageIdsFromMask((int) $row['language_mask']); + $tag->priority = (int) $row['priority']; + + $this->mapSortingFromRow($row, $tag); + $tagList[$tagId] = $tag; } @@ -68,4 +82,21 @@ public function extractTagListFromRows(array $rows): array return array_values($tagList); } + + private function mapSortingFromRow(array $row, Tag|TagInfo $tag): void + { + $isRootTag = (int) $row['id'] === 0; + $sortByParam = $isRootTag ? 'sort.root.by' : 'sort.by'; + $sortOrderParam = $isRootTag ? 'sort.root.order' : 'sort.order'; + + $tag->sortBy = $row['sort_by'] === null + ? null + : TagSortBy::tryFrom($row['sort_by']) + ?? TagSortBy::from($this->configResolver->getParameter($sortByParam, 'netgen_tags')); + + $tag->sortOrder = $row['sort_order'] === null + ? null + : TagSortOrder::tryFrom($row['sort_order']) + ?? TagSortOrder::from($this->configResolver->getParameter($sortOrderParam, 'netgen_tags')); + } } diff --git a/bundle/Core/Repository/TagsMapper.php b/bundle/Core/Repository/TagsMapper.php index 2d94ff7e..ffde6bc2 100644 --- a/bundle/Core/Repository/TagsMapper.php +++ b/bundle/Core/Repository/TagsMapper.php @@ -67,6 +67,9 @@ public function buildTagDomainList(array $spiTags, array $prioritizedLanguages = 'mainLanguageCode' => $spiTag->mainLanguageCode, 'languageCodes' => $languageCodes, 'prioritizedLanguageCode' => $prioritizedLanguageCode, + 'priority' => $spiTag->priority, + 'sortBy' => $spiTag->sortBy, + 'sortOrder' => $spiTag->sortOrder, ], ); } diff --git a/bundle/Core/Repository/TagsService.php b/bundle/Core/Repository/TagsService.php index 0574906d..2379dd14 100644 --- a/bundle/Core/Repository/TagsService.php +++ b/bundle/Core/Repository/TagsService.php @@ -453,6 +453,9 @@ public function updateTag(Tag $tag, TagUpdateStruct $tagUpdateStruct): Tag $updateStruct->remoteId = trim($tagUpdateStruct->remoteId ?? $spiTag->remoteId); $updateStruct->mainLanguageCode = $mainLanguageCode; $updateStruct->alwaysAvailable = $tagUpdateStruct->alwaysAvailable ?? $spiTag->alwaysAvailable; + $updateStruct->priority = $tagUpdateStruct->priority ?? $spiTag->priority; + $updateStruct->sortBy = $tagUpdateStruct->sortBy ?? $spiTag->sortBy; + $updateStruct->sortOrder = $tagUpdateStruct->sortOrder ?? $spiTag->sortOrder; $this->repository->beginTransaction(); diff --git a/bundle/DependencyInjection/Configuration.php b/bundle/DependencyInjection/Configuration.php index dca24605..b89acfc0 100644 --- a/bundle/DependencyInjection/Configuration.php +++ b/bundle/DependencyInjection/Configuration.php @@ -155,6 +155,37 @@ public function getConfigTreeBuilder(): TreeBuilder ->defaultValue(25) ->end() ->end() + ->end() + ->arrayNode('sort') + ->addDefaultsIfNotSet() + ->children() + ->enumNode('by') + ->info('Set the default property by which all child tags will be sorted by') + ->values(['id', 'keyword', 'modified', 'priority']) + ->defaultValue('id') + ->end() + ->enumNode('order') + ->info('Set the default sorting order by which all child tags will be ordered by') + ->values(['asc', 'desc']) + ->defaultValue('asc') + ->end() + ->arrayNode('root') + ->addDefaultsIfNotSet() + ->info('Set the default property and order by which the root tag children will be sorted') + ->children() + ->enumNode('by') + ->info('Set the default property by which root tag children will be sorted by') + ->values(['id', 'keyword', 'modified', 'priority']) + ->defaultValue('id') + ->end() + ->enumNode('order') + ->info('Set the default sorting order by which root tag children will be ordered by') + ->values(['asc', 'desc']) + ->defaultValue('asc') + ->end() + ->end() + ->end() + ->end() ->end(); return $treeBuilder; diff --git a/bundle/DependencyInjection/NetgenTagsExtension.php b/bundle/DependencyInjection/NetgenTagsExtension.php index b2c59365..9ad147f7 100644 --- a/bundle/DependencyInjection/NetgenTagsExtension.php +++ b/bundle/DependencyInjection/NetgenTagsExtension.php @@ -121,6 +121,12 @@ static function (array $config, string $scope, ContextualizerInterface $c): void $c->setContextualParameter('admin.tree_limit', $scope, $config['admin']['tree_limit']); $c->setContextualParameter('admin.related_content_limit', $scope, $config['admin']['related_content_limit']); $c->setContextualParameter('field.autocomplete_limit', $scope, $config['field']['autocomplete_limit']); + + $c->setContextualParameter('sort.by', $scope, $config['sort']['by']); + $c->setContextualParameter('sort.order', $scope, $config['sort']['order']); + + $c->setContextualParameter('sort.root.by', $scope, $config['sort']['root']['by']); + $c->setContextualParameter('sort.root.order', $scope, $config['sort']['root']['order']); }, ); diff --git a/bundle/Form/DataMapper/TagUpdateStructDataMapper.php b/bundle/Form/DataMapper/TagUpdateStructDataMapper.php index df5ca830..cd7d7925 100644 --- a/bundle/Form/DataMapper/TagUpdateStructDataMapper.php +++ b/bundle/Form/DataMapper/TagUpdateStructDataMapper.php @@ -8,6 +8,7 @@ use Symfony\Component\Form\DataMapperInterface; use Traversable; +use function array_key_exists; use function iterator_to_array; final class TagUpdateStructDataMapper implements DataMapperInterface @@ -25,6 +26,10 @@ public function mapDataToForms(mixed $viewData, Traversable $forms): void $forms['keyword']->setData($viewData->getKeyword($this->languageCode)); $forms['alwaysAvailable']->setData($viewData->alwaysAvailable); $forms['remoteId']->setData($viewData->remoteId); + + if (array_key_exists('priority', $forms)) { + $forms['priority']->setData($viewData->priority); + } } public function mapFormsToData(Traversable $forms, mixed &$viewData): void @@ -43,5 +48,8 @@ public function mapFormsToData(Traversable $forms, mixed &$viewData): void $viewData->alwaysAvailable = $forms['alwaysAvailable']->getData(); $viewData->remoteId = $forms['remoteId']->getData(); + if (array_key_exists('priority', $forms)) { + $viewData->priority = $forms['priority']->getData(); + } } } diff --git a/bundle/Form/Type/TagType.php b/bundle/Form/Type/TagType.php index ba522245..b6900aa5 100644 --- a/bundle/Form/Type/TagType.php +++ b/bundle/Form/Type/TagType.php @@ -4,10 +4,14 @@ namespace Netgen\TagsBundle\Form\Type; +use Netgen\TagsBundle\API\Repository\Values\Tags\SynonymCreateStruct; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; +use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; +use function array_key_exists; + final class TagType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void @@ -36,5 +40,18 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'required' => false, ], ); + + if (($options['data_class'] !== SynonymCreateStruct::class) + && array_key_exists('tag', $options) && $options['tag']->mainTagId === 0) { + $builder + ->add( + 'priority', + IntegerType::class, + [ + 'label' => 'tag.priority', + 'required' => false, + ], + ); + } } } diff --git a/bundle/Resources/config/policies.yaml b/bundle/Resources/config/policies.yaml index 1bedf021..a4e56924 100644 --- a/bundle/Resources/config/policies.yaml +++ b/bundle/Resources/config/policies.yaml @@ -9,3 +9,4 @@ tags: deletesynonym: ~ makesynonym: ~ merge: ~ + sort: ~ diff --git a/bundle/Resources/config/routing/admin/tag.yaml b/bundle/Resources/config/routing/admin/tag.yaml index 8f06b8cf..6a986862 100644 --- a/bundle/Resources/config/routing/admin/tag.yaml +++ b/bundle/Resources/config/routing/admin/tag.yaml @@ -43,6 +43,11 @@ netgen_tags_admin_tag_update_select: controller: netgen_tags.admin.controller.tag:updateTagSelectAction methods: [GET, POST] +netgen_tags_admin_tag_update_sort: + path: /{tagId}/update/sort + controller: netgen_tags.admin.controller.tag:updateTagSortAction + methods: [POST] + netgen_tags_admin_tag_update: path: /{tagId}/update/{languageCode} controller: netgen_tags.admin.controller.tag:updateTagAction diff --git a/bundle/Resources/config/storage/doctrine.yaml b/bundle/Resources/config/storage/doctrine.yaml index 6cefadbb..3581403b 100644 --- a/bundle/Resources/config/storage/doctrine.yaml +++ b/bundle/Resources/config/storage/doctrine.yaml @@ -15,6 +15,7 @@ services: arguments: - "@Ibexa\\Contracts\\Core\\Persistence\\Content\\Language\\Handler" - "@Ibexa\\Core\\Persistence\\Legacy\\Content\\Language\\MaskGenerator" + - "@ibexa.config.resolver" netgen_tags.api.storage_engine.legacy.handler.tags.gateway.inner: class: Netgen\TagsBundle\Core\Persistence\Legacy\Tags\Gateway\DoctrineDatabase @@ -22,6 +23,7 @@ services: - "@ibexa.persistence.connection" - "@Ibexa\\Contracts\\Core\\Persistence\\Content\\Language\\Handler" - "@Ibexa\\Core\\Persistence\\Legacy\\Content\\Language\\MaskGenerator" + - "@ibexa.config.resolver" netgen_tags.api.storage_engine.legacy.handler.tags.gateway.exception_conversion: class: Netgen\TagsBundle\Core\Persistence\Legacy\Tags\Gateway\ExceptionConversion diff --git a/bundle/Resources/public/admin/css/style.css b/bundle/Resources/public/admin/css/style.css index 79a9eed7..55c24022 100644 --- a/bundle/Resources/public/admin/css/style.css +++ b/bundle/Resources/public/admin/css/style.css @@ -773,4 +773,26 @@ body.tags-resizing { .ng-tags-app table input[type='checkbox'] + label, .ng-tags-app table input[type='radio'] + label { margin: 0; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fZm9udHMuc2NzcyIsIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fdmFyaWFibGVzLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX2Jhc2Uuc2NzcyIsIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fdHlwb2dyYXBoeS5zY3NzIiwiLi4vLi4vLi4vLi4vLi4vYnVuZGxlL1Jlc291cmNlcy9zYXNzL2FkbWluL19idXR0b25zLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX2Zvcm1zLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX3BhZ2luYXRpb24uc2NzcyIsIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fdHJlZS5zY3NzIiwiLi4vLi4vLi4vLi4vLi4vYnVuZGxlL1Jlc291cmNlcy9zYXNzL2FkbWluL190YWJzLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX21vZGFsLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX3Jlc2l6ZS5zY3NzIiwiLi4vLi4vLi4vLi4vLi4vYnVuZGxlL1Jlc291cmNlcy9zYXNzL2FkbWluL19jb250ZW50LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaO0VBQ0ksc0JBQXFCO0VBQ3JCLGlCQUFnQjtFQUNoQixtQkFBa0I7RUFDbEIsMkNBQTBDO0VBQzFDLGdXQU04RCxFQUFBOztBQUdsRTtFQUNJLHNCQUFxQjtFQUNyQixpQkFBZ0I7RUFDaEIsbUJBQWtCO0VBQ2xCLCtDQUE4QztFQUM5QyxrWEFN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VlBlO0lVUWYsaUJBQWUsRUFDbEI7RUExQlQ7SUE0Qlksb0JWWGUsRVVZbEI7RUE3QlQ7SUErQlksaUJBQWUsRUFDbEI7RUFoQ1Q7O0lBb0NnQixVQUFRLEVBQ1giLCJmaWxlIjoic3R5bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogUm9ib3RvICovXG5AZm9udC1mYWNlIHtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byc7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tMzAwLmVvdCcpO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTMwMC5lb3Q/I2llZml4JykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvIExpZ2h0JyksXG4gICAgICAgIGxvY2FsKCdSb2JvdG8tMzAwJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by0zMDAud29mZjInKSBmb3JtYXQoJ3dvZmYyJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by0zMDAud29mZicpIGZvcm1hdCgnd29mZicpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tMzAwLnR0ZicpIGZvcm1hdCgndHJ1ZXR5cGUnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTMwMC5zdmcjUm9ib3RvJykgZm9ybWF0KCdzdmcnKTtcbn1cblxuQGZvbnQtZmFjZSB7XG4gICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLXJlZ3VsYXIuZW90Jyk7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tcmVndWxhci5lb3Q/I2llZml4JykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgIGxvY2FsKCdSb2JvdG8nKSxcbiAgICAgICBsb2NhbCgnUm9ib3RvLXJlZ3VsYXInKSxcbiAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tcmVndWxhci53b2ZmMicpIGZvcm1hdCgnd29mZjInKSxcbiAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tcmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksXG4gICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLXJlZ3VsYXIudHRmJykgZm9ybWF0KCd0cnVldHlwZScpLFxuICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by1yZWd1bGFyLnN2ZyNSb2JvdG8nKSBmb3JtYXQoJ3N2ZycpO1xufVxuXG5AZm9udC1mYWNlIHtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byc7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNTAwLmVvdCcpO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTUwMC5lb3Q/I2llZml4JykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvLTUwMCcpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNTAwLndvZmYyJykgZm9ybWF0KCd3b2ZmMicpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNTAwLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTUwMC50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by01MDAuc3ZnI1JvYm90bycpIGZvcm1hdCgnc3ZnJyk7XG59XG5cbkBmb250LWZhY2Uge1xuICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJztcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBzcmM6IHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by03MDAuZW90Jyk7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNzAwLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksXG4gICAgICAgIGxvY2FsKCdSb2JvdG8gQm9sZCcpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvLTcwMCcpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNzAwLndvZmYyJykgZm9ybWF0KCd3b2ZmMicpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNzAwLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTcwMC50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by03MDAuc3ZnI1JvYm90bycpIGZvcm1hdCgnc3ZnJyk7XG59XG5cblxuLyogbWF0ZXJpYWwgaWNvbnMgKi9cbkBmb250LWZhY2Uge1xuICAgIGZvbnQtZmFtaWx5OiAnTWF0ZXJpYWwgSWNvbnMnO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXdlaWdodDogNDAwO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9NYXRlcmlhbEljb25zLVJlZ3VsYXIuZW90Jyk7IC8qIEZvciBJRTYtOCAqL1xuICAgIHNyYzogbG9jYWwoJ01hdGVyaWFsIEljb25zJyksXG4gICAgICAgIGxvY2FsKCdNYXRlcmlhbEljb25zLVJlZ3VsYXInKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9NYXRlcmlhbEljb25zLVJlZ3VsYXIud29mZjInKSBmb3JtYXQoJ3dvZmYyJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvTWF0ZXJpYWxJY29ucy1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9NYXRlcmlhbEljb25zLVJlZ3VsYXIudHRmJykgZm9ybWF0KCd0cnVldHlwZScpO1xufVxuLm1hdGVyaWFsLWljb25zIHtcbiAgICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXNpemU6IDI0cHg7ICAvKiBQcmVmZXJyZWQgaWNvbiBzaXplICovXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gICAgd29yZC13cmFwOiBub3JtYWw7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBkaXJlY3Rpb246IGx0cjtcblxuICAgIC8qIFN1cHBvcnQgZm9yIGFsbCBXZWJLaXQgYnJvd3NlcnMuICovXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gICAgLyogU3VwcG9ydCBmb3IgU2FmYXJpIGFuZCBDaHJvbWUuICovXG4gICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcblxuICAgIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcblxuICAgIC8qIFN1cHBvcnQgZm9yIElFLiAqL1xuICAgIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2xpZ2EnO1xufVxuLm1kLWljb24ge1xuICAgIEBleHRlbmQgLm1hdGVyaWFsLWljb25zO1xufVxuIiwiJG5hbWVzcGFjZTogJy5uZy10YWdzLWFwcCc7XG5cbi8qIENvbG9ycyAqL1xuJHNpZGViYXJCZzogaHNsKDAsIDAsIDkwKTtcbiRjb250ZW50Qmc6IGhzbCgwLCAwLCA5Nik7XG4kdGV4dENvbG9yOiBoc2woMCwgMCwgMjUpO1xuJGxpbmtDb2xvcjogIzI5NzBlZjtcbiRib3JkZXJDb2xvcjogaHNsKDAsIDAsIDkwKTtcbiRlcnJvckNvbG9yOiBoc2woMCwgMTAwLCA2MCk7XG4kYnJhbmREYXJrOiBoc2woMTkyLCA3NCwgNTQpO1xuJGJyYW5kTGlnaHQ6IGhzbCg5MSwgNzIsIDcwKTtcblxuJGJ0bkRlZmF1bHQ6ICNmZmY7XG4kYnRuRGVmYXVsdENvbG9yOiBoc2woMCwgMCwgMzUpO1xuJGJ0blByaW1hcnk6ICRsaW5rQ29sb3I7XG4kYnRuUHJpbWFyeUNvbG9yOiAjZmZmO1xuXG4kdGFibGVCb3JkZXI6IGhzbCgwLCAwLCA5MCk7XG5cbi8qIERpbWVuc2lvbnMgKi9cbiRndXR0ZXI6IDE1cHg7XG4kc2lkZWJhcldpZHRoOiAyNDBweDtcbiRib3JkZXJSYWRpdXM6IDJweDtcbiRidG5IZWlnaHQ6IDM2cHg7XG4kYmFzZUZvbnRTaXplOiAxNHB4O1xuXG4kYmFzZUZvbnQ6ICdSb2JvdG8nLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuXG4lY2xlYXJmaXgge1xuICAgICY6OmFmdGVyIHtcbiAgICAgICAgZGlzcGxheTp0YWJsZTtcbiAgICAgICAgY2xlYXI6Ym90aDtcbiAgICAgICAgY29udGVudDpcIlwiO1xuICAgIH1cbn1cblxuJW1hdGVyaWFsLWljb25zIHtcbiAgICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXNpemU6IDI0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgICBkaXJlY3Rpb246IGx0cjtcbiAgICAtd2Via2l0LWZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2xpZ2EnO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xufVxuXG4vL3Jlc3BvbnNpdmUgYnJlYWtwb2ludHNcbiRicmVhay1sZzoxMjAwcHg7XG4kYnJlYWstbWQ6OTkycHg7XG4kYnJlYWstc206NzY4cHg7XG4kYnJlYWsteHM6NDgwcHg7XG4iLCJib2R5LnRhZ3MtcmVzaXppbmcge1xuICAgIGN1cnNvcjpldy1yZXNpemU7XG59XG5cbiN7JG5hbWVzcGFjZX0ge1xuICAgIG1pbi1oZWlnaHQ6MTAwJTtcbiAgICBmb250LWZhbWlseTokYmFzZUZvbnQ7XG4gICAgZm9udC1zaXplOiRiYXNlRm9udFNpemU7XG4gICAgbGluZS1oZWlnaHQ6MS42O1xuICAgIGNvbG9yOiR0ZXh0Q29sb3I7XG4gICAgYmFja2dyb3VuZDokY29udGVudEJnO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlO1xuICAgIGRpc3BsYXk6ZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjpjb2x1bW47XG4gICAgKiB7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICB9XG4gICAgLm5nLXRhZ3MtY29udGFpbmVyIHtcbiAgICAgICAgaGVpZ2h0OjEwMCU7XG4gICAgICAgIHdpZHRoOjEwMCU7XG4gICAgICAgIG1heC13aWR0aDoxNjAwcHg7XG4gICAgICAgIG1hcmdpbjowIGF1dG87XG4gICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICAgICAgZmxleDoxO1xuICAgICAgICBhbGlnbi1pdGVtczpzdHJldGNoO1xuICAgIH1cbiAgICAudGFncy1zaWRlYmFyIHtcbiAgICAgICAgd2lkdGg6JHNpZGViYXJXaWR0aDtcbiAgICAgICAgYmFja2dyb3VuZDokc2lkZWJhckJnO1xuICAgICAgICAuanN0cmVlLW5nLXRhZ3Mge1xuICAgICAgICAgICAgcGFkZGluZzokZ3V0dGVyO1xuICAgICAgICAgICAgb3ZlcmZsb3cteDpoaWRkZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRhZ3MtY29udGVudCB7XG4gICAgICAgIGZsZXg6MTtcbiAgICAgICAgcGFkZGluZzokZ3V0dGVyO1xuICAgICAgICBvdmVyZmxvdy14OmF1dG87XG4gICAgfVxuXG4gICAgLyogbWVzc2FnZXMgKi9cbiAgICAudGFncy1tZXNzYWdlIHtcbiAgICAgICAgbWFyZ2luOjJlbSAwIDNlbTtcbiAgICAgICAgcGFkZGluZzokZ3V0dGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOmhzbCgyMDUsIDMwLCA5Mik7XG4gICAgICAgICYudGFncy1tZXNzYWdlLXN1Y2Nlc3Mge1xuICAgICAgICAgICAgYmFja2dyb3VuZDpoc2woMTYwLCA4MCwgODApO1xuICAgICAgICB9XG4gICAgICAgICYudGFncy1tZXNzYWdlLWVycm9yIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsKDAsIDEwMCwgOTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogaGVhZGVyICovXG4gICAgLm5nLXRhZ3MtaGVhZGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDpoc2woMCwgMCwgMzApO1xuICAgICAgICAubmctdGFncy1sb2dvIHtcbiAgICAgICAgICAgIGhlaWdodDo1MHB4O1xuICAgICAgICAgICAgd2lkdGg6JHNpZGViYXJXaWR0aDtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsKDAsIDAsIDIwKSB1cmwoLi4vaW1hZ2VzL3RhZ3MtbG9nby1mdWxsLnN2Zykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6YXV0byA2MCU7XG4gICAgICAgIH1cbiAgICB9XG59XG4ubGF5b3V0LWNvbHVtbi5tYWluLWNvbHVtbiB7XG4gICAgYmFja2dyb3VuZDojZjVmNWY1O1xufVxuIiwiI3skbmFtZXNwYWNlfSB7XG4gICAgYSB7XG4gICAgICAgIGNvbG9yOiRsaW5rQ29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjpub25lO1xuICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaDEsIGgyLCBoMywgaDQge1xuICAgICAgICBmb250LXdlaWdodDo1MDA7XG4gICAgICAgIG1hcmdpbjoyZW0gMCAxZW07XG4gICAgfVxuICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOjIuMjkxZW07XG4gICAgfVxuICAgIGgyIHtcbiAgICAgICAgZm9udC1zaXplOjEuNjE4ZW07XG4gICAgfVxuICAgIGgzIHtcbiAgICAgICAgZm9udC1zaXplOjEuNDE2ZW07XG4gICAgfVxuICAgIGg0IHtcbiAgICAgICAgZm9udC1zaXplOjFlbTtcbiAgICB9XG4gICAgLnRhZ3MtYmFkZ2Uge1xuICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgbWFyZ2luLWxlZnQ6NHB4O1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XG4gICAgICAgIHBhZGRpbmc6MCAycHg7XG4gICAgICAgIGZvbnQtc2l6ZToxMnB4O1xuICAgICAgICBmb250LXdlaWdodDo0MDA7XG4gICAgICAgIGxpbmUtaGVpZ2h0OjIwcHg7XG4gICAgICAgIGhlaWdodDoyMHB4O1xuICAgICAgICBtaW4td2lkdGg6MjBweDtcbiAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6aHNsKDAsIDAsIDUwKTtcbiAgICAgICAgY29sb3I6I2ZmZjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czo1MDBweDtcbiAgICB9XG59XG4iLCIjeyRuYW1lc3BhY2V9IHtcbiAgICAudGFncy1idG4ge1xuICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgZm9udC13ZWlnaHQ6bm9ybWFsO1xuICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcbiAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1xuICAgICAgICB0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO1xuICAgICAgICBjdXJzb3I6cG9pbnRlcjtcbiAgICAgICAgYm9yZGVyOm5vbmU7XG4gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6aGlkZGVuO1xuICAgICAgICBwYWRkaW5nOjZweCAxMnB4O1xuICAgICAgICBmb250LXNpemU6MTRweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6MS43MTQyODU3MTQzO1xuICAgICAgICB1c2VyLXNlbGVjdDpub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgIGJhY2tncm91bmQ6JGJ0bkRlZmF1bHQ7XG4gICAgICAgIGNvbG9yOiRidG5EZWZhdWx0Q29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjpub25lO1xuICAgICAgICB0cmFuc2l0aW9uOmFsbCAwLjJzO1xuICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgJltkaXNhYmxlZF0sXG4gICAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICAgICAgb3BhY2l0eTowLjU7XG4gICAgICAgICAgICBjdXJzb3I6bm90LWFsbG93ZWQ7XG4gICAgICAgICAgICAudGFncy1idG4tZWZmZWN0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDokYnRuRGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIG91dGxpbmU6MDtcbiAgICAgICAgfVxuICAgICAgICAmOmhvdmVyLFxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ZGFya2VuKCRidG5EZWZhdWx0LCAxMCUpO1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgJi50YWdzLWJ0bi1wcmltYXJ5IHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6JGJ0blByaW1hcnk7XG4gICAgICAgICAgICBjb2xvcjokYnRuUHJpbWFyeUNvbG9yO1xuICAgICAgICAgICAgJltkaXNhYmxlZF1cbiAgICAgICAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6JGJ0blByaW1hcnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ZGVzYXR1cmF0ZShkYXJrZW4oJGJ0blByaW1hcnksIDglKSwgMTAlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC50YWdzLWJ0bi1lZmZlY3Qge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsYSgwLCAwLCAxMDAsIDAuMjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICYudGFncy1idG4tbGluayB7XG4gICAgICAgICAgICBjb2xvcjokbGlua0NvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudDtcbiAgICAgICAgfVxuICAgICAgICAubWQtaWNvbiB7XG4gICAgICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcbiAgICAgICAgICAgIG1hcmdpbjowIDAuMjVlbSAwIDA7XG4gICAgICAgICAgICBmbG9hdDpsZWZ0O1xuICAgICAgICAgICAgJi5yaWdodCB7XG4gICAgICAgICAgICAgICAgZmxvYXQ6cmlnaHQ7XG4gICAgICAgICAgICAgICAgbWFyZ2luOjAgMCAwIDAuMjVlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAudGFncy1idG4tZWZmZWN0IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgICAgIGxlZnQ6NTAlO1xuICAgICAgICAgICAgdG9wOjUwJTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgICBvcGFjaXR5OjA7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOmhzbGEoMCwgMCwgMCwgMC4xKTtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6NTAlO1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjplZmZlY3RTaXplIDAuNXMgY3ViaWMtYmV6aWVyKDAuMzksIDAuNzYsIDAuNiwgMC45OCksIGVmZmVjdEZhZGUgMC41cyBjdWJpYy1iZXppZXIoMC4zNCwgMC4yOSwgMC44NywgMC41Nyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRhZ3MtYnRuLWdyb3VwIHtcbiAgICAgICAgQGV4dGVuZCAlY2xlYXJmaXg7XG4gICAgICAgIG1hcmdpbjoxZW0gMDtcbiAgICAgICAgPiAudGFncy1idG4ge1xuICAgICAgICAgICAgZmxvYXQ6bGVmdDtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjFweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6MDtcbiAgICAgICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6JGJvcmRlclJhZGl1cztcbiAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MDtcbiAgICAgICAgICAgICAgICBib3JkZXItbGVmdDpub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRhZ3MtYWN0aW9ucyB7XG4gICAgICAgIG1hcmdpbjoxZW0gMDtcbiAgICAgICAgLnRhZ3MtYnRuIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDowLjVlbTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkBrZXlmcmFtZXMgZWZmZWN0U2l6ZSB7XG4gICAgMCUge1xuICAgICAgICB3aWR0aDowO1xuICAgICAgICBoZWlnaHQ6MDtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIGVmZmVjdEZhZGUge1xuICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgb3BhY2l0eTowO1xuICAgIH1cbn1cbiIsIiN7JG5hbWVzcGFjZX0ge1xuICAgIGlucHV0W3R5cGU9J2NoZWNrYm94J10sXG4gICAgaW5wdXRbdHlwZT0ncmFkaW8nXSB7XG4gICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICBwb2ludGVyLWV2ZW50czphbGw7XG4gICAgICAgIG9wYWNpdHk6MDtcbiAgICAgICAgbGVmdDotOTk5OWVtO1xuICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjIuNWVtO1xuICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XG4gICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgbWFyZ2luOjFlbSAwO1xuICAgICAgICAgICAgbWluLWhlaWdodDoyMnB4O1xuICAgICAgICAgICAgJjo6YmVmb3JlLFxuICAgICAgICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIEBleHRlbmQgJW1hdGVyaWFsLWljb25zO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICAgICAgICAgIGxlZnQ6MDtcbiAgICAgICAgICAgICAgICB0b3A6LTJweDtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCAwLjJzIGVhc2Utb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6MDtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06c2NhbGUoMCk7XG4gICAgICAgICAgICAgICAgY29sb3I6JGxpbmtDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmNoZWNrZWQge1xuICAgICAgICAgICAgKyBsYWJlbCB7XG4gICAgICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTowO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOnNjYWxlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmRpc2FibGVkIHtcbiAgICAgICAgICAgICsgbGFiZWwge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6MC4yO1xuICAgICAgICAgICAgICAgIGN1cnNvcjpkZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlucHV0W3R5cGU9J2NoZWNrYm94J10ge1xuICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgY29udGVudDpcImNoZWNrX2JveF9vdXRsaW5lX2JsYW5rXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgY29udGVudDpcImNoZWNrX2JveFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6Y2hlY2tlZCB7XG4gICAgICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjokbGlua0NvbG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPSdyYWRpbyddIHtcbiAgICAgICAgKyBsYWJlbCB7XG4gICAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6XCJyYWRpb19idXR0b25fdW5jaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjphbGwgMC4zcyBlYXNlLW91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwicmFkaW9fYnV0dG9uX2NoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCAwLjFzIGVhc2Utb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6Y2hlY2tlZCB7XG4gICAgICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjA7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTpzY2FsZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjp0cmFuc2Zvcm0gMC4ycyBlYXNlLW91dCwgb3BhY2l0eSAwLjVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246YWxsIDAuM3MgZWFzZS1vdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4ubmctdGFncy1pbnB1dCB7XG4gICAgbWFyZ2luOjAgMCAxLjVlbTtcbiAgICBsYWJlbCB7XG4gICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgIG1hcmdpbjowIDAgMC4yNWVtO1xuICAgIH1cblxuICAgIGlucHV0W3R5cGU9dGV4dF0ge1xuICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICBtYXgtd2lkdGg6NTAwcHg7XG4gICAgICAgIGJvcmRlcjoxcHggc29saWQgJGJvcmRlckNvbG9yO1xuICAgICAgICBoZWlnaHQ6JGJ0bkhlaWdodDtcbiAgICAgICAgbGluZS1oZWlnaHQ6JGJ0bkhlaWdodDtcbiAgICAgICAgcGFkZGluZzowIDAuNzVlbTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICBmb250LXNpemU6MWVtO1xuICAgIH1cbiAgICAmLmVycm9yLWlucHV0IHtcbiAgICAgICAgaW5wdXRbdHlwZT10ZXh0XSB7XG4gICAgICAgICAgICBib3JkZXItY29sb3I6JGVycm9yQ29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgdWwge1xuICAgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOm5vbmU7XG4gICAgICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgICAgIHBhZGRpbmc6MDtcbiAgICAgICAgICAgIGxpIHtcbiAgICAgICAgICAgICAgICBjb2xvcjokZXJyb3JDb2xvcjtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOjAuMjVlbSAwO1xuICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjcwMDtcbiAgICAgICAgICAgICAgICBmb250LXNpemU6MTJweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFnLWtleXdvcmQge1xuICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgIGZsb2F0OmxlZnQ7XG4gICAgICAgIHBhZGRpbmc6MCAxZW07XG4gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgICAgIGJhY2tncm91bmQ6aHNsYSgwLCAwLCAxMDAsIDAuMzUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7XG4gICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7XG4gICAgICAgICsgLnRhZ3MtYnRuIHtcbiAgICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLm5nLXRhZ3MtY29udGVudC10eXBlLWZpbHRlciB7XG4gICAgZm9ybSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlNmU1ZTU7XG4gICAgICAgIHBhZGRpbmc6IC44ZW07XG4gICAgICAgIG1hcmdpbjogLjVlbSAwO1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG5cbiAgICAgICAgc2VsZWN0W211bHRpcGxlXSB7XG4gICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICBtYXgtd2lkdGg6NTAwcHg7XG4gICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICBtYXJnaW46IDAgMCAxZW07XG5cbiAgICAgICAgICAgIG9wdGlvbiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogLjI1ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3Q6bm90KFttdWx0aXBsZV0pIHtcbiAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICAgICAgbWF4LXdpZHRoOjUwMHB4O1xuICAgICAgICAgICAgYm9yZGVyOjFweCBzb2xpZCAkYm9yZGVyQ29sb3I7XG4gICAgICAgICAgICBoZWlnaHQ6JGJ0bkhlaWdodDtcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgICAgICBwYWRkaW5nOjAgMC43NWVtO1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICAgICAgZm9udC1zaXplOjFlbTtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6I2ZmZmZmZjtcbiAgICAgICAgICAgIG1hcmdpbjogMCAwIDFlbTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi5wYWdpbmF0aW9uLWNlbnRlcmVkIHtcbiAgICB0ZXh0LWFsaWduOmNlbnRlcjtcbn1cbi50YWdzLXBhZ2luYXRpb24ge1xuICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lO1xuICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbjoxZW0gYXV0bztcbiAgICBwYWRkaW5nOjA7XG4gICAgQGV4dGVuZCAlY2xlYXJmaXg7XG4gICAgbGkge1xuICAgICAgICBmbG9hdDpsZWZ0O1xuICAgICAgICBtYXJnaW46MCAxcHggMCAwO1xuICAgICAgICAmLnRvLWZpcnN0LFxuICAgICAgICAmLnRvLWxhc3QsXG4gICAgICAgIC5wYWdlLW9mIHtcbiAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcbiAgICAgICAgfVxuICAgICAgICAmLmFjdGl2ZSB7XG4gICAgICAgICAgICAudGFncy1idG4ge1xuICAgICAgICAgICAgICAgIGN1cnNvcjpkZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC50YWdzLWJ0biB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6MDtcbiAgICAgICAgLm1kLWljb24ge1xuICAgICAgICAgICAgbWFyZ2luOjA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo2MDBweCkge1xuICAgICAgICBsaSB7XG4gICAgICAgICAgICAmLnRvLXBhZ2U6bm90KC5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLnRvLWZpcnN0LFxuICAgICAgICAgICAgJi50by1sYXN0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLnBhZ2Utb2Yge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyogbmctdGFncyB0aGVtZSBmb3IganN0cmVlICovXG4kbm9kZUhlaWdodDogMjRweDtcblxuLmpzdHJlZS1uZy10YWdzIHtcbiAgICBmb250LXNpemU6MTNweDtcbiAgICBtYXJnaW46MCAwIDEuNWVtO1xuICAgIC5qc3RyZWUtaWNvbiB7XG4gICAgICAgIEBleHRlbmQgJW1hdGVyaWFsLWljb25zO1xuICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgei1pbmRleDoxO1xuICAgICAgICAmOmVtcHR5IHtcbiAgICAgICAgICAgIHdpZHRoOiRub2RlSGVpZ2h0O1xuICAgICAgICAgICAgaGVpZ2h0OiRub2RlSGVpZ2h0O1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6JG5vZGVIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmpzdHJlZS1ub2RlIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6JG5vZGVIZWlnaHQ7XG4gICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgICAgICAuanN0cmVlLW5vZGUge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6JG5vZGVIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICAgICAgbGVmdDokbm9kZUhlaWdodC8yO1xuICAgICAgICAgICAgdG9wOjA7XG4gICAgICAgICAgICBjb250ZW50OlwiXCI7XG4gICAgICAgICAgICBoZWlnaHQ6MTAwJTtcbiAgICAgICAgICAgIHdpZHRoOjA7XG4gICAgICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgI2Q1ZDVkNTtcbiAgICAgICAgICAgIHotaW5kZXg6MDtcbiAgICAgICAgfVxuICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICAgICAgICAgIGxlZnQ6JG5vZGVIZWlnaHQvMjtcbiAgICAgICAgICAgIHRvcDokbm9kZUhlaWdodC8yO1xuICAgICAgICAgICAgY29udGVudDpcIlwiO1xuICAgICAgICAgICAgaGVpZ2h0OjA7XG4gICAgICAgICAgICB3aWR0aDokbm9kZUhlaWdodC8yO1xuICAgICAgICAgICAgYm9yZGVyLXRvcDoxcHggc29saWQgI2Q1ZDVkNTtcbiAgICAgICAgICAgIHotaW5kZXg6MDtcbiAgICAgICAgfVxuICAgICAgICAmLmpzdHJlZS1sYXN0IHtcbiAgICAgICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiRub2RlSGVpZ2h0LzI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLmpzdHJlZS1hbmNob3Ige1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6bm9ybWFsO1xuICAgICAgICAgICAgd29yZC1icmVhazpicmVhay13b3JkO1xuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjI2cHg7XG4gICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgICAgIC5qc3RyZWUtaWNvbiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgbGVmdDowO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC5qc3RyZWUtdGhlbWVpY29uIHtcbiAgICAgICAgZm9udC1zaXplOjE3cHg7XG4gICAgICAgIGNvbG9yOmhzbCgwLCAwLCA3NCk7XG4gICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICBjb250ZW50OlwiZm9sZGVyXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmpzdHJlZS1vY2wge1xuICAgICAgICBmb250LXNpemU6MTdweDtcbiAgICB9XG4gICAgLmpzdHJlZS1jbG9zZWQsXG4gICAgLmpzdHJlZS1vcGVuLFxuICAgIC5qc3RyZWUtbG9hZGluZyB7XG4gICAgICAgID4gLmpzdHJlZS1vY2wge1xuICAgICAgICAgICAgYmFja2dyb3VuZDokc2lkZWJhckJnO1xuICAgICAgICAgICAgLm5nLW1vZGFsICYge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAuanN0cmVlLWNsb3NlZCB7XG4gICAgICAgID4gLmpzdHJlZS1vY2wge1xuICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwiYWRkX2NpcmNsZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC5qc3RyZWUtb3BlbiB7XG4gICAgICAgID4gLmpzdHJlZS1vY2wge1xuICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwicmVtb3ZlX2NpcmNsZV9vdXRsaW5lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmpzdHJlZS1sb2FkaW5nIHtcbiAgICAgICAgPiAuanN0cmVlLW9jbCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiRzaWRlYmFyQmcgdXJsKC4uL2ltYWdlcy9sb2FkZXIuc3ZnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZToyMHB4O1xuICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAubmctbW9kYWwgJiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4uanN0cmVlLW5nLXRhZ3MtY29udGV4dG1lbnUudmFrYXRhLWNvbnRleHQge1xuICAgIGJvcmRlcjpub25lO1xuICAgIGJhY2tncm91bmQ6I2ZmZjtcbiAgICBib3gtc2hhZG93OnJnYmEoMCwgMCwgMCwgMC4xMTc2NDcpIDBweCAxcHggNnB4LCByZ2JhKDAsIDAsIDAsIDAuMTE3NjQ3KSAwcHggMXB4IDRweDtcbiAgICBib3JkZXItcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgcGFkZGluZzo4cHggMDtcbiAgICB6LWluZGV4OjEwMDtcbiAgICBmb250LWZhbWlseTokYmFzZUZvbnQ7XG4gICAgZm9udC1zaXplOiRiYXNlRm9udFNpemU7XG4gICAgY29sb3I6JHRleHRDb2xvcjtcbiAgICB0ZXh0LXNoYWRvdzpub25lO1xuICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lO1xuICAgIHRyYW5zaXRpb246dHJhbnNmb3JtIDI1MG1zIGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKSAwbXMsIG9wYWNpdHkgMjUwbXMgY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpIDBtcztcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgdG9wIDBweDtcbiAgICBhbmltYXRpb246Y29udGV4dEluIDAuMThzIGVhc2Utb3V0O1xuXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtcbiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGU7XG4gICAgYSB7XG4gICAgICAgIGNvbG9yOmluaGVyaXQ7XG4gICAgICAgIHRleHQtc2hhZG93Om5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6MDtcbiAgICAgICAgcGFkZGluZzowICRndXR0ZXI7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgIHRyYW5zaXRpb246YmFja2dyb3VuZCAwLjJzO1xuICAgICAgICAudmFrYXRhLWNvbnRleHRtZW51LXNlcCB7XG4gICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgaSB7XG4gICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYTpob3ZlcixcbiAgICAudmFrYXRhLWNvbnRleHQtaG92ZXIgYSB7XG4gICAgICAgIGJveC1zaGFkb3c6bm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDpoc2xhKDAsIDAsIDAsIDAuMSk7XG4gICAgfVxuICAgIC52YWthdGEtY29udGV4dC1zZXBhcmF0b3Ige1xuICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAkYm9yZGVyQ29sb3I7XG4gICAgICAgIGEge1xuICAgICAgICAgICAgZGlzcGxheTpub25lO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5Aa2V5ZnJhbWVzIGNvbnRleHRJbiB7XG4gICAgMCUge1xuICAgICAgICB0cmFuc2Zvcm06c2NhbGUoMSwgMCk7XG4gICAgICAgIG9wYWNpdHk6MDtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTpzY2FsZSgxLCAxKTtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgIH1cbn1cblxuLnRhZ3MtdHJlZSBsaS5kaXNhYmxlZCB7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi50YWdzLXRyZWUgYS5zZWxlY3RlZCB7XG4gICAgY29sb3I6ICRsaW5rQ29sb3I7XG59XG4iLCIjeyRuYW1lc3BhY2V9IHtcbiAgICAudGFncy10YWJzIHtcbiAgICAgICAgbWFyZ2luOjJlbSAwIDMuNWVtO1xuICAgIH1cbiAgICAudGFncy10YWItY29udHJvbHMge1xuICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTtcbiAgICAgICAgd2lkdGg6MTAwJTtcbiAgICAgICAgcGFkZGluZzowO1xuICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgZGlzcGxheTpmbGV4O1xuICAgICAgICA+IGxpIHtcbiAgICAgICAgICAgIGZsZXg6MTtcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICAgICAgICAgIGFsaWduLWl0ZW1zOnN0cmV0Y2g7XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZDpoc2woMCwgMCwgMzIpO1xuICAgICAgICAgICAgbWFyZ2luOjA7XG4gICAgICAgICAgICAmLmFjdGl2ZSB7XG4gICAgICAgICAgICAgICAgLnRhZ3MtdGFiLWNvbnRyb2wge1xuICAgICAgICAgICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjp3aWR0aCAwLjI1cyBlYXNlLW91dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAudGFncy10YWItY29udHJvbCB7XG4gICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgcGFkZGluZzoxMHB4IDEwcHg7XG4gICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjUwMDtcbiAgICAgICAgICAgIGNvbG9yOiNmZmY7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgICAgICAgICB0cmFuc2l0aW9uOmJhY2tncm91bmQgMC4ycztcbiAgICAgICAgICAgICY6aG92ZXIge1xuICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjpub25lO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsYSgwLCAwLCAxMDAsIDAuMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgY29udGVudDpcIlwiO1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjp3aWR0aCAwLjFzIGVhc2UtaW47XG4gICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgYm90dG9tOjA7XG4gICAgICAgICAgICAgICAgbGVmdDo1MCU7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OjNweDtcbiAgICAgICAgICAgICAgICB3aWR0aDowO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6JGJyYW5kRGFyaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFncy10YWIge1xuICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgICYuYWN0aXZlIHtcbiAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgICAgICBhbmltYXRpb246dGFiRmFkZUluIDAuMzVzIGVhc2Utb3V0O1xuICAgICAgICB9XG4gICAgfVxufVxuQGtleWZyYW1lcyB0YWJGYWRlSW4ge1xuICAgIDAle1xuICAgICAgICBvcGFjaXR5OjA7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICBvcGFjaXR5OjE7XG4gICAgfVxufVxuIiwiLyogVGhlIE1vZGFsIChiYWNrZ3JvdW5kKSAqL1xuLm5nLW1vZGFsIHtcbiAgICBkaXNwbGF5Om5vbmU7XG4gICAgcG9zaXRpb246Zml4ZWQ7XG4gICAgei1pbmRleDoxMDAwO1xuICAgIGxlZnQ6MDtcbiAgICB0b3A6MDtcbiAgICB3aWR0aDoxMDAlO1xuICAgIGhlaWdodDoxMDAlO1xuICAgIG92ZXJmbG93OmF1dG87XG4gICAgYmFja2dyb3VuZDpoc2xhKDAsMCwwLDAuNTQpO1xuICAgIGFuaW1hdGlvbjptb2RhbEZhZGVJbiAwLjVzO1xuICAgIC5jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmO1xuICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgcGFkZGluZzokZ3V0dGVyKjIgJGd1dHRlciAkZ3V0dGVyO1xuICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICAgICAgdG9wOjUwJTtcbiAgICAgICAgbGVmdDo1MCU7XG4gICAgICAgIHRyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIGJveC1zaGFkb3c6cmdiYSgwLCAwLCAwLCAwLjI0NzA1OSkgMHB4IDE0cHggNDVweCwgcmdiYSgwLCAwLCAwLCAwLjIxOTYwOCkgMHB4IDEwcHggMThweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICB3aWR0aDo1MCU7XG4gICAgICAgIG1pbi13aWR0aDozMDBweDtcbiAgICAgICAgbWF4LXdpZHRoOjYwMHB4O1xuICAgICAgICBhbmltYXRpb246bW9kYWxTbGlkZUluIDAuNXM7XG4gICAgICAgIG1heC1oZWlnaHQ6OTglO1xuICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDtcbiAgICB9XG5cbiAgICAuY2xvc2Uge1xuICAgICAgICBjb2xvcjpoc2woMTg3LCAxMDAsIDQyKTtcbiAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OjEwcHg7XG4gICAgICAgIHRvcDoxMHB4O1xuICAgICAgICBmb250LXNpemU6MjhweDtcbiAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgd2lkdGg6MjRweDtcbiAgICAgICAgaGVpZ2h0OjI0cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OjI0cHg7XG4gICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1xuICAgICAgICB0cmFuc2l0aW9uOmNvbG9yIDAuMnM7XG4gICAgICAgIHotaW5kZXg6MjtcbiAgICAgICAgJjpob3ZlcixcbiAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjokdGV4dENvbG9yO1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbkBrZXlmcmFtZXMgbW9kYWxGYWRlSW4ge1xuICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eTowO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgbW9kYWxTbGlkZUluIHtcbiAgICAwJSB7XG4gICAgICAgIG1hcmdpbi10b3A6LTEwMHB4O1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgbWFyZ2luLXRvcDowO1xuICAgIH1cbn1cbiIsIi50YWdzLXJlc2l6YWJsZSB7XG4gICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgLnRhZ3MtcmVzaXphYmxlLWhhbmRsZSB7XG4gICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICByaWdodDotMnB4O1xuICAgICAgICB0b3A6MDtcbiAgICAgICAgYm90dG9tOjA7XG4gICAgICAgIHotaW5kZXg6MTAwO1xuICAgICAgICB3aWR0aDo0cHg7XG4gICAgICAgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjpldy1yZXNpemU7XG4gICAgfVxufVxuIiwiI3skbmFtZXNwYWNlfSB7XG4gICAgLnRhZy10aXRsZSB7XG4gICAgICAgIG1hcmdpbjowIDAgMS41ZW07XG4gICAgICAgIC50YWctdGl0bGUtbm90ZSB7XG4gICAgICAgICAgICBmb250LXNpemU6MC41Mjk3NTQ1NDcxZW07XG4gICAgICAgICAgICBmb250LXdlaWdodDo0MDA7XG4gICAgICAgICAgICBjb2xvcjojOTk5O1xuICAgICAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgICAgIHN0cm9uZyB7XG4gICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6NDAwO1xuICAgICAgICAgICAgICAgIGNvbG9yOiR0ZXh0Q29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0YWdzIHRhYmxlXG4gICAgdGFibGUge1xuICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICBib3JkZXItc3BhY2luZzowO1xuICAgICAgICBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XG4gICAgICAgIG1hcmdpbjowIDAgMWVtO1xuICAgICAgICB0aCxcbiAgICAgICAgdGQge1xuICAgICAgICAgICAgcGFkZGluZzo4cHggMTRweDtcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICR0YWJsZUJvcmRlcjtcbiAgICAgICAgICAgIHRleHQtYWxpZ246bGVmdDtcbiAgICAgICAgfVxuICAgICAgICB0aCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiR0YWJsZUJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICB0ZCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiNmZmY7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSxcbiAgICAgICAgaW5wdXRbdHlwZT0ncmFkaW8nXSB7XG4gICAgICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ== */ \ No newline at end of file + +.ng-tags-sort { + display: flex; + align-items: flex-end; + flex-wrap: wrap; + gap: 20px; } + .ng-tags-sort .sorting { + display: flex; + align-items: center; + gap: 20px; } + .ng-tags-sort .sorting .sort-dropdown { + display: flex; + flex-direction: column; + gap: 5px; } + .ng-tags-sort .sorting .sort-dropdown #sort_by { + height: 36px; + width: 100px; + padding: 5px; } + .ng-tags-sort .sorting .sort-dropdown #sort_order { + height: 36px; + width: 120px; + padding: 5px; } +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fZm9udHMuc2NzcyIsIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fdmFyaWFibGVzLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX2Jhc2Uuc2NzcyIsIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fdHlwb2dyYXBoeS5zY3NzIiwiLi4vLi4vLi4vLi4vLi4vYnVuZGxlL1Jlc291cmNlcy9zYXNzL2FkbWluL19idXR0b25zLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX2Zvcm1zLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX3BhZ2luYXRpb24uc2NzcyIsIi4uLy4uLy4uLy4uLy4uL2J1bmRsZS9SZXNvdXJjZXMvc2Fzcy9hZG1pbi9fdHJlZS5zY3NzIiwiLi4vLi4vLi4vLi4vLi4vYnVuZGxlL1Jlc291cmNlcy9zYXNzL2FkbWluL190YWJzLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX21vZGFsLnNjc3MiLCIuLi8uLi8uLi8uLi8uLi9idW5kbGUvUmVzb3VyY2VzL3Nhc3MvYWRtaW4vX3Jlc2l6ZS5zY3NzIiwiLi4vLi4vLi4vLi4vLi4vYnVuZGxlL1Jlc291cmNlcy9zYXNzL2FkbWluL19jb250ZW50LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaO0VBQ0ksc0JBQXFCO0VBQ3JCLGlCQUFnQjtFQUNoQixtQkFBa0I7RUFDbEIsMkNBQTBDO0VBQzFDLGdXQU04RCxFQUFBOztBQUdsRTtFQUNJLHNCQUFxQjtFQUNyQixpQkFBZ0I7RUFDaEIsbUJBQWtCO0VBQ2xCLCtDQUE4QztFQUM5QyxrWEFN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VlBlO0lVUWYsaUJBQWUsRUFDbEI7RUExQlQ7SUE0Qlksb0JWWGUsRVVZbEI7RUE3QlQ7SUErQlksaUJBQWUsRUFDbEI7RUFoQ1Q7O0lBb0NnQixVQUFRLEVBQ1giLCJmaWxlIjoic3R5bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogUm9ib3RvICovXG5AZm9udC1mYWNlIHtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byc7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tMzAwLmVvdCcpO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTMwMC5lb3Q/I2llZml4JykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvIExpZ2h0JyksXG4gICAgICAgIGxvY2FsKCdSb2JvdG8tMzAwJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by0zMDAud29mZjInKSBmb3JtYXQoJ3dvZmYyJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by0zMDAud29mZicpIGZvcm1hdCgnd29mZicpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tMzAwLnR0ZicpIGZvcm1hdCgndHJ1ZXR5cGUnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTMwMC5zdmcjUm9ib3RvJykgZm9ybWF0KCdzdmcnKTtcbn1cblxuQGZvbnQtZmFjZSB7XG4gICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLXJlZ3VsYXIuZW90Jyk7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tcmVndWxhci5lb3Q/I2llZml4JykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgIGxvY2FsKCdSb2JvdG8nKSxcbiAgICAgICBsb2NhbCgnUm9ib3RvLXJlZ3VsYXInKSxcbiAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tcmVndWxhci53b2ZmMicpIGZvcm1hdCgnd29mZjInKSxcbiAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tcmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksXG4gICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLXJlZ3VsYXIudHRmJykgZm9ybWF0KCd0cnVldHlwZScpLFxuICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by1yZWd1bGFyLnN2ZyNSb2JvdG8nKSBmb3JtYXQoJ3N2ZycpO1xufVxuXG5AZm9udC1mYWNlIHtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byc7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNTAwLmVvdCcpO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTUwMC5lb3Q/I2llZml4JykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvLTUwMCcpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNTAwLndvZmYyJykgZm9ybWF0KCd3b2ZmMicpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNTAwLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTUwMC50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by01MDAuc3ZnI1JvYm90bycpIGZvcm1hdCgnc3ZnJyk7XG59XG5cbkBmb250LWZhY2Uge1xuICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJztcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBzcmM6IHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by03MDAuZW90Jyk7XG4gICAgc3JjOiB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNzAwLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksXG4gICAgICAgIGxvY2FsKCdSb2JvdG8gQm9sZCcpLFxuICAgICAgICBsb2NhbCgnUm9ib3RvLTcwMCcpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNzAwLndvZmYyJykgZm9ybWF0KCd3b2ZmMicpLFxuICAgICAgICB1cmwoJy4uL2ZvbnRzL1JvYm90by9Sb2JvdG8tNzAwLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9Sb2JvdG8vUm9ib3RvLTcwMC50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvUm9ib3RvL1JvYm90by03MDAuc3ZnI1JvYm90bycpIGZvcm1hdCgnc3ZnJyk7XG59XG5cblxuLyogbWF0ZXJpYWwgaWNvbnMgKi9cbkBmb250LWZhY2Uge1xuICAgIGZvbnQtZmFtaWx5OiAnTWF0ZXJpYWwgSWNvbnMnO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXdlaWdodDogNDAwO1xuICAgIHNyYzogdXJsKCcuLi9mb250cy9NYXRlcmlhbEljb25zLVJlZ3VsYXIuZW90Jyk7IC8qIEZvciBJRTYtOCAqL1xuICAgIHNyYzogbG9jYWwoJ01hdGVyaWFsIEljb25zJyksXG4gICAgICAgIGxvY2FsKCdNYXRlcmlhbEljb25zLVJlZ3VsYXInKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9NYXRlcmlhbEljb25zLVJlZ3VsYXIud29mZjInKSBmb3JtYXQoJ3dvZmYyJyksXG4gICAgICAgIHVybCgnLi4vZm9udHMvTWF0ZXJpYWxJY29ucy1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgdXJsKCcuLi9mb250cy9NYXRlcmlhbEljb25zLVJlZ3VsYXIudHRmJykgZm9ybWF0KCd0cnVldHlwZScpO1xufVxuLm1hdGVyaWFsLWljb25zIHtcbiAgICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXNpemU6IDI0cHg7ICAvKiBQcmVmZXJyZWQgaWNvbiBzaXplICovXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gICAgd29yZC13cmFwOiBub3JtYWw7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBkaXJlY3Rpb246IGx0cjtcblxuICAgIC8qIFN1cHBvcnQgZm9yIGFsbCBXZWJLaXQgYnJvd3NlcnMuICovXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gICAgLyogU3VwcG9ydCBmb3IgU2FmYXJpIGFuZCBDaHJvbWUuICovXG4gICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcblxuICAgIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcblxuICAgIC8qIFN1cHBvcnQgZm9yIElFLiAqL1xuICAgIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2xpZ2EnO1xufVxuLm1kLWljb24ge1xuICAgIEBleHRlbmQgLm1hdGVyaWFsLWljb25zO1xufVxuIiwiJG5hbWVzcGFjZTogJy5uZy10YWdzLWFwcCc7XG5cbi8qIENvbG9ycyAqL1xuJHNpZGViYXJCZzogaHNsKDAsIDAsIDkwKTtcbiRjb250ZW50Qmc6IGhzbCgwLCAwLCA5Nik7XG4kdGV4dENvbG9yOiBoc2woMCwgMCwgMjUpO1xuJGxpbmtDb2xvcjogIzI5NzBlZjtcbiRib3JkZXJDb2xvcjogaHNsKDAsIDAsIDkwKTtcbiRlcnJvckNvbG9yOiBoc2woMCwgMTAwLCA2MCk7XG4kYnJhbmREYXJrOiBoc2woMTkyLCA3NCwgNTQpO1xuJGJyYW5kTGlnaHQ6IGhzbCg5MSwgNzIsIDcwKTtcblxuJGJ0bkRlZmF1bHQ6ICNmZmY7XG4kYnRuRGVmYXVsdENvbG9yOiBoc2woMCwgMCwgMzUpO1xuJGJ0blByaW1hcnk6ICRsaW5rQ29sb3I7XG4kYnRuUHJpbWFyeUNvbG9yOiAjZmZmO1xuXG4kdGFibGVCb3JkZXI6IGhzbCgwLCAwLCA5MCk7XG5cbi8qIERpbWVuc2lvbnMgKi9cbiRndXR0ZXI6IDE1cHg7XG4kc2lkZWJhcldpZHRoOiAyNDBweDtcbiRib3JkZXJSYWRpdXM6IDJweDtcbiRidG5IZWlnaHQ6IDM2cHg7XG4kYmFzZUZvbnRTaXplOiAxNHB4O1xuXG4kYmFzZUZvbnQ6ICdSb2JvdG8nLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuXG4lY2xlYXJmaXgge1xuICAgICY6OmFmdGVyIHtcbiAgICAgICAgZGlzcGxheTp0YWJsZTtcbiAgICAgICAgY2xlYXI6Ym90aDtcbiAgICAgICAgY29udGVudDpcIlwiO1xuICAgIH1cbn1cblxuJW1hdGVyaWFsLWljb25zIHtcbiAgICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXNpemU6IDI0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgICBkaXJlY3Rpb246IGx0cjtcbiAgICAtd2Via2l0LWZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2xpZ2EnO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xufVxuXG4vL3Jlc3BvbnNpdmUgYnJlYWtwb2ludHNcbiRicmVhay1sZzoxMjAwcHg7XG4kYnJlYWstbWQ6OTkycHg7XG4kYnJlYWstc206NzY4cHg7XG4kYnJlYWsteHM6NDgwcHg7XG4iLCJib2R5LnRhZ3MtcmVzaXppbmcge1xuICAgIGN1cnNvcjpldy1yZXNpemU7XG59XG5cbiN7JG5hbWVzcGFjZX0ge1xuICAgIG1pbi1oZWlnaHQ6MTAwJTtcbiAgICBmb250LWZhbWlseTokYmFzZUZvbnQ7XG4gICAgZm9udC1zaXplOiRiYXNlRm9udFNpemU7XG4gICAgbGluZS1oZWlnaHQ6MS42O1xuICAgIGNvbG9yOiR0ZXh0Q29sb3I7XG4gICAgYmFja2dyb3VuZDokY29udGVudEJnO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlO1xuICAgIGRpc3BsYXk6ZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjpjb2x1bW47XG4gICAgKiB7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICB9XG4gICAgLm5nLXRhZ3MtY29udGFpbmVyIHtcbiAgICAgICAgaGVpZ2h0OjEwMCU7XG4gICAgICAgIHdpZHRoOjEwMCU7XG4gICAgICAgIG1heC13aWR0aDoxNjAwcHg7XG4gICAgICAgIG1hcmdpbjowIGF1dG87XG4gICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICAgICAgZmxleDoxO1xuICAgICAgICBhbGlnbi1pdGVtczpzdHJldGNoO1xuICAgIH1cbiAgICAudGFncy1zaWRlYmFyIHtcbiAgICAgICAgd2lkdGg6JHNpZGViYXJXaWR0aDtcbiAgICAgICAgYmFja2dyb3VuZDokc2lkZWJhckJnO1xuICAgICAgICAuanN0cmVlLW5nLXRhZ3Mge1xuICAgICAgICAgICAgcGFkZGluZzokZ3V0dGVyO1xuICAgICAgICAgICAgb3ZlcmZsb3cteDpoaWRkZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRhZ3MtY29udGVudCB7XG4gICAgICAgIGZsZXg6MTtcbiAgICAgICAgcGFkZGluZzokZ3V0dGVyO1xuICAgICAgICBvdmVyZmxvdy14OmF1dG87XG4gICAgfVxuXG4gICAgLyogbWVzc2FnZXMgKi9cbiAgICAudGFncy1tZXNzYWdlIHtcbiAgICAgICAgbWFyZ2luOjJlbSAwIDNlbTtcbiAgICAgICAgcGFkZGluZzokZ3V0dGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOmhzbCgyMDUsIDMwLCA5Mik7XG4gICAgICAgICYudGFncy1tZXNzYWdlLXN1Y2Nlc3Mge1xuICAgICAgICAgICAgYmFja2dyb3VuZDpoc2woMTYwLCA4MCwgODApO1xuICAgICAgICB9XG4gICAgICAgICYudGFncy1tZXNzYWdlLWVycm9yIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsKDAsIDEwMCwgOTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogaGVhZGVyICovXG4gICAgLm5nLXRhZ3MtaGVhZGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDpoc2woMCwgMCwgMzApO1xuICAgICAgICAubmctdGFncy1sb2dvIHtcbiAgICAgICAgICAgIGhlaWdodDo1MHB4O1xuICAgICAgICAgICAgd2lkdGg6JHNpZGViYXJXaWR0aDtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsKDAsIDAsIDIwKSB1cmwoLi4vaW1hZ2VzL3RhZ3MtbG9nby1mdWxsLnN2Zykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6YXV0byA2MCU7XG4gICAgICAgIH1cbiAgICB9XG59XG4ubGF5b3V0LWNvbHVtbi5tYWluLWNvbHVtbiB7XG4gICAgYmFja2dyb3VuZDojZjVmNWY1O1xufVxuIiwiI3skbmFtZXNwYWNlfSB7XG4gICAgYSB7XG4gICAgICAgIGNvbG9yOiRsaW5rQ29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjpub25lO1xuICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaDEsIGgyLCBoMywgaDQge1xuICAgICAgICBmb250LXdlaWdodDo1MDA7XG4gICAgICAgIG1hcmdpbjoyZW0gMCAxZW07XG4gICAgfVxuICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOjIuMjkxZW07XG4gICAgfVxuICAgIGgyIHtcbiAgICAgICAgZm9udC1zaXplOjEuNjE4ZW07XG4gICAgfVxuICAgIGgzIHtcbiAgICAgICAgZm9udC1zaXplOjEuNDE2ZW07XG4gICAgfVxuICAgIGg0IHtcbiAgICAgICAgZm9udC1zaXplOjFlbTtcbiAgICB9XG4gICAgLnRhZ3MtYmFkZ2Uge1xuICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgbWFyZ2luLWxlZnQ6NHB4O1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XG4gICAgICAgIHBhZGRpbmc6MCAycHg7XG4gICAgICAgIGZvbnQtc2l6ZToxMnB4O1xuICAgICAgICBmb250LXdlaWdodDo0MDA7XG4gICAgICAgIGxpbmUtaGVpZ2h0OjIwcHg7XG4gICAgICAgIGhlaWdodDoyMHB4O1xuICAgICAgICBtaW4td2lkdGg6MjBweDtcbiAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6aHNsKDAsIDAsIDUwKTtcbiAgICAgICAgY29sb3I6I2ZmZjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czo1MDBweDtcbiAgICB9XG59XG4iLCIjeyRuYW1lc3BhY2V9IHtcbiAgICAudGFncy1idG4ge1xuICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgZm9udC13ZWlnaHQ6bm9ybWFsO1xuICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcbiAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1xuICAgICAgICB0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO1xuICAgICAgICBjdXJzb3I6cG9pbnRlcjtcbiAgICAgICAgYm9yZGVyOm5vbmU7XG4gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6aGlkZGVuO1xuICAgICAgICBwYWRkaW5nOjZweCAxMnB4O1xuICAgICAgICBmb250LXNpemU6MTRweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6MS43MTQyODU3MTQzO1xuICAgICAgICB1c2VyLXNlbGVjdDpub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgIGJhY2tncm91bmQ6JGJ0bkRlZmF1bHQ7XG4gICAgICAgIGNvbG9yOiRidG5EZWZhdWx0Q29sb3I7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjpub25lO1xuICAgICAgICB0cmFuc2l0aW9uOmFsbCAwLjJzO1xuICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgJltkaXNhYmxlZF0sXG4gICAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICAgICAgb3BhY2l0eTowLjU7XG4gICAgICAgICAgICBjdXJzb3I6bm90LWFsbG93ZWQ7XG4gICAgICAgICAgICAudGFncy1idG4tZWZmZWN0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDokYnRuRGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIG91dGxpbmU6MDtcbiAgICAgICAgfVxuICAgICAgICAmOmhvdmVyLFxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ZGFya2VuKCRidG5EZWZhdWx0LCAxMCUpO1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgJi50YWdzLWJ0bi1wcmltYXJ5IHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6JGJ0blByaW1hcnk7XG4gICAgICAgICAgICBjb2xvcjokYnRuUHJpbWFyeUNvbG9yO1xuICAgICAgICAgICAgJltkaXNhYmxlZF1cbiAgICAgICAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6JGJ0blByaW1hcnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ZGVzYXR1cmF0ZShkYXJrZW4oJGJ0blByaW1hcnksIDglKSwgMTAlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC50YWdzLWJ0bi1lZmZlY3Qge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsYSgwLCAwLCAxMDAsIDAuMjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICYudGFncy1idG4tbGluayB7XG4gICAgICAgICAgICBjb2xvcjokbGlua0NvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudDtcbiAgICAgICAgfVxuICAgICAgICAubWQtaWNvbiB7XG4gICAgICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcbiAgICAgICAgICAgIG1hcmdpbjowIDAuMjVlbSAwIDA7XG4gICAgICAgICAgICBmbG9hdDpsZWZ0O1xuICAgICAgICAgICAgJi5yaWdodCB7XG4gICAgICAgICAgICAgICAgZmxvYXQ6cmlnaHQ7XG4gICAgICAgICAgICAgICAgbWFyZ2luOjAgMCAwIDAuMjVlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAudGFncy1idG4tZWZmZWN0IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgICAgIGxlZnQ6NTAlO1xuICAgICAgICAgICAgdG9wOjUwJTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgICBvcGFjaXR5OjA7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOmhzbGEoMCwgMCwgMCwgMC4xKTtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6NTAlO1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjplZmZlY3RTaXplIDAuNXMgY3ViaWMtYmV6aWVyKDAuMzksIDAuNzYsIDAuNiwgMC45OCksIGVmZmVjdEZhZGUgMC41cyBjdWJpYy1iZXppZXIoMC4zNCwgMC4yOSwgMC44NywgMC41Nyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRhZ3MtYnRuLWdyb3VwIHtcbiAgICAgICAgQGV4dGVuZCAlY2xlYXJmaXg7XG4gICAgICAgIG1hcmdpbjoxZW0gMDtcbiAgICAgICAgPiAudGFncy1idG4ge1xuICAgICAgICAgICAgZmxvYXQ6bGVmdDtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjFweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6MDtcbiAgICAgICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6JGJvcmRlclJhZGl1cztcbiAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MDtcbiAgICAgICAgICAgICAgICBib3JkZXItbGVmdDpub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRhZ3MtYWN0aW9ucyB7XG4gICAgICAgIG1hcmdpbjoxZW0gMDtcbiAgICAgICAgLnRhZ3MtYnRuIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDowLjVlbTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkBrZXlmcmFtZXMgZWZmZWN0U2l6ZSB7XG4gICAgMCUge1xuICAgICAgICB3aWR0aDowO1xuICAgICAgICBoZWlnaHQ6MDtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIGVmZmVjdEZhZGUge1xuICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgb3BhY2l0eTowO1xuICAgIH1cbn1cbiIsIiN7JG5hbWVzcGFjZX0ge1xuICAgIGlucHV0W3R5cGU9J2NoZWNrYm94J10sXG4gICAgaW5wdXRbdHlwZT0ncmFkaW8nXSB7XG4gICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICBwb2ludGVyLWV2ZW50czphbGw7XG4gICAgICAgIG9wYWNpdHk6MDtcbiAgICAgICAgbGVmdDotOTk5OWVtO1xuICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjIuNWVtO1xuICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XG4gICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgbWFyZ2luOjFlbSAwO1xuICAgICAgICAgICAgbWluLWhlaWdodDoyMnB4O1xuICAgICAgICAgICAgJjo6YmVmb3JlLFxuICAgICAgICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIEBleHRlbmQgJW1hdGVyaWFsLWljb25zO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICAgICAgICAgIGxlZnQ6MDtcbiAgICAgICAgICAgICAgICB0b3A6LTJweDtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCAwLjJzIGVhc2Utb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6MDtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06c2NhbGUoMCk7XG4gICAgICAgICAgICAgICAgY29sb3I6JGxpbmtDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmNoZWNrZWQge1xuICAgICAgICAgICAgKyBsYWJlbCB7XG4gICAgICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTowO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOnNjYWxlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmRpc2FibGVkIHtcbiAgICAgICAgICAgICsgbGFiZWwge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6MC4yO1xuICAgICAgICAgICAgICAgIGN1cnNvcjpkZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlucHV0W3R5cGU9J2NoZWNrYm94J10ge1xuICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgY29udGVudDpcImNoZWNrX2JveF9vdXRsaW5lX2JsYW5rXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgY29udGVudDpcImNoZWNrX2JveFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6Y2hlY2tlZCB7XG4gICAgICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjokbGlua0NvbG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPSdyYWRpbyddIHtcbiAgICAgICAgKyBsYWJlbCB7XG4gICAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6XCJyYWRpb19idXR0b25fdW5jaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjphbGwgMC4zcyBlYXNlLW91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwicmFkaW9fYnV0dG9uX2NoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCAwLjFzIGVhc2Utb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6Y2hlY2tlZCB7XG4gICAgICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjA7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTpzY2FsZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjp0cmFuc2Zvcm0gMC4ycyBlYXNlLW91dCwgb3BhY2l0eSAwLjVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246YWxsIDAuM3MgZWFzZS1vdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4ubmctdGFncy1pbnB1dCB7XG4gICAgbWFyZ2luOjAgMCAxLjVlbTtcbiAgICBsYWJlbCB7XG4gICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgIG1hcmdpbjowIDAgMC4yNWVtO1xuICAgIH1cblxuICAgIGlucHV0W3R5cGU9dGV4dF0ge1xuICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICBtYXgtd2lkdGg6NTAwcHg7XG4gICAgICAgIGJvcmRlcjoxcHggc29saWQgJGJvcmRlckNvbG9yO1xuICAgICAgICBoZWlnaHQ6JGJ0bkhlaWdodDtcbiAgICAgICAgbGluZS1oZWlnaHQ6JGJ0bkhlaWdodDtcbiAgICAgICAgcGFkZGluZzowIDAuNzVlbTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICBmb250LXNpemU6MWVtO1xuICAgIH1cbiAgICAmLmVycm9yLWlucHV0IHtcbiAgICAgICAgaW5wdXRbdHlwZT10ZXh0XSB7XG4gICAgICAgICAgICBib3JkZXItY29sb3I6JGVycm9yQ29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgdWwge1xuICAgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOm5vbmU7XG4gICAgICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgICAgIHBhZGRpbmc6MDtcbiAgICAgICAgICAgIGxpIHtcbiAgICAgICAgICAgICAgICBjb2xvcjokZXJyb3JDb2xvcjtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOjAuMjVlbSAwO1xuICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjcwMDtcbiAgICAgICAgICAgICAgICBmb250LXNpemU6MTJweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFnLWtleXdvcmQge1xuICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgICAgICAgaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgIGZsb2F0OmxlZnQ7XG4gICAgICAgIHBhZGRpbmc6MCAxZW07XG4gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgICAgIGJhY2tncm91bmQ6aHNsYSgwLCAwLCAxMDAsIDAuMzUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7XG4gICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7XG4gICAgICAgICsgLnRhZ3MtYnRuIHtcbiAgICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLm5nLXRhZ3MtY29udGVudC10eXBlLWZpbHRlciB7XG4gICAgZm9ybSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlNmU1ZTU7XG4gICAgICAgIHBhZGRpbmc6IC44ZW07XG4gICAgICAgIG1hcmdpbjogLjVlbSAwO1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG5cbiAgICAgICAgc2VsZWN0W211bHRpcGxlXSB7XG4gICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICBtYXgtd2lkdGg6NTAwcHg7XG4gICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICBtYXJnaW46IDAgMCAxZW07XG5cbiAgICAgICAgICAgIG9wdGlvbiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogLjI1ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3Q6bm90KFttdWx0aXBsZV0pIHtcbiAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICAgICAgbWF4LXdpZHRoOjUwMHB4O1xuICAgICAgICAgICAgYm9yZGVyOjFweCBzb2xpZCAkYm9yZGVyQ29sb3I7XG4gICAgICAgICAgICBoZWlnaHQ6JGJ0bkhlaWdodDtcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgICAgICBwYWRkaW5nOjAgMC43NWVtO1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICAgICAgZm9udC1zaXplOjFlbTtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6I2ZmZmZmZjtcbiAgICAgICAgICAgIG1hcmdpbjogMCAwIDFlbTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi5wYWdpbmF0aW9uLWNlbnRlcmVkIHtcbiAgICB0ZXh0LWFsaWduOmNlbnRlcjtcbn1cbi50YWdzLXBhZ2luYXRpb24ge1xuICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lO1xuICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbjoxZW0gYXV0bztcbiAgICBwYWRkaW5nOjA7XG4gICAgQGV4dGVuZCAlY2xlYXJmaXg7XG4gICAgbGkge1xuICAgICAgICBmbG9hdDpsZWZ0O1xuICAgICAgICBtYXJnaW46MCAxcHggMCAwO1xuICAgICAgICAmLnRvLWZpcnN0LFxuICAgICAgICAmLnRvLWxhc3QsXG4gICAgICAgIC5wYWdlLW9mIHtcbiAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcbiAgICAgICAgfVxuICAgICAgICAmLmFjdGl2ZSB7XG4gICAgICAgICAgICAudGFncy1idG4ge1xuICAgICAgICAgICAgICAgIGN1cnNvcjpkZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC50YWdzLWJ0biB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6MDtcbiAgICAgICAgLm1kLWljb24ge1xuICAgICAgICAgICAgbWFyZ2luOjA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo2MDBweCkge1xuICAgICAgICBsaSB7XG4gICAgICAgICAgICAmLnRvLXBhZ2U6bm90KC5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLnRvLWZpcnN0LFxuICAgICAgICAgICAgJi50by1sYXN0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLnBhZ2Utb2Yge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyogbmctdGFncyB0aGVtZSBmb3IganN0cmVlICovXG4kbm9kZUhlaWdodDogMjRweDtcblxuLmpzdHJlZS1uZy10YWdzIHtcbiAgICBmb250LXNpemU6MTNweDtcbiAgICBtYXJnaW46MCAwIDEuNWVtO1xuICAgIC5qc3RyZWUtaWNvbiB7XG4gICAgICAgIEBleHRlbmQgJW1hdGVyaWFsLWljb25zO1xuICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgei1pbmRleDoxO1xuICAgICAgICAmOmVtcHR5IHtcbiAgICAgICAgICAgIHdpZHRoOiRub2RlSGVpZ2h0O1xuICAgICAgICAgICAgaGVpZ2h0OiRub2RlSGVpZ2h0O1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6JG5vZGVIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmpzdHJlZS1ub2RlIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6JG5vZGVIZWlnaHQ7XG4gICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgICAgICAuanN0cmVlLW5vZGUge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6JG5vZGVIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICAgICAgbGVmdDokbm9kZUhlaWdodC8yO1xuICAgICAgICAgICAgdG9wOjA7XG4gICAgICAgICAgICBjb250ZW50OlwiXCI7XG4gICAgICAgICAgICBoZWlnaHQ6MTAwJTtcbiAgICAgICAgICAgIHdpZHRoOjA7XG4gICAgICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgI2Q1ZDVkNTtcbiAgICAgICAgICAgIHotaW5kZXg6MDtcbiAgICAgICAgfVxuICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICAgICAgICAgIGxlZnQ6JG5vZGVIZWlnaHQvMjtcbiAgICAgICAgICAgIHRvcDokbm9kZUhlaWdodC8yO1xuICAgICAgICAgICAgY29udGVudDpcIlwiO1xuICAgICAgICAgICAgaGVpZ2h0OjA7XG4gICAgICAgICAgICB3aWR0aDokbm9kZUhlaWdodC8yO1xuICAgICAgICAgICAgYm9yZGVyLXRvcDoxcHggc29saWQgI2Q1ZDVkNTtcbiAgICAgICAgICAgIHotaW5kZXg6MDtcbiAgICAgICAgfVxuICAgICAgICAmLmpzdHJlZS1sYXN0IHtcbiAgICAgICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiRub2RlSGVpZ2h0LzI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLmpzdHJlZS1hbmNob3Ige1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6bm9ybWFsO1xuICAgICAgICAgICAgd29yZC1icmVhazpicmVhay13b3JkO1xuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjI2cHg7XG4gICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgICAgIC5qc3RyZWUtaWNvbiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgbGVmdDowO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC5qc3RyZWUtdGhlbWVpY29uIHtcbiAgICAgICAgZm9udC1zaXplOjE3cHg7XG4gICAgICAgIGNvbG9yOmhzbCgwLCAwLCA3NCk7XG4gICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICBjb250ZW50OlwiZm9sZGVyXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmpzdHJlZS1vY2wge1xuICAgICAgICBmb250LXNpemU6MTdweDtcbiAgICB9XG4gICAgLmpzdHJlZS1jbG9zZWQsXG4gICAgLmpzdHJlZS1vcGVuLFxuICAgIC5qc3RyZWUtbG9hZGluZyB7XG4gICAgICAgID4gLmpzdHJlZS1vY2wge1xuICAgICAgICAgICAgYmFja2dyb3VuZDokc2lkZWJhckJnO1xuICAgICAgICAgICAgLm5nLW1vZGFsICYge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAuanN0cmVlLWNsb3NlZCB7XG4gICAgICAgID4gLmpzdHJlZS1vY2wge1xuICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwiYWRkX2NpcmNsZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC5qc3RyZWUtb3BlbiB7XG4gICAgICAgID4gLmpzdHJlZS1vY2wge1xuICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwicmVtb3ZlX2NpcmNsZV9vdXRsaW5lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmpzdHJlZS1sb2FkaW5nIHtcbiAgICAgICAgPiAuanN0cmVlLW9jbCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiRzaWRlYmFyQmcgdXJsKC4uL2ltYWdlcy9sb2FkZXIuc3ZnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZToyMHB4O1xuICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OlwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAubmctbW9kYWwgJiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4uanN0cmVlLW5nLXRhZ3MtY29udGV4dG1lbnUudmFrYXRhLWNvbnRleHQge1xuICAgIGJvcmRlcjpub25lO1xuICAgIGJhY2tncm91bmQ6I2ZmZjtcbiAgICBib3gtc2hhZG93OnJnYmEoMCwgMCwgMCwgMC4xMTc2NDcpIDBweCAxcHggNnB4LCByZ2JhKDAsIDAsIDAsIDAuMTE3NjQ3KSAwcHggMXB4IDRweDtcbiAgICBib3JkZXItcmFkaXVzOiRib3JkZXJSYWRpdXM7XG4gICAgcGFkZGluZzo4cHggMDtcbiAgICB6LWluZGV4OjEwMDtcbiAgICBmb250LWZhbWlseTokYmFzZUZvbnQ7XG4gICAgZm9udC1zaXplOiRiYXNlRm9udFNpemU7XG4gICAgY29sb3I6JHRleHRDb2xvcjtcbiAgICB0ZXh0LXNoYWRvdzpub25lO1xuICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lO1xuICAgIHRyYW5zaXRpb246dHJhbnNmb3JtIDI1MG1zIGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKSAwbXMsIG9wYWNpdHkgMjUwbXMgY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpIDBtcztcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgdG9wIDBweDtcbiAgICBhbmltYXRpb246Y29udGV4dEluIDAuMThzIGVhc2Utb3V0O1xuXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtcbiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGU7XG4gICAgYSB7XG4gICAgICAgIGNvbG9yOmluaGVyaXQ7XG4gICAgICAgIHRleHQtc2hhZG93Om5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6MDtcbiAgICAgICAgcGFkZGluZzowICRndXR0ZXI7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiRidG5IZWlnaHQ7XG4gICAgICAgIHRyYW5zaXRpb246YmFja2dyb3VuZCAwLjJzO1xuICAgICAgICAudmFrYXRhLWNvbnRleHRtZW51LXNlcCB7XG4gICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgaSB7XG4gICAgICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYTpob3ZlcixcbiAgICAudmFrYXRhLWNvbnRleHQtaG92ZXIgYSB7XG4gICAgICAgIGJveC1zaGFkb3c6bm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDpoc2xhKDAsIDAsIDAsIDAuMSk7XG4gICAgfVxuICAgIC52YWthdGEtY29udGV4dC1zZXBhcmF0b3Ige1xuICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAkYm9yZGVyQ29sb3I7XG4gICAgICAgIGEge1xuICAgICAgICAgICAgZGlzcGxheTpub25lO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5Aa2V5ZnJhbWVzIGNvbnRleHRJbiB7XG4gICAgMCUge1xuICAgICAgICB0cmFuc2Zvcm06c2NhbGUoMSwgMCk7XG4gICAgICAgIG9wYWNpdHk6MDtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTpzY2FsZSgxLCAxKTtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgIH1cbn1cblxuLnRhZ3MtdHJlZSBsaS5kaXNhYmxlZCB7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi50YWdzLXRyZWUgYS5zZWxlY3RlZCB7XG4gICAgY29sb3I6ICRsaW5rQ29sb3I7XG59XG4iLCIjeyRuYW1lc3BhY2V9IHtcbiAgICAudGFncy10YWJzIHtcbiAgICAgICAgbWFyZ2luOjJlbSAwIDMuNWVtO1xuICAgIH1cbiAgICAudGFncy10YWItY29udHJvbHMge1xuICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTtcbiAgICAgICAgd2lkdGg6MTAwJTtcbiAgICAgICAgcGFkZGluZzowO1xuICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgZGlzcGxheTpmbGV4O1xuICAgICAgICA+IGxpIHtcbiAgICAgICAgICAgIGZsZXg6MTtcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICAgICAgICAgIGFsaWduLWl0ZW1zOnN0cmV0Y2g7XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZDpoc2woMCwgMCwgMzIpO1xuICAgICAgICAgICAgbWFyZ2luOjA7XG4gICAgICAgICAgICAmLmFjdGl2ZSB7XG4gICAgICAgICAgICAgICAgLnRhZ3MtdGFiLWNvbnRyb2wge1xuICAgICAgICAgICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjp3aWR0aCAwLjI1cyBlYXNlLW91dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAudGFncy10YWItY29udHJvbCB7XG4gICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICAgICAgcGFkZGluZzoxMHB4IDEwcHg7XG4gICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjUwMDtcbiAgICAgICAgICAgIGNvbG9yOiNmZmY7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgICAgICAgICB0cmFuc2l0aW9uOmJhY2tncm91bmQgMC4ycztcbiAgICAgICAgICAgICY6aG92ZXIge1xuICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjpub25lO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6aHNsYSgwLCAwLCAxMDAsIDAuMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgICAgICAgY29udGVudDpcIlwiO1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjp3aWR0aCAwLjFzIGVhc2UtaW47XG4gICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgYm90dG9tOjA7XG4gICAgICAgICAgICAgICAgbGVmdDo1MCU7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OjNweDtcbiAgICAgICAgICAgICAgICB3aWR0aDowO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6JGJyYW5kRGFyaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFncy10YWIge1xuICAgICAgICBkaXNwbGF5Om5vbmU7XG4gICAgICAgICYuYWN0aXZlIHtcbiAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICAgICAgICBhbmltYXRpb246dGFiRmFkZUluIDAuMzVzIGVhc2Utb3V0O1xuICAgICAgICB9XG4gICAgfVxufVxuQGtleWZyYW1lcyB0YWJGYWRlSW4ge1xuICAgIDAle1xuICAgICAgICBvcGFjaXR5OjA7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICBvcGFjaXR5OjE7XG4gICAgfVxufVxuIiwiLyogVGhlIE1vZGFsIChiYWNrZ3JvdW5kKSAqL1xuLm5nLW1vZGFsIHtcbiAgICBkaXNwbGF5Om5vbmU7XG4gICAgcG9zaXRpb246Zml4ZWQ7XG4gICAgei1pbmRleDoxMDAwO1xuICAgIGxlZnQ6MDtcbiAgICB0b3A6MDtcbiAgICB3aWR0aDoxMDAlO1xuICAgIGhlaWdodDoxMDAlO1xuICAgIG92ZXJmbG93OmF1dG87XG4gICAgYmFja2dyb3VuZDpoc2xhKDAsMCwwLDAuNTQpO1xuICAgIGFuaW1hdGlvbjptb2RhbEZhZGVJbiAwLjVzO1xuICAgIC5jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmZmO1xuICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgcGFkZGluZzokZ3V0dGVyKjIgJGd1dHRlciAkZ3V0dGVyO1xuICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICAgICAgdG9wOjUwJTtcbiAgICAgICAgbGVmdDo1MCU7XG4gICAgICAgIHRyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIGJveC1zaGFkb3c6cmdiYSgwLCAwLCAwLCAwLjI0NzA1OSkgMHB4IDE0cHggNDVweCwgcmdiYSgwLCAwLCAwLCAwLjIxOTYwOCkgMHB4IDEwcHggMThweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czokYm9yZGVyUmFkaXVzO1xuICAgICAgICB3aWR0aDo1MCU7XG4gICAgICAgIG1pbi13aWR0aDozMDBweDtcbiAgICAgICAgbWF4LXdpZHRoOjYwMHB4O1xuICAgICAgICBhbmltYXRpb246bW9kYWxTbGlkZUluIDAuNXM7XG4gICAgICAgIG1heC1oZWlnaHQ6OTglO1xuICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDtcbiAgICB9XG5cbiAgICAuY2xvc2Uge1xuICAgICAgICBjb2xvcjpoc2woMTg3LCAxMDAsIDQyKTtcbiAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OjEwcHg7XG4gICAgICAgIHRvcDoxMHB4O1xuICAgICAgICBmb250LXNpemU6MjhweDtcbiAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgd2lkdGg6MjRweDtcbiAgICAgICAgaGVpZ2h0OjI0cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OjI0cHg7XG4gICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1xuICAgICAgICB0cmFuc2l0aW9uOmNvbG9yIDAuMnM7XG4gICAgICAgIHotaW5kZXg6MjtcbiAgICAgICAgJjpob3ZlcixcbiAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjokdGV4dENvbG9yO1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7XG4gICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbkBrZXlmcmFtZXMgbW9kYWxGYWRlSW4ge1xuICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eTowO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgbW9kYWxTbGlkZUluIHtcbiAgICAwJSB7XG4gICAgICAgIG1hcmdpbi10b3A6LTEwMHB4O1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgbWFyZ2luLXRvcDowO1xuICAgIH1cbn1cbiIsIi50YWdzLXJlc2l6YWJsZSB7XG4gICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgLnRhZ3MtcmVzaXphYmxlLWhhbmRsZSB7XG4gICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICByaWdodDotMnB4O1xuICAgICAgICB0b3A6MDtcbiAgICAgICAgYm90dG9tOjA7XG4gICAgICAgIHotaW5kZXg6MTAwO1xuICAgICAgICB3aWR0aDo0cHg7XG4gICAgICAgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7XG4gICAgICAgIGN1cnNvcjpldy1yZXNpemU7XG4gICAgfVxufVxuIiwiI3skbmFtZXNwYWNlfSB7XG4gICAgLnRhZy10aXRsZSB7XG4gICAgICAgIG1hcmdpbjowIDAgMS41ZW07XG4gICAgICAgIC50YWctdGl0bGUtbm90ZSB7XG4gICAgICAgICAgICBmb250LXNpemU6MC41Mjk3NTQ1NDcxZW07XG4gICAgICAgICAgICBmb250LXdlaWdodDo0MDA7XG4gICAgICAgICAgICBjb2xvcjojOTk5O1xuICAgICAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgICAgIHN0cm9uZyB7XG4gICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6NDAwO1xuICAgICAgICAgICAgICAgIGNvbG9yOiR0ZXh0Q29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0YWdzIHRhYmxlXG4gICAgdGFibGUge1xuICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICBib3JkZXItc3BhY2luZzowO1xuICAgICAgICBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XG4gICAgICAgIG1hcmdpbjowIDAgMWVtO1xuICAgICAgICB0aCxcbiAgICAgICAgdGQge1xuICAgICAgICAgICAgcGFkZGluZzo4cHggMTRweDtcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICR0YWJsZUJvcmRlcjtcbiAgICAgICAgICAgIHRleHQtYWxpZ246bGVmdDtcbiAgICAgICAgfVxuICAgICAgICB0aCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiR0YWJsZUJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICB0ZCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiNmZmY7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSxcbiAgICAgICAgaW5wdXRbdHlwZT0ncmFkaW8nXSB7XG4gICAgICAgICAgICArIGxhYmVsIHtcbiAgICAgICAgICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ== */ diff --git a/bundle/Resources/schema/legacy.yaml b/bundle/Resources/schema/legacy.yaml index dbdfd035..ce6be1a8 100644 --- a/bundle/Resources/schema/legacy.yaml +++ b/bundle/Resources/schema/legacy.yaml @@ -55,6 +55,19 @@ tables: nullable: false options: default: '0' + priority: + type: bigint + nullable: false + options: + default: '0' + sort_by: + type: string + nullable: true + length: 100 + sort_order: + type: string + nullable: true + length: 100 indexes: idx_eztags_keyword: fields: [keyword] diff --git a/bundle/Resources/sql/mysql/schema.sql b/bundle/Resources/sql/mysql/schema.sql index 6130ee95..393bfa74 100644 --- a/bundle/Resources/sql/mysql/schema.sql +++ b/bundle/Resources/sql/mysql/schema.sql @@ -9,6 +9,9 @@ CREATE TABLE `eztags` ( `remote_id` varchar(100) NOT NULL default '', `main_language_id` int(11) NOT NULL default '0', `language_mask` int(11) NOT NULL default '0', + `priority` int(11) NOT NULL default '0', + `sort_by` varchar(100), + `sort_order` varchar(100), PRIMARY KEY ( `id` ), KEY `idx_eztags_keyword` ( `keyword`(191) ), KEY `idx_eztags_keyword_id` ( `keyword`(191), `id` ), diff --git a/bundle/Resources/sql/postgresql/schema.sql b/bundle/Resources/sql/postgresql/schema.sql index b86c4705..3abf0f64 100644 --- a/bundle/Resources/sql/postgresql/schema.sql +++ b/bundle/Resources/sql/postgresql/schema.sql @@ -10,6 +10,9 @@ CREATE TABLE eztags ( remote_id varchar(100) NOT NULL default '', main_language_id integer not null default 0, language_mask integer not null default 0, + priority integer not null default 0, + sort_by varchar(100), + sort_order varchar(100), PRIMARY KEY (id), CONSTRAINT idx_eztags_remote_id UNIQUE (remote_id) ); diff --git a/bundle/Resources/sql/upgrade/mysql/5.4/dbupdate-5.0-to-5.4.sql b/bundle/Resources/sql/upgrade/mysql/5.4/dbupdate-5.0-to-5.4.sql new file mode 100644 index 00000000..3be6f7e5 --- /dev/null +++ b/bundle/Resources/sql/upgrade/mysql/5.4/dbupdate-5.0-to-5.4.sql @@ -0,0 +1,4 @@ +ALTER TABLE `eztags` ADD COLUMN `priority` BIGINT NOT NULL DEFAULT '0'; + +ALTER TABLE `eztags` ADD COLUMN `sort_by` varchar(100); +ALTER TABLE `eztags` ADD COLUMN `sort_order` varchar(100); diff --git a/bundle/Resources/sql/upgrade/postgresql/5.4/dbupdate-5.0-to-5.4.sql b/bundle/Resources/sql/upgrade/postgresql/5.4/dbupdate-5.0-to-5.4.sql new file mode 100644 index 00000000..a6553261 --- /dev/null +++ b/bundle/Resources/sql/upgrade/postgresql/5.4/dbupdate-5.0-to-5.4.sql @@ -0,0 +1,4 @@ +ALTER TABLE `eztags` ADD COLUMN `priority` INTEGER NOT NULL DEFAULT 0; + +ALTER TABLE `eztags` ADD COLUMN `sort_by` VARCHAR(100); +ALTER TABLE `eztags` ADD COLUMN `sort_order` VARCHAR(100); diff --git a/bundle/Resources/translations/netgen_tags_admin.en.yml b/bundle/Resources/translations/netgen_tags_admin.en.yml index 34a5ea08..31bc96c7 100644 --- a/bundle/Resources/translations/netgen_tags_admin.en.yml +++ b/bundle/Resources/translations/netgen_tags_admin.en.yml @@ -11,6 +11,7 @@ tag.remote_id: 'Remote ID' tag.tag_name: 'Keyword' tag.translations: 'Translations' tag.modified: 'Modified' +tag.priority: 'Priority' tag.main_tag: 'Main tag' tag.parent_tag: 'Parent tag' @@ -43,6 +44,10 @@ tag.children.no_children: 'No tags found' tag.subtree_limitations.title: 'Subtree limitations' tag.subtree_limitations.no_limitations: 'No subtree limitations' +tag.subitems.title: 'Subitems' +tag.subitems.sort_by: 'Sort by' +tag.subitems.sort_order: 'Sort order' + tag.related_content.title: 'List of content related to tag' tag.related_content.filter.content_type: 'Content type filter' tag.related_content.filter.sort: 'Sort' @@ -109,3 +114,11 @@ tag.search.no_results.check_spelling: 'Check spelling of keywords.' tag.search.no_results.change_keywords: 'Try changing some keywords (eg, "car" instead of "cars").' tag.search.no_results.less_specific_keywords: 'Try searching with less specific keywords.' tag.search.no_results.reduce_keywords: 'Reduce number of keywords to get more results.' + +tag.enum.sort_by.id: 'Tag ID' +tag.enum.sort_by.keyword: 'Keyword' +tag.enum.sort_by.modified: 'Modified' +tag.enum.sort_by.priority: 'Priority' + +tag.enum.sort_order.asc: 'Ascending' +tag.enum.sort_order.desc: 'Descending' diff --git a/bundle/Resources/translations/netgen_tags_admin.fr.yml b/bundle/Resources/translations/netgen_tags_admin.fr.yml index 2bdf7739..5884bd81 100644 --- a/bundle/Resources/translations/netgen_tags_admin.fr.yml +++ b/bundle/Resources/translations/netgen_tags_admin.fr.yml @@ -11,6 +11,7 @@ tag.remote_id: 'Identification à distance' tag.tag_name: 'Mot-clé' tag.translations: 'Traductions' tag.modified: 'Modifié' +tag.priority: 'Priorité' tag.main_tag: 'Tag principale' tag.parent_tag: 'Tag parent' @@ -43,6 +44,10 @@ tag.children.no_children: 'Pas de tags trouvés' tag.subtree_limitations.title: 'Limites des sous-arbres' tag.subtree_limitations.no_limitations: 'Aucune limite de sous-arbre' +tag.subitems.title: 'Sous-éléments' +tag.subitems.sort_by: 'Trier par' +tag.subitems.sort_order: 'Ordre de tri' + tag.related_content.title: 'Liste des contenus liés au tag' tag.add.title: 'Nouveau tag' @@ -98,3 +103,11 @@ tag.search.no_results.check_spelling: 'Check spelling of keywords.' tag.search.no_results.change_keywords: 'Try changing some keywords (eg, "car" instead of "cars").' tag.search.no_results.less_specific_keywords: 'Try searching with less specific keywords.' tag.search.no_results.reduce_keywords: 'Reduce number of keywords to get more results.' + +tag.enum.sort_by.id: 'Tag ID' +tag.enum.sort_by.keyword: 'Mot-clé' +tag.enum.sort_by.modified: 'Modifié' +tag.enum.sort_by.priority: 'Priorité' + +tag.enum.sort_order.asc: 'Ascendant' +tag.enum.sort_order.desc: 'Descendant' diff --git a/bundle/Resources/views/admin/tag/children.html.twig b/bundle/Resources/views/admin/tag/children.html.twig index 7b21158e..88f3dd9a 100644 --- a/bundle/Resources/views/admin/tag/children.html.twig +++ b/bundle/Resources/views/admin/tag/children.html.twig @@ -5,6 +5,7 @@ {% set can_add = is_granted('ibexa:tags:add', tag is defined ? tag : null) %} {% set can_edit = is_granted('ibexa:tags:edit') %} {% set can_delete = is_granted('ibexa:tags:delete') %} +{% set can_sort = is_granted('ibexa:tags:sort') %}

{{ 'tag.children.title'|trans }} ({{ childrenTags|length }})

@@ -26,6 +27,7 @@ {{ 'tag.tag_name'|trans }} {{ 'tag.translations'|trans }} {{ 'tag.modified'|trans }} + {{ 'tag.priority'|trans }} @@ -48,6 +50,7 @@ {% endfor %} {{ child.modificationDate|date }} + {{ child.priority }} {% endfor %} @@ -71,6 +74,10 @@ {% endif %} + + {% if tag is defined and not tag.isSynonym and can_sort %} + {% include '@NetgenTags/admin/tag/sort_children_tags.html.twig' %} + {% endif %} {% else %}

{{ 'tag.children.no_children'|trans }}

{% endif %} diff --git a/bundle/Resources/views/admin/tag/show.html.twig b/bundle/Resources/views/admin/tag/show.html.twig index 0cdebad0..18382c83 100644 --- a/bundle/Resources/views/admin/tag/show.html.twig +++ b/bundle/Resources/views/admin/tag/show.html.twig @@ -13,6 +13,10 @@ {{ 'tag.tag_id'|trans }}: {{ tag.id }} {{ 'tag.remote_id'|trans }}: {{ tag.remoteId }} {{ 'tag.modified'|trans }}: {{ tag.modificationDate|date }} + + {% if tag.mainTagId == 0 %} + {{ 'tag.priority'|trans }}: {{ tag.priority }} + {% endif %} {% include '@NetgenTags/admin/flash_messages.html.twig' %} diff --git a/bundle/Resources/views/admin/tag/sort_children_tags.html.twig b/bundle/Resources/views/admin/tag/sort_children_tags.html.twig new file mode 100644 index 00000000..3da84083 --- /dev/null +++ b/bundle/Resources/views/admin/tag/sort_children_tags.html.twig @@ -0,0 +1,33 @@ +{% trans_default_domain 'netgen_tags_admin' %} + +
+
+
+ + +
+ +
+ + +
+
+ + + + +
diff --git a/bundle/SPI/Persistence/Tags/Tag.php b/bundle/SPI/Persistence/Tags/Tag.php index 8fe27331..96a4d5dd 100644 --- a/bundle/SPI/Persistence/Tags/Tag.php +++ b/bundle/SPI/Persistence/Tags/Tag.php @@ -5,6 +5,8 @@ namespace Netgen\TagsBundle\SPI\Persistence\Tags; use Ibexa\Contracts\Core\Persistence\ValueObject; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortBy; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortOrder; /** * Class representing a tag. @@ -72,4 +74,21 @@ final class Tag extends ValueObject * @var int[] */ public array $languageIds = []; + + /** + * Tag priority. + * + * Position of the Tag among its siblings when sorted by priority. + */ + public int $priority; + + /** + * Specifies by which property the child tags should be sorted on. + */ + public ?TagSortBy $sortBy; + + /** + * Specifies whether the sort order should be ascending or descending. + */ + public ?TagSortOrder $sortOrder; } diff --git a/bundle/SPI/Persistence/Tags/TagInfo.php b/bundle/SPI/Persistence/Tags/TagInfo.php index 1d3d23a7..08175ff3 100644 --- a/bundle/SPI/Persistence/Tags/TagInfo.php +++ b/bundle/SPI/Persistence/Tags/TagInfo.php @@ -5,6 +5,8 @@ namespace Netgen\TagsBundle\SPI\Persistence\Tags; use Ibexa\Contracts\Core\Persistence\ValueObject; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortBy; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortOrder; /** * Class representing a tag info (basically a tag without keywords). @@ -64,4 +66,21 @@ final class TagInfo extends ValueObject * @var int[] */ public array $languageIds = []; + + /** + * Tag priority. + * + * Position of the Tag among its siblings when sorted by priority. + */ + public int $priority; + + /** + * Specifies by which property the child tags should be sorted on. + */ + public ?TagSortBy $sortBy; + + /** + * Specifies whether the sort order should be ascending or descending. + */ + public ?TagSortOrder $sortOrder; } diff --git a/bundle/SPI/Persistence/Tags/UpdateStruct.php b/bundle/SPI/Persistence/Tags/UpdateStruct.php index 26cd78e5..38c00161 100644 --- a/bundle/SPI/Persistence/Tags/UpdateStruct.php +++ b/bundle/SPI/Persistence/Tags/UpdateStruct.php @@ -5,6 +5,8 @@ namespace Netgen\TagsBundle\SPI\Persistence\Tags; use Ibexa\Contracts\Core\Persistence\ValueObject; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortBy; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortOrder; /** * This class represents a value for updating a tag. @@ -33,4 +35,21 @@ final class UpdateStruct extends ValueObject * Indicates if the tag is shown in the main language if it's not present in an other requested language. */ public ?bool $alwaysAvailable; + + /** + * Tag priority. + * + * Position of the Tag among its siblings when sorted by priority. + */ + public ?int $priority; + + /** + * Specifies by which property the child tags should be sorted on. + */ + public ?TagSortBy $sortBy; + + /** + * Specifies whether the sort order should be ascending or descending. + */ + public ?TagSortOrder $sortOrder; } diff --git a/doc/UPGRADE.md b/doc/UPGRADE.md index 67e8aa91..67cb91da 100644 --- a/doc/UPGRADE.md +++ b/doc/UPGRADE.md @@ -1,6 +1,22 @@ Netgen Tags Bundle upgrade instructions ======================================= +Upgrade from 5.0 to 5.4 +----------------------- + +Tags Bundle 5.4 adds the possibility to **sort the tags**. Similarly to Ibexa, below the children list of some tag, you +can find the options to determine by which property you want the children tags to be sorted by and in which direction +(order) you want them to be sorted. + +Besides that, a new field called `priority` was added to `eztags`. You can now personally set the priority of each tag +and sort the tags by priority. \ +Also, right now, the tags can be sorted by either `id`, `keyword`, `modified` and `priority` properties. +The sort direction can be either `ascending` or `descending`. + +Please make sure to update the `eztags` table to include the newly added properties. \ +MySQL upgrade script: `bundle/Resources/sql/upgrade/mysql/5.4/dbupdate-5.0-to-5.4.sql` \ +PostgreSQL upgrade script: `bundle/Resources/sql/upgrade/postgresql/5.4/dbupdate-5.0-to-5.4.sql` + Upgrade from 4.0 to 5.0 ----------------------- diff --git a/tests/API/Repository/FieldType/TagsIntegrationTest.php b/tests/API/Repository/FieldType/TagsIntegrationTest.php index 2cd0c5d4..814ed69a 100644 --- a/tests/API/Repository/FieldType/TagsIntegrationTest.php +++ b/tests/API/Repository/FieldType/TagsIntegrationTest.php @@ -253,6 +253,9 @@ private function getTag1(): Tag 'mainLanguageCode' => 'eng-GB', 'languageCodes' => ['eng-GB'], 'prioritizedLanguageCode' => 'eng-GB', + 'priority' => 0, + 'sortBy' => null, + 'sortOrder' => null, ], ); } @@ -276,6 +279,9 @@ private function getTag2(): Tag 'mainLanguageCode' => 'eng-GB', 'languageCodes' => ['eng-GB'], 'prioritizedLanguageCode' => 'eng-GB', + 'priority' => 0, + 'sortBy' => null, + 'sortOrder' => null, ], ); } @@ -299,6 +305,9 @@ private function getTag3(): Tag 'mainLanguageCode' => 'eng-GB', 'languageCodes' => ['eng-GB'], 'prioritizedLanguageCode' => 'eng-GB', + 'priority' => 0, + 'sortBy' => null, + 'sortOrder' => null, ], ); } diff --git a/tests/API/Repository/SetupFactory/Legacy.php b/tests/API/Repository/SetupFactory/Legacy.php index 8dc2b43b..17d022f7 100644 --- a/tests/API/Repository/SetupFactory/Legacy.php +++ b/tests/API/Repository/SetupFactory/Legacy.php @@ -54,17 +54,31 @@ public function getTagsService(bool $initializeFromScratch = true): APITagsServi /** @var \Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator $languageMaskGenerator */ $languageMaskGenerator = $this->getServiceContainer()->get('netgen_tags.ibexa.persistence.legacy.language.mask_generator'); + /** @var \Netgen\TagsBundle\Tests\Stubs\ConfigResolverStub $configResolver */ + $configResolver = $this->getServiceContainer()->get('ibexa.config.resolver'); + + $parameters = [ + 'netgen_tags' => [ + 'sort.by' => 'id', + 'sort.order' => 'asc', + 'sort.root.id' => 'keyword', + 'sort.root.order' => 'desc', + ], + ]; + $tagsHandler = new Handler( new ExceptionConversion( new DoctrineDatabase( $this->getDatabaseConnection(), $languageHandler, $languageMaskGenerator, + $configResolver, ), ), new Mapper( $languageHandler, $languageMaskGenerator, + $configResolver, ), ); diff --git a/tests/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabaseTest.php b/tests/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabaseTest.php index 8d84aff7..c4ea08c2 100644 --- a/tests/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabaseTest.php +++ b/tests/Core/Persistence/Legacy/Tags/Gateway/DoctrineDatabaseTest.php @@ -14,6 +14,7 @@ use Netgen\TagsBundle\SPI\Persistence\Tags\SynonymCreateStruct; use Netgen\TagsBundle\SPI\Persistence\Tags\UpdateStruct; use Netgen\TagsBundle\Tests\Core\Persistence\Legacy\Content\LanguageHandlerMock; +use Netgen\TagsBundle\Tests\Stubs\ConfigResolverStub; use function array_filter; use function file_get_contents; @@ -342,12 +343,12 @@ public function testGetChildren(): void } self::assertCount(6, $data); - self::assertSame(20, $data[0]['id']); - self::assertSame(15, $data[1]['id']); - self::assertSame(72, $data[2]['id']); - self::assertSame(71, $data[3]['id']); - self::assertSame(18, $data[4]['id']); - self::assertSame(19, $data[5]['id']); + self::assertSame(15, $data[0]['id']); + self::assertSame(18, $data[1]['id']); + self::assertSame(19, $data[2]['id']); + self::assertSame(20, $data[3]['id']); + self::assertSame(71, $data[4]['id']); + self::assertSame(72, $data[5]['id']); } /** @@ -373,12 +374,12 @@ public function testGetChildrenWithoutAlwaysAvailable(): void } self::assertCount(6, $data); - self::assertSame(20, $data[0]['id']); - self::assertSame(15, $data[1]['id']); - self::assertSame(72, $data[2]['id']); - self::assertSame(71, $data[3]['id']); - self::assertSame(18, $data[4]['id']); - self::assertSame(19, $data[5]['id']); + self::assertSame(15, $data[0]['id']); + self::assertSame(18, $data[1]['id']); + self::assertSame(19, $data[2]['id']); + self::assertSame(20, $data[3]['id']); + self::assertSame(71, $data[4]['id']); + self::assertSame(72, $data[5]['id']); } /** @@ -649,6 +650,9 @@ public function testUpdate(): void 'remoteId' => 'updatedRemoteId', 'mainLanguageCode' => 'eng-US', 'alwaysAvailable' => true, + 'priority' => 5, + 'sortBy' => null, + 'sortOrder' => null, ], ), 40, @@ -831,10 +835,20 @@ private function getTagsGateway(): DoctrineDatabase $languageHandlerMock = (new LanguageHandlerMock())($this); + $parameters = [ + 'netgen_tags' => [ + 'sort.by' => 'id', + 'sort.order' => 'asc', + 'sort.root.id' => 'keyword', + 'sort.root.order' => 'desc', + ], + ]; + return new DoctrineDatabase( $dbConnection, $languageHandlerMock, new MaskGenerator($languageHandlerMock), + new ConfigResolverStub($parameters), ); } diff --git a/tests/Core/Persistence/Legacy/Tags/MapperTest.php b/tests/Core/Persistence/Legacy/Tags/MapperTest.php index 9e1ec38c..7e3d482c 100644 --- a/tests/Core/Persistence/Legacy/Tags/MapperTest.php +++ b/tests/Core/Persistence/Legacy/Tags/MapperTest.php @@ -6,9 +6,12 @@ use Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator; use Ibexa\Tests\Core\Persistence\Legacy\TestCase; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortBy; +use Netgen\TagsBundle\API\Repository\Values\Enums\TagSortOrder; use Netgen\TagsBundle\Core\Persistence\Legacy\Tags\Mapper; use Netgen\TagsBundle\SPI\Persistence\Tags\Tag; use Netgen\TagsBundle\Tests\Core\Persistence\Legacy\Content\LanguageHandlerMock; +use Netgen\TagsBundle\Tests\Stubs\ConfigResolverStub; final class MapperTest extends TestCase { @@ -28,6 +31,9 @@ final class MapperTest extends TestCase 'remote_id' => '123456abcdef', 'main_language_id' => 8, 'language_mask' => 9, + 'priority' => 0, + 'sort_by' => 'id', + 'sort_order' => 'asc', ]; /** @@ -47,6 +53,9 @@ final class MapperTest extends TestCase 'language_mask' => 9, 'keyword' => 'Croatia', 'locale' => 'eng-GB', + 'priority' => 0, + 'sort_by' => 'id', + 'sort_order' => 'asc', ]; /** @@ -65,6 +74,9 @@ final class MapperTest extends TestCase 'alwaysAvailable' => true, 'mainLanguageCode' => 'eng-GB', 'languageIds' => [8], + 'priority' => 0, + 'sortBy' => TagSortBy::Id, + 'sortOrder' => TagSortOrder::Ascending, ]; /** @@ -84,6 +96,9 @@ final class MapperTest extends TestCase 'alwaysAvailable' => true, 'mainLanguageCode' => 'eng-GB', 'languageIds' => [8], + 'priority' => 0, + 'sortBy' => TagSortBy::Id, + 'sortOrder' => TagSortOrder::Ascending, ]; private Mapper $tagsMapper; @@ -149,9 +164,19 @@ private function getMapper(): Mapper { $languageHandlerMock = (new LanguageHandlerMock())($this); + $parameters = [ + 'netgen_tags' => [ + 'sort.by' => 'id', + 'sort.order' => 'asc', + 'sort.root.id' => 'keyword', + 'sort.root.order' => 'desc', + ], + ]; + return new Mapper( $languageHandlerMock, new MaskGenerator($languageHandlerMock), + new ConfigResolverStub($parameters), ); } } diff --git a/tests/Core/Persistence/Legacy/Tags/TagsHandlerTest.php b/tests/Core/Persistence/Legacy/Tags/TagsHandlerTest.php index cc388a8a..e58703dc 100644 --- a/tests/Core/Persistence/Legacy/Tags/TagsHandlerTest.php +++ b/tests/Core/Persistence/Legacy/Tags/TagsHandlerTest.php @@ -18,6 +18,7 @@ use Netgen\TagsBundle\SPI\Persistence\Tags\TagInfo; use Netgen\TagsBundle\SPI\Persistence\Tags\UpdateStruct; use Netgen\TagsBundle\Tests\Core\Persistence\Legacy\Content\LanguageHandlerMock; +use Netgen\TagsBundle\Tests\Stubs\ConfigResolverStub; use PHPUnit\Framework\MockObject\MockObject; final class TagsHandlerTest extends TestCase @@ -963,11 +964,21 @@ private function getTagsHandler(): HandlerInterface $languageHandlerMock = (new LanguageHandlerMock())($this); + $parameters = [ + 'netgen_tags' => [ + 'sort.by' => 'id', + 'sort.order' => 'asc', + 'sort.root.id' => 'keyword', + 'sort.root.order' => 'desc', + ], + ]; + $this->mapper = $this->getMockBuilder(Mapper::class) ->setConstructorArgs( [ $languageHandlerMock, new MaskGenerator($languageHandlerMock), + new ConfigResolverStub($parameters), ], )->getMock(); @@ -980,11 +991,21 @@ private function getMockedTagsHandler(array $mockedMethods): Handler&MockObject $languageHandlerMock = (new LanguageHandlerMock())($this); + $parameters = [ + 'netgen_tags' => [ + 'sort.by' => 'id', + 'sort.order' => 'asc', + 'sort.root.id' => 'keyword', + 'sort.root.order' => 'desc', + ], + ]; + $this->mapper = $this->getMockBuilder(Mapper::class) ->setConstructorArgs( [ $languageHandlerMock, new MaskGenerator($languageHandlerMock), + new ConfigResolverStub($parameters), ], )->getMock(); diff --git a/tests/_fixtures/schema/schema.mysql.sql b/tests/_fixtures/schema/schema.mysql.sql index b59724fd..c63dd90b 100644 --- a/tests/_fixtures/schema/schema.mysql.sql +++ b/tests/_fixtures/schema/schema.mysql.sql @@ -11,6 +11,9 @@ CREATE TABLE `eztags` ( `remote_id` varchar(100) NOT NULL DEFAULT '', `main_language_id` int(11) NOT NULL DEFAULT '0', `language_mask` int(11) NOT NULL DEFAULT '0', + `priority` int(11) NOT NULL DEFAULT '0', + `sort_by` varchar(100), + `sort_order` varchar(100), PRIMARY KEY (`id`), UNIQUE KEY `eztags_remote_id` (`remote_id`), KEY `eztags_keyword` (`keyword`), diff --git a/tests/_fixtures/schema/schema.postgresql.sql b/tests/_fixtures/schema/schema.postgresql.sql index 8107505c..3ec34ad4 100644 --- a/tests/_fixtures/schema/schema.postgresql.sql +++ b/tests/_fixtures/schema/schema.postgresql.sql @@ -26,7 +26,10 @@ CREATE TABLE eztags ( modified integer DEFAULT 0 NOT NULL, remote_id character varying(100) DEFAULT ''::character varying NOT NULL, main_language_id integer DEFAULT 0 NOT NULL, - language_mask integer DEFAULT 0 NOT NULL + language_mask integer DEFAULT 0 NOT NULL, + priority integer DEFAULT 0 NOT NULL, + sort_by character varying(100), + sort_order character varying(100), ); DROP TABLE IF EXISTS eztags_attribute_link; diff --git a/tests/_fixtures/schema/schema.sqlite.sql b/tests/_fixtures/schema/schema.sqlite.sql index e93ecd60..e8c28e38 100644 --- a/tests/_fixtures/schema/schema.sqlite.sql +++ b/tests/_fixtures/schema/schema.sqlite.sql @@ -10,7 +10,10 @@ CREATE TABLE 'eztags' ( 'modified' integer NOT NULL DEFAULT 0, 'remote_id' text(100) NOT NULL DEFAULT '', 'main_language_id' integer NOT NULL DEFAULT 0, - 'language_mask' integer NOT NULL DEFAULT 0 + 'language_mask' integer NOT NULL DEFAULT 0, + 'priority' integer NOT NULL DEFAULT 0, + 'sort_by' text(100), + 'sort_order' text(100) ); DROP TABLE IF EXISTS 'eztags_attribute_link'; diff --git a/tests/settings/integration/legacy.yaml b/tests/settings/integration/legacy.yaml index a854508a..4bccdcef 100644 --- a/tests/settings/integration/legacy.yaml +++ b/tests/settings/integration/legacy.yaml @@ -6,7 +6,17 @@ services: class: Netgen\TagsBundle\Tests\Stubs\ConfigResolverStub arguments: - - netgen_tags: { edit_views: { default: { identifier: Default } } } + netgen_tags: { + edit_views: { + default: { + identifier: Default + } + }, + sort.by: 'id', + sort.order: 'asc', + sort.root.by: 'keyword', + sort.root.order: 'desc', + } ibexa.site_access.config: { user_content_type_identifier: ['user'] } netgen_tags.field_type.eztags: