Cyr-To-Lat - Version 4.6.0

Version Description

(10.02.2020) = * Add compatibility with Polylang * Add confirmation popup before mass conversion of slugs * Improve selection of posts and tags for conversion to avoid selection of excessive items for mass conversion * Fix bug with redirection from the old slug to a new one after background slug conversion * Fix js to run in old browsers like IE

Download this release

Release Info

Developer mihdan
Plugin Icon 128x128 Cyr-To-Lat
Version 4.6.0
Comparing to
See all releases

Code changes from version 4.5.1 to 4.6.0

Files changed (235) hide show
  1. .phpcs.cache +0 -1
  2. classes/background-processes/class-conversion-process.php +3 -2
  3. classes/background-processes/class-post-conversion-process.php +8 -6
  4. classes/background-processes/class-term-conversion-process.php +12 -0
  5. classes/class-converter.php +37 -49
  6. classes/class-main.php +97 -2
  7. classes/class-requirements.php +7 -5
  8. classes/class-settings.php +70 -53
  9. classes/class-wp-cli.php +5 -0
  10. css/cyr-to-lat-admin.css +22 -1
  11. cyr-to-lat.php +9 -8
  12. dist/js/settings/app.js +2 -0
  13. languages/cyr2lat-ru_RU.mo +0 -0
  14. languages/cyr2lat-ru_RU.po +88 -58
  15. languages/cyr2lat-sv.mo +0 -0
  16. languages/cyr2lat-uk.mo +0 -0
  17. languages/en_US.pot +115 -56
  18. lib/polyfill-mbstring/README.md +13 -0
  19. lib/polyfill-mbstring/composer.json +34 -0
  20. readme.txt +11 -1
  21. vendor/10up/wp_mock/.gitmodules +0 -1
  22. vendor/10up/wp_mock/CONTRIBUTING.md +0 -26
  23. vendor/10up/wp_mock/LICENSE.md +0 -368
  24. vendor/10up/wp_mock/behat.yml +0 -9
  25. vendor/10up/wp_mock/bootstrap.php.dist +0 -5
  26. vendor/10up/wp_mock/features/bootstrap/FeatureContext.php +0 -88
  27. vendor/10up/wp_mock/features/bootstrap/FunctionsContext.php +0 -127
  28. vendor/10up/wp_mock/features/bootstrap/HooksContext.php +0 -235
  29. vendor/10up/wp_mock/features/function-mocks.feature +0 -48
  30. vendor/10up/wp_mock/features/hooks.feature +0 -228
  31. vendor/10up/wp_mock/php/WP_Mock.php +0 -543
  32. vendor/10up/wp_mock/php/WP_Mock/API/constant-mocks.php +0 -72
  33. vendor/10up/wp_mock/php/WP_Mock/API/dummy-files/themes/vip/plugins/vip-init.php +0 -0
  34. vendor/10up/wp_mock/php/WP_Mock/API/dummy-files/wp-includes/class-http.php +0 -0
  35. vendor/10up/wp_mock/php/WP_Mock/API/function-mocks.php +0 -161
  36. vendor/10up/wp_mock/php/WP_Mock/Action.php +0 -77
  37. vendor/10up/wp_mock/php/WP_Mock/DeprecatedListener.php +0 -119
  38. vendor/10up/wp_mock/php/WP_Mock/EventManager.php +0 -124
  39. vendor/10up/wp_mock/php/WP_Mock/Filter.php +0 -76
  40. vendor/10up/wp_mock/php/WP_Mock/Functions.php +0 -295
  41. vendor/10up/wp_mock/php/WP_Mock/Handler.php +0 -110
  42. vendor/10up/wp_mock/php/WP_Mock/Hook.php +0 -88
  43. vendor/10up/wp_mock/php/WP_Mock/HookedCallback.php +0 -107
  44. vendor/10up/wp_mock/php/WP_Mock/InvokedFilterValue.php +0 -25
  45. vendor/10up/wp_mock/php/WP_Mock/Loader.php +0 -149
  46. vendor/10up/wp_mock/php/WP_Mock/Matcher/FuzzyObject.php +0 -101
  47. vendor/10up/wp_mock/php/WP_Mock/ReturnSequence.php +0 -39
  48. vendor/10up/wp_mock/php/WP_Mock/Tools/Constraints/ExpectationsMet.php +0 -40
  49. vendor/10up/wp_mock/php/WP_Mock/Tools/Constraints/IsEqualHtml.php +0 -21
  50. vendor/10up/wp_mock/php/WP_Mock/Tools/TestCase.php +0 -319
  51. vendor/10up/wp_mock/phpdoc.xml +0 -16
  52. vendor/10up/wp_mock/phpunit.xml.dist +0 -22
  53. vendor/antecedent/patchwork/.scrutinizer.yml +0 -48
  54. vendor/antecedent/patchwork/LICENSE +0 -21
  55. vendor/antecedent/patchwork/Patchwork.php +0 -149
  56. vendor/autoload.php +1 -1
  57. vendor/composer/ClassLoader.php +32 -0
  58. vendor/composer/InstalledVersions.php +96 -608
  59. vendor/composer/autoload_classmap.php +0 -623
  60. vendor/composer/autoload_files.php +0 -13
  61. vendor/composer/autoload_namespaces.php +0 -5
  62. vendor/composer/autoload_psr4.php +0 -24
  63. vendor/composer/autoload_real.php +8 -8
  64. vendor/composer/autoload_static.php +4 -816
  65. vendor/composer/installed.json +2 -4084
  66. vendor/composer/installed.php +6 -583
  67. vendor/composer/installers/composer.json +112 -0
  68. vendor/composer/installers/src/Composer/Installers/AglInstaller.php +21 -0
  69. vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php +9 -0
  70. vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php +11 -0
  71. vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php +49 -0
  72. vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php +9 -0
  73. vendor/composer/installers/src/Composer/Installers/BaseInstaller.php +137 -0
  74. vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php +126 -0
  75. vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php +9 -0
  76. vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php +72 -0
  77. vendor/composer/installers/src/Composer/Installers/ChefInstaller.php +11 -0
  78. vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php +9 -0
  79. vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php +10 -0
  80. vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php +34 -0
  81. vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php +11 -0
  82. vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php +13 -0
  83. vendor/composer/installers/src/Composer/Installers/CraftInstaller.php +35 -0
  84. vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php +21 -0
  85. vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php +10 -0
  86. vendor/composer/installers/src/Composer/Installers/DframeInstaller.php +10 -0
  87. vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php +50 -0
  88. vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php +16 -0
  89. vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php +22 -0
  90. vendor/composer/installers/src/Composer/Installers/ElggInstaller.php +9 -0
  91. vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php +12 -0
  92. vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php +29 -0
  93. vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php +10 -0
  94. vendor/composer/installers/src/Composer/Installers/FuelInstaller.php +11 -0
  95. vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php +9 -0
  96. vendor/composer/installers/src/Composer/Installers/GravInstaller.php +30 -0
  97. vendor/composer/installers/src/Composer/Installers/HuradInstaller.php +25 -0
  98. vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php +11 -0
  99. vendor/composer/installers/src/Composer/Installers/Installer.php +280 -0
  100. vendor/composer/installers/src/Composer/Installers/ItopInstaller.php +9 -0
  101. vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php +15 -0
  102. vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php +18 -0
  103. vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php +11 -0
  104. vendor/composer/installers/src/Composer/Installers/KnownInstaller.php +11 -0
  105. vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php +10 -0
  106. vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php +9 -0
  107. vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php +27 -0
  108. vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php +9 -0
  109. vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php +10 -0
  110. vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php +10 -0
  111. vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php +9 -0
  112. vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php +16 -0
  113. vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php +11 -0
  114. vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php +37 -0
  115. vendor/composer/installers/src/Composer/Installers/MakoInstaller.php +9 -0
  116. vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php +23 -0
  117. vendor/composer/installers/src/Composer/Installers/MauticInstaller.php +25 -0
  118. vendor/composer/installers/src/Composer/Installers/MayaInstaller.php +33 -0
  119. vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php +51 -0
  120. vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php +119 -0
  121. vendor/composer/installers/src/Composer/Installers/ModxInstaller.php +12 -0
  122. vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php +58 -0
  123. vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php +47 -0
  124. vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php +24 -0
  125. vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php +14 -0
  126. vendor/composer/installers/src/Composer/Installers/OxidInstaller.php +59 -0
  127. vendor/composer/installers/src/Composer/Installers/PPIInstaller.php +9 -0
  128. vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php +11 -0
  129. vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php +11 -0
  130. vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php +21 -0
  131. vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php +32 -0
  132. vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php +29 -0
  133. vendor/composer/installers/src/Composer/Installers/Plugin.php +27 -0
  134. vendor/composer/installers/src/Composer/Installers/PortoInstaller.php +9 -0
  135. vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php +10 -0
  136. vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php +11 -0
  137. vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php +63 -0
  138. vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php +24 -0
  139. vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php +10 -0
  140. vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php +10 -0
  141. vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php +10 -0
  142. vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php +22 -0
  143. vendor/composer/installers/src/Composer/Installers/SMFInstaller.php +10 -0
  144. vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php +60 -0
  145. vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php +35 -0
  146. vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php +25 -0
  147. vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php +49 -0
  148. vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php +9 -0
  149. vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php +26 -0
  150. vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php +16 -0
  151. vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php +38 -0
  152. vendor/composer/installers/src/Composer/Installers/TaoInstaller.php +12 -0
  153. vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php +12 -0
  154. vendor/composer/installers/src/Composer/Installers/TuskInstaller.php +14 -0
  155. vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php +9 -0
  156. vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php +10 -0
  157. vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php +49 -0
  158. vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php +21 -0
  159. vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php +9 -0
  160. vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php +12 -0
  161. vendor/composer/installers/src/Composer/Installers/YawikInstaller.php +32 -0
  162. vendor/composer/installers/src/Composer/Installers/ZendInstaller.php +11 -0
  163. vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php +10 -0
  164. vendor/composer/installers/src/bootstrap.php +13 -0
  165. vendor/doctrine/instantiator/.scrutinizer.yml +0 -46
  166. vendor/doctrine/instantiator/.travis.install.sh +0 -14
  167. vendor/doctrine/instantiator/CONTRIBUTING.md +0 -35
  168. vendor/doctrine/instantiator/LICENSE +0 -19
  169. vendor/doctrine/instantiator/phpmd.xml.dist +0 -27
  170. vendor/doctrine/instantiator/phpunit.xml.dist +0 -22
  171. vendor/guzzlehttp/guzzle/.php_cs +0 -23
  172. vendor/guzzlehttp/guzzle/Dockerfile +0 -18
  173. vendor/guzzlehttp/guzzle/LICENSE +0 -19
  174. vendor/guzzlehttp/guzzle/UPGRADING.md +0 -1203
  175. vendor/guzzlehttp/promises/.php_cs.dist +0 -88
  176. vendor/guzzlehttp/promises/LICENSE +0 -19
  177. vendor/guzzlehttp/promises/phpstan-baseline.neon +0 -7
  178. vendor/guzzlehttp/promises/phpstan.neon.dist +0 -10
  179. vendor/guzzlehttp/promises/psalm.xml +0 -15
  180. vendor/guzzlehttp/psr7/LICENSE +0 -19
  181. vendor/hamcrest/hamcrest-php/.gush.yml +0 -7
  182. vendor/hamcrest/hamcrest-php/CHANGES.txt +0 -173
  183. vendor/hamcrest/hamcrest-php/LICENSE.txt +0 -27
  184. vendor/hamcrest/hamcrest-php/generator/FactoryCall.php +0 -41
  185. vendor/hamcrest/hamcrest-php/generator/FactoryClass.php +0 -71
  186. vendor/hamcrest/hamcrest-php/generator/FactoryFile.php +0 -121
  187. vendor/hamcrest/hamcrest-php/generator/FactoryGenerator.php +0 -124
  188. vendor/hamcrest/hamcrest-php/generator/FactoryMethod.php +0 -231
  189. vendor/hamcrest/hamcrest-php/generator/FactoryParameter.php +0 -131
  190. vendor/hamcrest/hamcrest-php/generator/GlobalFunctionFile.php +0 -42
  191. vendor/hamcrest/hamcrest-php/generator/StaticMethodFile.php +0 -38
  192. vendor/hamcrest/hamcrest-php/generator/parts/file_header.txt +0 -7
  193. vendor/hamcrest/hamcrest-php/generator/parts/functions_footer.txt +0 -0
  194. vendor/hamcrest/hamcrest-php/generator/parts/functions_header.txt +0 -24
  195. vendor/hamcrest/hamcrest-php/generator/parts/functions_imports.txt +0 -0
  196. vendor/hamcrest/hamcrest-php/generator/parts/matchers_footer.txt +0 -1
  197. vendor/hamcrest/hamcrest-php/generator/parts/matchers_header.txt +0 -7
  198. vendor/hamcrest/hamcrest-php/generator/parts/matchers_imports.txt +0 -2
  199. vendor/hamcrest/hamcrest-php/generator/run.php +0 -37
  200. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php +0 -882
  201. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArray.php +0 -118
  202. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContaining.php +0 -63
  203. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInAnyOrder.php +0 -59
  204. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInOrder.php +0 -57
  205. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKey.php +0 -75
  206. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKeyValuePair.php +0 -80
  207. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayWithSize.php +0 -73
  208. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/MatchingOnce.php +0 -69
  209. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/SeriesMatchingOnce.php +0 -75
  210. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/AssertionError.php +0 -10
  211. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseDescription.php +0 -132
  212. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseMatcher.php +0 -30
  213. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsEmptyTraversable.php +0 -71
  214. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsTraversableWithSize.php +0 -47
  215. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AllOf.php +0 -59
  216. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AnyOf.php +0 -58
  217. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/CombinableMatcher.php +0 -78
  218. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/DescribedAs.php +0 -68
  219. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Every.php +0 -56
  220. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/HasToString.php +0 -56
  221. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Is.php +0 -57
  222. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsAnything.php +0 -45
  223. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsCollectionContaining.php +0 -93
  224. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsEqual.php +0 -44
  225. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsIdentical.php +0 -38
  226. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsInstanceOf.php +0 -67
  227. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNot.php +0 -44
  228. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNull.php +0 -56
  229. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsSame.php +0 -51
  230. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsTypeOf.php +0 -71
  231. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Set.php +0 -95
  232. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/ShortcutCombination.php +0 -43
  233. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Description.php +0 -70
  234. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/DiagnosingMatcher.php +0 -25
  235. vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/FeatureMatcher.php +0 -9
.phpcs.cache DELETED
@@ -1 +0,0 @@
1
- {"config":{"phpVersion":70033,"phpExtensions":"25b54755e960a66bca8abdd593feffae","tabWidth":4,"encoding":"utf-8","recordErrors":true,"annotations":true,"configData":{"installed_paths":"vendor\/phpcompatibility\/php-compatibility,vendor\/phpcompatibility\/phpcompatibility-paragonie,vendor\/phpcompatibility\/phpcompatibility-wp,vendor\/wp-coding-standards\/wpcs","testVersion":"5.6-","minimum_supported_wp_version":"5.1"},"codeHash":"65dd9046d872e9e232515bf57a1dc55c","rulesetHash":"74009a863ae4785386cc97164a8ffd49"},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/cyr-to-lat.php":{"hash":"16d0d38fb5f962d9e84c5eb82528374b33188","errors":{"19":{"4":[{"message":"Expected \"Squiz Pty Ltd <products@squiz.net>\" for author tag","source":"Squiz.Commenting.FileComment.IncorrectAuthor","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":true},{"message":"The tag in position 2 should be the @subpackage tag","source":"Squiz.Commenting.FileComment.SubpackageTagOrder","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"20":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"28":{"1":[{"message":"There must be no blank line following an inline comment","source":"Squiz.Commenting.InlineComment.SpacingAfter","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":true}]},"34":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"39":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"44":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"49":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"54":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"59":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"64":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"69":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"74":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"79":{"1":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":3}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":10}},"Multiple statements on same line":{"values":{"no":16}},"Control structure defined inline":{"values":{"no":3}},"Space before operator":{"values":{"1":2}},"Space after operator":{"values":{"1":4}},"Constant name case":{"values":{"upper":9}},"Spacing before string concat":{"values":{"1":1}},"Spacing after string concat":{"values":{"1":1}},"Assigning new by reference":{"values":{"no":2}},"Object instantiation with parenthesis":{"values":{"yes":2}},"Space between classname and parenthesis":{"values":[2]},"Spacing before object operator":{"values":[1]},"Spacing after object operator":{"values":[1]}},"errorCount":23,"warningCount":1,"fixableCount":12,"numTokens":430},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-admin-notices.php":{"hash":"f010bb07a24c170ab8b886793516c4d433188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"92":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"22":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"29":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"28":{"38":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"38":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"39":{"12":[{"message":"Type hint \"string\" missing for $message","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"string\" missing for $class","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"array\" missing for $options","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}],"73":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"45":{"5":[{"message":"Expected \/\/end add_notice()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"40":{"28":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"49":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"66":{"5":[{"message":"Expected \/\/end show_notices()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"73":{"8":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"75":{"15":[{"message":"Type hint \"array\" missing for $notice","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"91":{"5":[{"message":"Expected \/\/end is_page_allowed()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]},"13":{"4":[{"message":"@class tag is not allowed in class comment","source":"Squiz.Commenting.ClassComment.TagNotAllowed","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClassCommentSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":67}},"PHP short open tag used":{"values":{"no":13}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":25}},"Multiple statements on same line":{"values":{"no":13}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Space after operator":{"values":{"1":14}},"Short array syntax used":{"values":{"yes":4}},"Function has doc comment":{"values":{"yes":4}},"Function opening brace placement":{"values":{"same line":4}},"Single line array - comma after last item":{"values":{"no":1}},"Spacing before object operator":{"values":[4]},"Spacing after object operator":{"values":[4]},"Multi-line array - comma after last item":{"values":{"yes":1}},"Control structure defined inline":{"values":{"no":5}},"Space before operator":{"values":{"1":6}},"PHP constant case":{"values":{"lower":4}},"Spacing after cast statement":{"values":{"1":1}},"PHP type case":{"values":{"lower":1}}},"errorCount":17,"warningCount":2,"fixableCount":10,"numTokens":543},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-acf.php":{"hash":"b7dbc11af2c4260cba1d51160b87cf3d33188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"58":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"27":{"12":[{"message":"Type hint \"Settings\" missing for $settings","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"31":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"35":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"38":{"5":[{"message":"Expected \/\/end init_hooks()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"37":{"62":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"42":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"57":{"5":[{"message":"Expected \/\/end enqueue_script()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"49":{"13":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"54":{"19":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":36}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":9}},"Multiple statements on same line":{"values":{"no":9}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":3}},"Function opening brace placement":{"values":{"same line":3}},"Spacing before object operator":{"values":[4]},"Spacing after object operator":{"values":[4]},"Space after operator":{"values":{"1":4}},"Single line array - comma after last item":{"values":{"no":2}},"Short array syntax used":{"values":{"yes":3}},"Spacing before string concat":{"values":{"1":1}},"Spacing after string concat":{"values":{"1":1}},"PHP constant case":{"values":{"lower":1}}},"errorCount":11,"warningCount":1,"fixableCount":7,"numTokens":293},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/background-processes\/class-conversion-process.php":{"hash":"fe09f83c1ee9bef2995729c06240b88c33188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"103":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"36":{"12":[{"message":"Type hint \"Main\" missing for $main","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"41":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"52":{"5":[{"message":"Expected \/\/end task()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"56":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"61":{"5":[{"message":"Expected \/\/end complete()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"66":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"77":{"5":[{"message":"Expected \/\/end is_process_completed()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"85":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"88":{"5":[{"message":"Expected \/\/end is_process_running()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"95":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"96":{"15":[{"message":"Type hint \"string\" missing for $message","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"102":{"5":[{"message":"Expected \/\/end log()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":75}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":27}},"Multiple statements on same line":{"values":{"no":15}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":6}},"Function opening brace placement":{"values":{"same line":6}},"Spacing before object operator":{"values":[8]},"Spacing after object operator":{"values":[8]},"Space after operator":{"values":{"1":3}},"Adjacent assignments aligned":{"values":{"yes":1}},"PHP constant case":{"values":{"lower":3}},"Spacing before string concat":{"values":{"1":4}},"Spacing after string concat":{"values":{"1":4}},"Control structure defined inline":{"values":{"no":2}},"Space before operator":{"values":{"1":1}}},"errorCount":14,"warningCount":1,"fixableCount":7,"numTokens":527},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-wp-cli.php":{"hash":"b27299a55796b193f3c13af19b4ba84733188","errors":{"7":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false},{"message":"Missing @author tag in file comment","source":"Squiz.Commenting.FileComment.MissingAuthorTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"6":{"4":[{"message":"The tag in position 2 should be the @subpackage tag","source":"Squiz.Commenting.FileComment.SubpackageTagOrder","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"89":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"38":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"50":{"8":[{"message":"Parameter tags must be defined first in a doc comment","source":"Generic.Commenting.DocComment.ParamNotFirst","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Commenting\\DocCommentSniff","severity":0,"fixable":false}]},"52":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"53":{"12":[{"message":"Type hint \"array\" missing for $args","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"array\" missing for $assoc_args","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}],"41":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}],"59":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"79":{"5":[{"message":"Expected \/\/end regenerate()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"55":{"9":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"62":{"19":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"88":{"5":[{"message":"Expected \/\/end make_progress_bar()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]},"19":{"4":[{"message":"@class tag is not allowed in class comment","source":"Squiz.Commenting.ClassComment.TagNotAllowed","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClassCommentSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":57}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":20}},"Multiple statements on same line":{"values":{"no":19}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":3}},"Function opening brace placement":{"values":{"same line":3}},"Spacing before object operator":{"values":[8]},"Spacing after object operator":{"values":[8]},"Space after operator":{"values":{"1":9}},"Short array syntax used":{"values":{"yes":3}},"Control structure defined inline":{"values":{"no":2}},"Space before operator":{"values":{"1":2}},"Adjacent assignments aligned":{"values":{"yes":2}}},"errorCount":16,"warningCount":2,"fixableCount":8,"numTokens":572},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/background-processes\/class-term-conversion-process.php":{"hash":"30c280f4ec14fa14a58a76fc2fc2e6cc33188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"110":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"43":{"12":[{"message":"Type hint \"Main\" missing for $main","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"48":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"57":{"15":[{"message":"Type hint \"stdClass\" missing for $term","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"75":{"5":[{"message":"Expected \/\/end task()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"63":{"31":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"65":{"34":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"69":{"42":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}],"94":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"79":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"84":{"5":[{"message":"Expected \/\/end complete()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"109":{"5":[{"message":"Expected \/\/end filter_term_locale()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"92":{"17":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"105":{"81":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":75}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":25}},"Multiple statements on same line":{"values":{"no":25}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":4}},"Function opening brace placement":{"values":{"same line":4}},"Spacing before object operator":{"values":[21]},"Spacing after object operator":{"values":[21]},"Space after operator":{"values":{"1":16,"newline":1}},"Adjacent assignments aligned":{"values":{"yes":2}},"Single line array - comma after last item":{"values":{"no":4}},"Short array syntax used":{"values":{"yes":6}},"Control structure defined inline":{"values":{"no":2}},"Space before operator":{"values":{"1":4}},"Spacing before string concat":{"values":{"1":4}},"Spacing after string concat":{"values":{"1":4}},"PHP constant case":{"values":{"lower":3}},"Multi-line array - comma after last item":{"values":{"yes":1}}},"errorCount":15,"warningCount":1,"fixableCount":11,"numTokens":709},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/background-processes\/class-post-conversion-process.php":{"hash":"575cb31b50d78aa140067bebbeec931433188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"210":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"43":{"12":[{"message":"Type hint \"Main\" missing for $main","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"48":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"57":{"15":[{"message":"Type hint \"stdClass\" missing for $post","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"82":{"5":[{"message":"Expected \/\/end task()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"63":{"31":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"65":{"34":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"70":{"42":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}],"99":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"88":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"89":{"15":[{"message":"Type hint \"int\" missing for $post_id","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"87":{"8":[{"message":"Expected \"integer\" but found \"int\" for parameter type","source":"Squiz.Commenting.FunctionComment.IncorrectParamVarName","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"108":{"5":[{"message":"Expected \/\/end rename_attachment()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"114":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"115":{"15":[{"message":"Type hint \"int\" missing for $post_id","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"113":{"8":[{"message":"Expected \"integer\" but found \"int\" for parameter type","source":"Squiz.Commenting.FunctionComment.IncorrectParamVarName","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"131":{"5":[{"message":"Expected \/\/end rename_thumbnails()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"137":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"138":{"15":[{"message":"Type hint \"int\" missing for $attachment_id","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"136":{"8":[{"message":"Expected \"integer\" but found \"int\" for parameter type","source":"Squiz.Commenting.FunctionComment.IncorrectParamVarName","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"152":{"5":[{"message":"Expected \/\/end update_attachment_metadata()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"161":{"15":[{"message":"Type hint \"string\" missing for $file","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"166":{"5":[{"message":"Expected \/\/end get_transliterated_file()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"175":{"8":[{"message":"Expected \"boolean|null\" but found \"bool|null\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"177":{"15":[{"message":"Type hint \"string\" missing for $file","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"string\" missing for $new_file","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"189":{"5":[{"message":"Expected \/\/end rename_file()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"193":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"198":{"5":[{"message":"Expected \/\/end complete()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"209":{"5":[{"message":"Expected \/\/end filter_post_locale()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":160}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":51}},"Multiple statements on same line":{"values":{"no":53}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":9}},"Function opening brace placement":{"values":{"same line":9}},"Spacing before object operator":{"values":[38]},"Spacing after object operator":{"values":[38]},"Space after operator":{"values":{"1":34}},"Adjacent assignments aligned":{"values":{"yes":7}},"Single line array - comma after last item":{"values":{"no":4}},"Short array syntax used":{"values":{"yes":4}},"Control structure defined inline":{"values":{"no":12}},"Space before operator":{"values":{"1":6}},"Spacing before string concat":{"values":{"1":21}},"Spacing after string concat":{"values":{"1":21}},"PHP constant case":{"values":{"lower":5}}},"errorCount":31,"warningCount":1,"fixableCount":18,"numTokens":1604},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-converter.php":{"hash":"c9557a1c97fbbde50d578055cda47a3033188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"287":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"83":{"12":[{"message":"Type hint \"Main\" missing for $main","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"Settings\" missing for $settings","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"Post_Conversion_Process\" missing for $process_all_posts","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"Term_Conversion_Process\" missing for $process_all_terms","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"Admin_Notices\" missing for $admin_notices","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"92":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"96":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"100":{"5":[{"message":"Expected \/\/end init_hooks()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"98":{"35":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"99":{"35":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"104":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"140":{"5":[{"message":"Expected \/\/end conversion_notices()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"110":{"39":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"144":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"151":{"5":[{"message":"Expected \/\/end start_conversion()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"155":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"166":{"5":[{"message":"Expected \/\/end process_handler()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"172":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"173":{"12":[{"message":"Type hint \"array\" missing for $args","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}],"53":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"176":{"5":[{"message":"Expected \/\/end convert_existing_slugs()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"182":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"183":{"15":[{"message":"Type hint \"array\" missing for $args","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}],"61":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"234":{"5":[{"message":"Expected \/\/end convert_existing_post_slugs()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"186":{"39":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"188":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"190":{"21":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"192":{"30":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"205":{"16":[{"message":"Variable \"$wpdb\" not allowed in double quoted string; use concatenation instead","source":"Squiz.Strings.DoubleQuoteUsage.ContainsVar","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Strings\\DoubleQuoteUsageSniff","severity":0,"fixable":false},{"message":"Variable \"$regexp\" not allowed in double quoted string; use concatenation instead","source":"Squiz.Strings.DoubleQuoteUsage.ContainsVar","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Strings\\DoubleQuoteUsageSniff","severity":0,"fixable":false},{"message":"Variable \"$all_posts_sql\" not allowed in double quoted string; use concatenation instead","source":"Squiz.Strings.DoubleQuoteUsage.ContainsVar","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Strings\\DoubleQuoteUsageSniff","severity":0,"fixable":false}]},"238":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"273":{"5":[{"message":"Expected \/\/end convert_existing_term_slugs()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"245":{"17":[{"message":"Variable \"$wpdb\" not allowed in double quoted string; use concatenation instead","source":"Squiz.Strings.DoubleQuoteUsage.ContainsVar","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Strings\\DoubleQuoteUsageSniff","severity":0,"fixable":false},{"message":"Variable \"$wpdb\" not allowed in double quoted string; use concatenation instead","source":"Squiz.Strings.DoubleQuoteUsage.ContainsVar","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Strings\\DoubleQuoteUsageSniff","severity":0,"fixable":false}]},"279":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"280":{"15":[{"message":"Type hint \"string\" missing for $message","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"286":{"5":[{"message":"Expected \/\/end log()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]},"13":{"4":[{"message":"@class tag is not allowed in class comment","source":"Squiz.Commenting.ClassComment.TagNotAllowed","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClassCommentSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":226}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":59}},"Multiple statements on same line":{"values":{"no":59}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Constant name case":{"values":{"upper":2}},"Space after operator":{"values":{"1":36,"newline":1}},"Function has doc comment":{"values":{"yes":9}},"Function opening brace placement":{"values":{"same line":9}},"Spacing before object operator":{"values":[61]},"Spacing after object operator":{"values":[61]},"Adjacent assignments aligned":{"values":{"yes":3}},"Single line array - comma after last item":{"values":{"no":6}},"Short array syntax used":{"values":{"yes":9}},"Control structure defined inline":{"values":{"no":15}},"Space before operator":{"values":{"1":11}},"Spacing before string concat":{"values":{"1":11}},"Spacing after string concat":{"values":{"1":10,"newline":1}},"PHP constant case":{"values":{"lower":1}},"Multi-line array - comma after last item":{"values":{"yes":1}},"Spacing after cast statement":{"values":{"1":2}},"PHP type case":{"values":{"lower":2}}},"errorCount":41,"warningCount":2,"fixableCount":19,"numTokens":1811},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-requirements.php":{"hash":"0aac6da5549aea3fe4f18ccfad6437d533188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"235":{"5":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"46":{"16":[{"message":"Type hint \"Admin_Notices\" missing for $admin_notices","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"WP_Filesystem_Direct\" missing for $wp_filesystem","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"68":{"9":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"52":{"35":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"56":{"17":[{"message":"File is being conditionally included; use \"include_once\" instead","source":"PEAR.Files.IncludingFile.UseIncludeOnce","listener":"PHP_CodeSniffer\\Standards\\PEAR\\Sniffs\\Files\\IncludingFileSniff","severity":0,"fixable":true}]},"58":{"13":[{"message":"There must be no blank line following an inline comment","source":"Squiz.Commenting.InlineComment.SpacingAfter","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":true}]},"73":{"12":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"84":{"9":[{"message":"Expected \/\/end are_requirements_met()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"80":{"43":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"88":{"10":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"103":{"9":[{"message":"Expected \/\/end deactivate_plugin()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"108":{"12":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"121":{"9":[{"message":"Expected \/\/end is_php_version_required()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"112":{"17":[{"message":"Single line block comment not allowed; use inline (\"\/\/ text\") comment instead","source":"Squiz.Commenting.BlockComment.SingleLine","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true}]},"126":{"12":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"169":{"9":[{"message":"Expected \/\/end is_max_input_vars_required()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"150":{"21":[{"message":"Single line block comment not allowed; use inline (\"\/\/ text\") comment instead","source":"Squiz.Commenting.BlockComment.SingleLine","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true}]},"154":{"21":[{"message":"Single line block comment not allowed; use inline (\"\/\/ text\") comment instead","source":"Squiz.Commenting.BlockComment.SingleLine","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true}]},"157":{"21":[{"message":"Single line block comment not allowed; use inline (\"\/\/ text\") comment instead","source":"Squiz.Commenting.BlockComment.SingleLine","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true}]},"173":{"10":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"209":{"9":[{"message":"Expected \/\/end try_to_fix_max_input_vars()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"202":{"18":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"203":{"32":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"218":{"9":[{"message":"Expected \/\/end get_user_ini_filename()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"222":{"10":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"234":{"9":[{"message":"Expected \/\/end ask_to_increase_max_input_vars()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"232":{"17":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":186}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":58}},"Multiple statements on same line":{"values":{"no":58}},"Control structure defined inline":{"values":{"no":18}},"Space before operator":{"values":{"1":15}},"Space after operator":{"values":{"1":46}},"Spacing before string concat":{"values":{"1":5}},"Spacing after string concat":{"values":{"1":5}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":8}},"Function opening brace placement":{"values":{"same line":8}},"PHP constant case":{"values":{"lower":9}},"Spacing before object operator":{"values":[36]},"Spacing after object operator":{"values":[36]},"Assigning new by reference":{"values":{"no":2}},"Object instantiation with parenthesis":{"values":{"yes":2}},"Space between classname and parenthesis":{"values":[2]},"Single line array - comma after last item":{"values":{"no":4}},"Short array syntax used":{"values":{"yes":5}},"Adjacent assignments aligned":{"values":{"yes":6}},"Closure opening brace placement":{"values":{"same line":2}},"Spacing after cast statement":{"values":{"1":1}},"PHP type case":{"values":{"lower":1}}},"errorCount":29,"warningCount":1,"fixableCount":23,"numTokens":1711},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-main.php":{"hash":"0a502575997c4ba7233236ee1ca2ce4733188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"401":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"91":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"95":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"111":{"5":[{"message":"Expected \/\/end init()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"99":{"17":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"115":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"120":{"5":[{"message":"Expected \/\/end init_hooks()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"117":{"39":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"118":{"43":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"119":{"44":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"131":{"12":[{"message":"Type hint \"string\" missing for $title","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"string\" missing for $raw_title","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"string\" missing for $context","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"172":{"5":[{"message":"Expected \/\/end sanitize_title()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"162":{"60":[{"message":"Variable \"$wpdb\" not allowed in double quoted string; use concatenation instead","source":"Squiz.Strings.DoubleQuoteUsage.ContainsVar","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Strings\\DoubleQuoteUsageSniff","severity":0,"fixable":false}]},"179":{"8":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"181":{"15":[{"message":"Type hint \"string\" missing for $title","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"195":{"5":[{"message":"Expected \/\/end is_wc_attribute_taxonomy()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"205":{"12":[{"message":"Type hint \"string\" missing for $filename","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"string\" missing for $filename_raw","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"217":{"5":[{"message":"Expected \/\/end sanitize_filename()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"226":{"13":[{"message":"Type hint \"string\" missing for $string","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"238":{"5":[{"message":"Expected \/\/end fix_mac_string()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"230":{"16":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"248":{"15":[{"message":"Type hint \"string\" missing for $string","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"array\" missing for $table","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"265":{"5":[{"message":"Expected \/\/end split_chinese_string()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"274":{"5":[{"message":"Expected \/\/end get_filtered_table()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"283":{"12":[{"message":"Type hint \"string\" missing for $string","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"296":{"5":[{"message":"Expected \/\/end transliterate()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"303":{"8":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"313":{"5":[{"message":"Expected \/\/end is_classic_editor_plugin_active()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"310":{"9":[{"message":"There must be no blank line following an inline comment","source":"Squiz.Commenting.InlineComment.SpacingAfter","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":true}]},"321":{"8":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"343":{"5":[{"message":"Expected \/\/end is_gutenberg_editor_active()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"337":{"36":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"353":{"12":[{"message":"Type hint \"array\" missing for $data","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"array\" missing for $postarr","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}],"59":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"373":{"5":[{"message":"Expected \/\/end sanitize_post_name()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"367":{"47":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"378":{"12":[{"message":"Tag value for @see tag indented incorrectly; expected 4 spaces but found 1","source":"Generic.Commenting.DocComment.TagValueIndent","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Commenting\\DocCommentSniff","severity":0,"fixable":true}]},"381":{"8":[{"message":"Parameter tags must be defined first in a doc comment","source":"Generic.Commenting.DocComment.ParamNotFirst","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Commenting\\DocCommentSniff","severity":0,"fixable":false},{"message":"Parameter comment must start with a capital letter","source":"Squiz.Commenting.FunctionComment.ParamCommentNotCapital","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"386":{"12":[{"message":"Type hint \"string\" missing for $format","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"382":{"8":[{"message":"Parameter comment must start with a capital letter","source":"Squiz.Commenting.FunctionComment.ParamCommentNotCapital","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"400":{"5":[{"message":"Expected \/\/end prepare_in()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":323}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":113}},"Multiple statements on same line":{"values":{"no":88}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":14}},"Function opening brace placement":{"values":{"same line":14}},"Spacing before object operator":{"values":[37]},"Spacing after object operator":{"values":[37]},"Space after operator":{"values":{"1":78,"newline":1}},"Adjacent assignments aligned":{"values":{"yes":9}},"Assigning new by reference":{"values":{"no":7}},"Object instantiation with parenthesis":{"values":{"yes":7}},"Space between classname and parenthesis":{"values":[7]},"Control structure defined inline":{"values":{"no":29}},"Space before operator":{"values":{"1":33,"newline":2}},"Single line array - comma after last item":{"values":{"no":5}},"Short array syntax used":{"values":{"yes":7}},"PHP constant case":{"values":{"lower":14}},"Spacing before string concat":{"values":{"1":3}},"Spacing after string concat":{"values":{"1":3}},"Spacing after cast statement":{"values":{"1":2}},"PHP type case":{"values":{"lower":2}}},"errorCount":49,"warningCount":1,"fixableCount":28,"numTokens":2697},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-settings.php":{"hash":"4d578d7810bfbad6cb1818d057503fb333188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"768":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"73":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"80":{"5":[{"message":"Expected \/\/end __construct()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"79":{"39":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"84":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"90":{"5":[{"message":"Expected \/\/end init()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"94":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"110":{"5":[{"message":"Expected \/\/end init_hooks()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"98":{"13":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"103":{"35":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"104":{"39":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"105":{"39":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"107":{"63":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"109":{"46":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"125":{"12":[{"message":"Type hint \"array\" missing for $actions","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"string\" missing for $plugin_file","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"array\" missing for $plugin_data","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false},{"message":"Type hint \"string\" missing for $context","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"134":{"5":[{"message":"Expected \/\/end add_settings_link()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"126":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"138":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"182":{"5":[{"message":"Expected \/\/end init_locales()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"144":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"145":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"148":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"151":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"154":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"157":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"160":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"163":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"166":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"169":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"172":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"175":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"178":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"193":{"5":[{"message":"Expected \/\/end get_current_locale()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"197":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"218":{"5":[{"message":"Expected \/\/end init_form_fields()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"203":{"30":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"208":{"45":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"226":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"238":{"5":[{"message":"Expected \/\/end init_settings()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"251":{"5":[{"message":"Expected \/\/end get_form_fields()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"250":{"27":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"260":{"15":[{"message":"Type hint \"array\" missing for $field","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"266":{"5":[{"message":"Expected \/\/end set_defaults()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"270":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"279":{"5":[{"message":"Expected \/\/end add_settings_page()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"277":{"24":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"283":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"342":{"5":[{"message":"Expected \/\/end settings_page()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"346":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"360":{"5":[{"message":"Expected \/\/end setup_sections()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"356":{"17":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"366":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"367":{"12":[{"message":"Type hint \"array\" missing for $arguments","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"372":{"5":[{"message":"Expected \/\/end section_callback()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"376":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"399":{"5":[{"message":"Expected \/\/end setup_fields()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"393":{"17":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"405":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"406":{"12":[{"message":"Type hint \"array\" missing for $arguments","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"582":{"5":[{"message":"Expected \/\/end field_callback()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"439":{"45":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"462":{"29":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"463":{"44":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"464":{"46":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"466":{"44":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"467":{"50":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"468":{"50":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"469":{"50":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"470":{"50":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"471":{"50":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"473":{"44":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"496":{"29":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"497":{"45":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"498":{"51":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"499":{"51":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"529":{"29":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"530":{"45":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"531":{"51":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"532":{"51":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"592":{"12":[{"message":"Type hint \"string\" missing for $key","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"608":{"5":[{"message":"Expected \/\/end get_option()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"617":{"15":[{"message":"Type hint \"array\" missing for $field","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"619":{"5":[{"message":"Expected \/\/end get_field_default()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"626":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"627":{"12":[{"message":"Type hint \"string\" missing for $key","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"634":{"5":[{"message":"Expected \/\/end set_option()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"645":{"12":[{"message":"Type hint \"string\" missing for $option","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"669":{"5":[{"message":"Expected \/\/end pre_update_option_filter()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"673":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"693":{"5":[{"message":"Expected \/\/end admin_enqueue_scripts()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"682":{"13":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"690":{"13":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"697":{"6":[{"message":"Missing @return tag in function comment","source":"Squiz.Commenting.FunctionComment.MissingReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"704":{"5":[{"message":"Expected \/\/end load_plugin_textdomain()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"720":{"5":[{"message":"Expected \/\/end get_table()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"725":{"8":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"731":{"5":[{"message":"Expected \/\/end is_chinese_locale()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"728":{"28":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"742":{"15":[{"message":"Type hint \"array\" missing for $table","source":"Squiz.Commenting.FunctionComment.TypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"756":{"5":[{"message":"Expected \/\/end transpose_chinese_table()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"747":{"29":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"761":{"8":[{"message":"Expected \"boolean\" but found \"bool\" for function return type","source":"Squiz.Commenting.FunctionComment.InvalidReturn","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":true}]},"767":{"5":[{"message":"Expected \/\/end is_options_screen()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]},"15":{"4":[{"message":"@class tag is not allowed in class comment","source":"Squiz.Commenting.ClassComment.TagNotAllowed","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClassCommentSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":671}},"PHP short open tag used":{"values":{"no":53}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":196}},"Multiple statements on same line":{"values":{"no":139}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Constant name case":{"values":{"upper":4}},"Space after operator":{"values":{"1":156,"newline":1}},"Short array syntax used":{"values":{"yes":51}},"Function has doc comment":{"values":{"yes":26}},"Function opening brace placement":{"values":{"same line":26}},"Single line array - comma after last item":{"values":{"no":13}},"Spacing before object operator":{"values":[72]},"Spacing after object operator":{"values":[72]},"Spacing before string concat":{"values":{"1":18}},"Spacing after string concat":{"values":{"1":16,"newline":2}},"Multi-line array - comma after last item":{"values":{"yes":22}},"Control structure defined inline":{"values":{"no":40}},"Space before operator":{"values":{"1":43}},"PHP constant case":{"values":{"lower":10}},"Adjacent assignments aligned":{"values":{"yes":5}}},"errorCount":107,"warningCount":2,"fixableCount":80,"numTokens":5301},"\/home\/runner\/work\/cyr2lat\/cyr2lat\/classes\/class-conversion-tables.php":{"hash":"789faca9a24f86a4633a1899259a582b33188","errors":{"6":{"2":[{"message":"Missing @subpackage tag in file comment","source":"Squiz.Commenting.FileComment.MissingSubpackageTag","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FileCommentSniff","severity":0,"fixable":false}]},"1226":{"1":[{"message":"Expected \/\/end class","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"24":{"8":[{"message":"Parameter tags must be defined first in a doc comment","source":"Generic.Commenting.DocComment.ParamNotFirst","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Commenting\\DocCommentSniff","severity":0,"fixable":false}]},"28":{"19":[{"message":"Type hint \"string\" missing for $locale","source":"Squiz.Commenting.FunctionComment.ScalarTypeHintMissing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\FunctionCommentSniff","severity":0,"fixable":false}]},"1198":{"5":[{"message":"Expected \/\/end get()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"32":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"101":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"172":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"248":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"315":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"381":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"436":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"520":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"563":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"667":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"714":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"1119":{"26":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]},"1225":{"5":[{"message":"Expected \/\/end get_fix_table_for_mac()","source":"Squiz.Commenting.ClosingDeclarationComment.Missing","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClosingDeclarationCommentSniff","severity":0,"fixable":true}]},"1207":{"9":[{"message":"Block comments must be started with \/*","source":"Squiz.Commenting.BlockComment.WrongStart","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\BlockCommentSniff","severity":0,"fixable":true},{"message":"Inline doc block comments are not allowed; use \"\/* Comment *\/\" or \"\/\/ Comment\" instead","source":"Squiz.Commenting.InlineComment.DocBlock","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\InlineCommentSniff","severity":0,"fixable":false}]},"1219":{"16":[{"message":"Short array syntax is not allowed","source":"Generic.Arrays.DisallowShortArraySyntax.Found","listener":"PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\DisallowShortArraySyntaxSniff","severity":0,"fixable":true}]}},"warnings":{"1":{"1":[{"message":"The \"WordPress.WP.TimezoneChange\" sniff has been deprecated. Use the \"WordPress.DateTime.RestrictedFunctions\" sniff instead. Please update your custom ruleset.","source":"WordPress.WP.TimezoneChange.DeprecatedSniff","listener":"WordPressCS\\WordPress\\Sniffs\\WP\\TimezoneChangeSniff","severity":0,"fixable":false}]},"15":{"4":[{"message":"@class tag is not allowed in class comment","source":"Squiz.Commenting.ClassComment.TagNotAllowed","listener":"PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Commenting\\ClassCommentSniff","severity":0,"fixable":false}]}},"metrics":{"File has doc comment":{"values":{"yes":1}},"Line indent":{"values":{"tabs":1204}},"PHP short open tag used":{"values":{"no":1}},"PHP closing tag at end of PHP-only file":{"values":{"no":1}},"EOL char":{"values":{"\\n":1}},"Newline at EOF":{"values":{"yes":1}},"PHP keyword case":{"values":{"lower":42}},"Multiple statements on same line":{"values":{"no":27}},"Class has doc comment":{"values":{"yes":1}},"Class opening brace placement":{"values":{"same line":1}},"Function has doc comment":{"values":{"yes":2}},"Function opening brace placement":{"values":{"same line":2}},"Control structure defined inline":{"values":{"no":4}},"Space after operator":{"values":{"1":1112}},"Multi-line array - comma after last item":{"values":{"yes":13}},"Short array syntax used":{"values":{"yes":13}},"Space before operator":{"values":{"1":3}},"Spacing before object operator":{"values":[3]},"Spacing after object operator":{"values":[3]}},"errorCount":21,"warningCount":2,"fixableCount":17,"numTokens":9463}}
 
classes/background-processes/class-conversion-process.php CHANGED
@@ -92,12 +92,13 @@ class Conversion_Process extends WP_Background_Process {
92
  * Log
93
  *
94
  * @param string $message Message to log.
 
 
95
  */
96
  protected function log( $message ) {
97
  if ( defined( 'WP_DEBUG_LOG' ) && constant( 'WP_DEBUG_LOG' ) ) {
98
- // @phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_error_log
99
  error_log( 'Cyr To Lat: ' . $message );
100
- // @phpcs:enable WordPress.PHP.DevelopmentFunctions.error_log_error_log
101
  }
102
  }
103
  }
92
  * Log
93
  *
94
  * @param string $message Message to log.
95
+ *
96
+ * @noinspection ForgottenDebugOutputInspection
97
  */
98
  protected function log( $message ) {
99
  if ( defined( 'WP_DEBUG_LOG' ) && constant( 'WP_DEBUG_LOG' ) ) {
100
+ // @phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
101
  error_log( 'Cyr To Lat: ' . $message );
 
102
  }
103
  }
104
  }
classes/background-processes/class-post-conversion-process.php CHANGED
@@ -53,23 +53,24 @@ class Post_Conversion_Process extends Conversion_Process {
53
  * @param stdClass $post Queue item to iterate over.
54
  *
55
  * @return mixed
 
56
  */
57
  protected function task( $post ) {
58
  global $wpdb;
59
 
60
- $this->post = $post;
61
- $post_name = urldecode( $post->post_name );
62
 
63
  add_filter( 'locale', [ $this, 'filter_post_locale' ] );
64
- $transliterated_name = $this->main->transliterate( $post_name );
65
  remove_filter( 'locale', [ $this, 'filter_post_locale' ] );
66
 
67
- if ( $transliterated_name !== $post_name ) {
68
- update_post_meta( $post->ID, '_wp_old_slug', $post_name );
69
  // phpcs:ignore WordPress.DB.DirectDatabaseQuery
70
  $wpdb->update( $wpdb->posts, [ 'post_name' => rawurlencode( $transliterated_name ) ], [ 'ID' => $post->ID ] );
71
 
72
- $this->log( __( 'Post slug converted:', 'cyr2lat' ) . ' ' . $post_name . ' => ' . $transliterated_name );
73
 
74
  if ( 'attachment' === $post->post_type ) {
75
  $this->rename_attachment( $post->ID );
@@ -203,6 +204,7 @@ class Post_Conversion_Process extends Conversion_Process {
203
  * @return string
204
  */
205
  public function filter_post_locale() {
 
206
  $wpml_post_language_details = apply_filters( 'wpml_post_language_details', false, $this->post->ID );
207
 
208
  return isset( $wpml_post_language_details['locale'] ) ? $wpml_post_language_details['locale'] : $this->locale;
53
  * @param stdClass $post Queue item to iterate over.
54
  *
55
  * @return mixed
56
+ * @noinspection PhpParameterNameChangedDuringInheritanceInspection
57
  */
58
  protected function task( $post ) {
59
  global $wpdb;
60
 
61
+ $this->post = $post;
62
+ $decoded_post_name = urldecode( $post->post_name );
63
 
64
  add_filter( 'locale', [ $this, 'filter_post_locale' ] );
65
+ $transliterated_name = $this->main->transliterate( $decoded_post_name );
66
  remove_filter( 'locale', [ $this, 'filter_post_locale' ] );
67
 
68
+ if ( $transliterated_name !== $decoded_post_name ) {
69
+ update_post_meta( $post->ID, '_wp_old_slug', $post->post_name );
70
  // phpcs:ignore WordPress.DB.DirectDatabaseQuery
71
  $wpdb->update( $wpdb->posts, [ 'post_name' => rawurlencode( $transliterated_name ) ], [ 'ID' => $post->ID ] );
72
 
73
+ $this->log( __( 'Post slug converted:', 'cyr2lat' ) . ' ' . $decoded_post_name . ' => ' . $transliterated_name );
74
 
75
  if ( 'attachment' === $post->post_type ) {
76
  $this->rename_attachment( $post->ID );
204
  * @return string
205
  */
206
  public function filter_post_locale() {
207
+ // This is common filter for WPML and Polylang, since Polylang supports wpml_post_language_details filter.
208
  $wpml_post_language_details = apply_filters( 'wpml_post_language_details', false, $this->post->ID );
209
 
210
  return isset( $wpml_post_language_details['locale'] ) ? $wpml_post_language_details['locale'] : $this->locale;
classes/background-processes/class-term-conversion-process.php CHANGED
@@ -53,6 +53,7 @@ class Term_Conversion_Process extends Conversion_Process {
53
  * @param stdClass $term Queue item to iterate over.
54
  *
55
  * @return mixed
 
56
  */
57
  protected function task( $term ) {
58
  global $wpdb;
@@ -89,6 +90,17 @@ class Term_Conversion_Process extends Conversion_Process {
89
  * @return string
90
  */
91
  public function filter_term_locale() {
 
 
 
 
 
 
 
 
 
 
 
92
  $args = [
93
  'element_type' => $this->term->taxonomy,
94
  'element_id' => $this->term->term_taxonomy_id,
53
  * @param stdClass $term Queue item to iterate over.
54
  *
55
  * @return mixed
56
+ * @noinspection PhpParameterNameChangedDuringInheritanceInspection
57
  */
58
  protected function task( $term ) {
59
  global $wpdb;
90
  * @return string
91
  */
92
  public function filter_term_locale() {
93
+ // Polylang filter.
94
+ if ( class_exists( 'Polylang' ) ) {
95
+ $pll_pll_get_term_language = pll_get_term_language( $this->term->term_taxonomy_id );
96
+ if ( false !== $pll_pll_get_term_language ) {
97
+ return $pll_pll_get_term_language;
98
+ }
99
+
100
+ return $this->locale;
101
+ }
102
+
103
+ // WPML filter.
104
  $args = [
105
  'element_type' => $this->term->taxonomy,
106
  'element_id' => $this->term->term_taxonomy_id,
classes/class-converter.php CHANGED
@@ -20,14 +20,14 @@ class Converter {
20
  const QUERY_ARG = 'cyr-to-lat-convert';
21
 
22
  /**
23
- * Regex of prohibited chars in slugs
24
- * [^A-Za-z0-9[.apostrophe.][.underscore.][.period.][.hyphen.]]+
25
- * So, allowed chars are A-Za-z0-9[.apostrophe.][.underscore.][.period.][.hyphen.]
26
- * % is not allowed in the slug, but could present if slug is url_encoded
27
  *
28
  * @link https://dev.mysql.com/doc/refman/5.6/en/regexp.html
29
  */
30
- const PROHIBITED_CHARS_REGEX = "[^A-Za-z0-9'_\.\-]+";
31
 
32
  /**
33
  * Plugin main class.
@@ -36,13 +36,6 @@ class Converter {
36
  */
37
  private $main;
38
 
39
- /**
40
- * Plugin settings.
41
- *
42
- * @var Settings
43
- */
44
- private $settings;
45
-
46
  /**
47
  * Background process to convert posts.
48
  *
@@ -69,20 +62,18 @@ class Converter {
69
  *
70
  * @var string
71
  */
72
- private $option_group = '';
73
 
74
  /**
75
  * Converter constructor.
76
  *
77
  * @param Main $main Plugin main class.
78
- * @param Settings $settings Plugin settings.
79
  * @param Post_Conversion_Process $process_all_posts Post conversion process.
80
  * @param Term_Conversion_Process $process_all_terms Term conversion process.
81
  * @param Admin_Notices $admin_notices Admin notices.
82
  */
83
- public function __construct( $main, $settings, $process_all_posts, $process_all_terms, $admin_notices ) {
84
  $this->main = $main;
85
- $this->settings = $settings;
86
  $this->option_group = Settings::OPTION_GROUP;
87
  $this->process_all_posts = $process_all_posts;
88
  $this->process_all_terms = $process_all_terms;
@@ -143,7 +134,7 @@ class Converter {
143
  * Check if we have to start conversion and start it.
144
  */
145
  public function start_conversion() {
146
- if ( ! isset( $_POST['cyr2lat-convert'] ) ) {
147
  return;
148
  }
149
  check_admin_referer( $this->option_group . '-options' );
@@ -154,7 +145,7 @@ class Converter {
154
  * Process handler.
155
  */
156
  public function process_handler() {
157
- if ( ! isset( $_GET[ self::QUERY_ARG ] ) || ! isset( $_GET['_wpnonce'] ) ) {
158
  return;
159
  }
160
 
@@ -192,17 +183,17 @@ class Converter {
192
  'post_status' => [ 'publish', 'future', 'private' ],
193
  ];
194
 
195
- $args = wp_parse_args( $args, $defaults );
196
 
197
- $regexp = $wpdb->prepare( '%s', self::PROHIBITED_CHARS_REGEX );
198
 
199
  $post_sql =
200
- 'post_status IN (' . $this->main->prepare_in( $args['post_status'] ) . ')' .
201
- ' AND post_type IN (' . $this->main->prepare_in( $args['post_type'] ) . ')';
202
  $media_sql = "post_status = 'inherit' AND post_type = 'attachment'";
203
  $all_posts_sql = '(' . $post_sql . ') OR (' . $media_sql . ')';
204
 
205
- $sql = "SELECT ID, post_name, post_type FROM $wpdb->posts WHERE post_name REGEXP($regexp) AND ($all_posts_sql)";
206
 
207
  // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
208
  // phpcs:ignore WordPress.DB.DirectDatabaseQuery
@@ -218,19 +209,17 @@ class Converter {
218
  return;
219
  }
220
 
221
- if ( $posts ) {
222
- foreach ( (array) $posts as $post ) {
223
- $this->process_all_posts->push_to_queue( $post );
224
- }
225
 
226
- $this->log( __( 'Post slugs conversion started.', 'cyr2lat' ) );
227
- $this->admin_notices->add_notice(
228
- __( 'Cyr To Lat started conversion of existing post slugs.', 'cyr2lat' ),
229
- 'notice notice-info is-dismissible'
230
- );
231
 
232
- $this->process_all_posts->save()->dispatch();
233
- }
234
  }
235
 
236
  /**
@@ -243,8 +232,8 @@ class Converter {
243
  $terms = $wpdb->get_results(
244
  $wpdb->prepare(
245
  "SELECT t.term_id, slug, tt.taxonomy, tt.term_taxonomy_id FROM $wpdb->terms t, $wpdb->term_taxonomy tt
246
- WHERE t.slug REGEXP(%s) AND tt.term_id = t.term_id",
247
- self::PROHIBITED_CHARS_REGEX
248
  )
249
  );
250
 
@@ -257,31 +246,30 @@ class Converter {
257
  return;
258
  }
259
 
260
- if ( $terms ) {
261
- foreach ( (array) $terms as $term ) {
262
- $this->process_all_terms->push_to_queue( $term );
263
- }
264
 
265
- $this->log( __( 'Term slugs conversion started.', 'cyr2lat' ) );
266
- $this->admin_notices->add_notice(
267
- __( 'Cyr To Lat started conversion of existing term slugs.', 'cyr2lat' ),
268
- 'notice notice-info is-dismissible'
269
- );
270
 
271
- $this->process_all_terms->save()->dispatch();
272
- }
273
  }
274
 
275
  /**
276
  * Log.
277
  *
278
  * @param string $message Message to log.
 
 
279
  */
280
  protected function log( $message ) {
281
  if ( defined( 'WP_DEBUG_LOG' ) && constant( 'WP_DEBUG_LOG' ) ) {
282
- // @phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_error_log
283
  error_log( 'Cyr To Lat: ' . $message );
284
- // @phpcs:enable WordPress.PHP.DevelopmentFunctions.error_log_error_log
285
  }
286
  }
287
  }
20
  const QUERY_ARG = 'cyr-to-lat-convert';
21
 
22
  /**
23
+ * Regex of allowed chars in lower-cased slugs.
24
+ *
25
+ * Allowed chars are a-z, 0-9, [.apostrophe.], [.hyphen.], [.period.], [.underscore.],
26
+ * or any url-encoded character in the range \x20-x7F.
27
  *
28
  * @link https://dev.mysql.com/doc/refman/5.6/en/regexp.html
29
  */
30
+ const ALLOWED_CHARS_REGEX = "^([a-z0-9\'-._]|%[2-7][0-F])+$";
31
 
32
  /**
33
  * Plugin main class.
36
  */
37
  private $main;
38
 
 
 
 
 
 
 
 
39
  /**
40
  * Background process to convert posts.
41
  *
62
  *
63
  * @var string
64
  */
65
+ private $option_group;
66
 
67
  /**
68
  * Converter constructor.
69
  *
70
  * @param Main $main Plugin main class.
 
71
  * @param Post_Conversion_Process $process_all_posts Post conversion process.
72
  * @param Term_Conversion_Process $process_all_terms Term conversion process.
73
  * @param Admin_Notices $admin_notices Admin notices.
74
  */
75
+ public function __construct( $main, $process_all_posts, $process_all_terms, $admin_notices ) {
76
  $this->main = $main;
 
77
  $this->option_group = Settings::OPTION_GROUP;
78
  $this->process_all_posts = $process_all_posts;
79
  $this->process_all_terms = $process_all_terms;
134
  * Check if we have to start conversion and start it.
135
  */
136
  public function start_conversion() {
137
+ if ( ! isset( $_POST['ctl-convert'] ) ) {
138
  return;
139
  }
140
  check_admin_referer( $this->option_group . '-options' );
145
  * Process handler.
146
  */
147
  public function process_handler() {
148
+ if ( ! isset( $_GET[ self::QUERY_ARG ], $_GET['_wpnonce'] ) ) {
149
  return;
150
  }
151
 
183
  'post_status' => [ 'publish', 'future', 'private' ],
184
  ];
185
 
186
+ $parsed_args = wp_parse_args( $args, $defaults );
187
 
188
+ $regexp = $wpdb->prepare( '%s', self::ALLOWED_CHARS_REGEX );
189
 
190
  $post_sql =
191
+ 'post_status IN (' . $this->main->prepare_in( $parsed_args['post_status'] ) . ')' .
192
+ ' AND post_type IN (' . $this->main->prepare_in( $parsed_args['post_type'] ) . ')';
193
  $media_sql = "post_status = 'inherit' AND post_type = 'attachment'";
194
  $all_posts_sql = '(' . $post_sql . ') OR (' . $media_sql . ')';
195
 
196
+ $sql = "SELECT ID, post_name, post_type FROM $wpdb->posts WHERE LOWER(post_name) NOT REGEXP($regexp) AND ($all_posts_sql)";
197
 
198
  // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
199
  // phpcs:ignore WordPress.DB.DirectDatabaseQuery
209
  return;
210
  }
211
 
212
+ foreach ( (array) $posts as $post ) {
213
+ $this->process_all_posts->push_to_queue( $post );
214
+ }
 
215
 
216
+ $this->log( __( 'Post slugs conversion started.', 'cyr2lat' ) );
217
+ $this->admin_notices->add_notice(
218
+ __( 'Cyr To Lat started conversion of existing post slugs.', 'cyr2lat' ),
219
+ 'notice notice-info is-dismissible'
220
+ );
221
 
222
+ $this->process_all_posts->save()->dispatch();
 
223
  }
224
 
225
  /**
232
  $terms = $wpdb->get_results(
233
  $wpdb->prepare(
234
  "SELECT t.term_id, slug, tt.taxonomy, tt.term_taxonomy_id FROM $wpdb->terms t, $wpdb->term_taxonomy tt
235
+ WHERE LOWER(t.slug) NOT REGEXP(%s) AND tt.term_id = t.term_id",
236
+ self::ALLOWED_CHARS_REGEX
237
  )
238
  );
239
 
246
  return;
247
  }
248
 
249
+ foreach ( (array) $terms as $term ) {
250
+ $this->process_all_terms->push_to_queue( $term );
251
+ }
 
252
 
253
+ $this->log( __( 'Term slugs conversion started.', 'cyr2lat' ) );
254
+ $this->admin_notices->add_notice(
255
+ __( 'Cyr To Lat started conversion of existing term slugs.', 'cyr2lat' ),
256
+ 'notice notice-info is-dismissible'
257
+ );
258
 
259
+ $this->process_all_terms->save()->dispatch();
 
260
  }
261
 
262
  /**
263
  * Log.
264
  *
265
  * @param string $message Message to log.
266
+ *
267
+ * @noinspection ForgottenDebugOutputInspection
268
  */
269
  protected function log( $message ) {
270
  if ( defined( 'WP_DEBUG_LOG' ) && constant( 'WP_DEBUG_LOG' ) ) {
271
+ // @phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
272
  error_log( 'Cyr To Lat: ' . $message );
 
273
  }
274
  }
275
  }
classes/class-main.php CHANGED
@@ -65,6 +65,13 @@ class Main {
65
  */
66
  protected $acf;
67
 
 
 
 
 
 
 
 
68
  /**
69
  * Main constructor.
70
  */
@@ -75,7 +82,6 @@ class Main {
75
  $this->admin_notices = new Admin_Notices();
76
  $this->converter = new Converter(
77
  $this,
78
- $this->settings,
79
  $this->process_all_posts,
80
  $this->process_all_terms,
81
  $this->admin_notices
@@ -92,6 +98,8 @@ class Main {
92
 
93
  /**
94
  * Init class.
 
 
95
  */
96
  public function init() {
97
  if ( defined( 'WP_CLI' ) && constant( 'WP_CLI' ) ) {
@@ -117,6 +125,10 @@ class Main {
117
  add_filter( 'sanitize_title', [ $this, 'sanitize_title' ], 9, 3 );
118
  add_filter( 'sanitize_file_name', [ $this, 'sanitize_filename' ], 10, 2 );
119
  add_filter( 'wp_insert_post_data', [ $this, 'sanitize_post_name' ], 10, 2 );
 
 
 
 
120
  }
121
 
122
  /**
@@ -127,6 +139,7 @@ class Main {
127
  * @param string $context The context for which the title is being sanitized.
128
  *
129
  * @return string
 
130
  */
131
  public function sanitize_title( $title, $raw_title = '', $context = '' ) {
132
  global $wpdb;
@@ -201,6 +214,7 @@ class Main {
201
  * @param string $filename_raw The filename prior to sanitization.
202
  *
203
  * @return string
 
204
  */
205
  public function sanitize_filename( $filename, $filename_raw ) {
206
  $pre = apply_filters( 'ctl_pre_sanitize_filename', false, $filename );
@@ -289,7 +303,7 @@ class Main {
289
 
290
  if ( function_exists( 'iconv' ) ) {
291
  $new_string = iconv( 'UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string );
292
- $string = $new_string ? $new_string : $string;
293
  }
294
 
295
  return $string;
@@ -301,6 +315,7 @@ class Main {
301
  * @link https://kagg.eu/how-to-catch-gutenberg/
302
  *
303
  * @return bool
 
304
  */
305
  private function is_classic_editor_plugin_active() {
306
  // @codeCoverageIgnoreStart
@@ -349,6 +364,7 @@ class Main {
349
  * @param array $postarr An array of sanitized, but otherwise unmodified post data.
350
  *
351
  * @return mixed
 
352
  */
353
  public function sanitize_post_name( $data, $postarr = [] ) {
354
  global $current_screen;
@@ -372,6 +388,85 @@ class Main {
372
  return $data;
373
  }
374
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
375
  /**
376
  * Changes array of items into string of items, separated by comma and sql-escaped
377
  *
65
  */
66
  protected $acf;
67
 
68
+ /**
69
+ * Polylang locale.
70
+ *
71
+ * @var string
72
+ */
73
+ private $pll_locale = false;
74
+
75
  /**
76
  * Main constructor.
77
  */
82
  $this->admin_notices = new Admin_Notices();
83
  $this->converter = new Converter(
84
  $this,
 
85
  $this->process_all_posts,
86
  $this->process_all_terms,
87
  $this->admin_notices
98
 
99
  /**
100
  * Init class.
101
+ *
102
+ * @noinspection PhpUndefinedClassInspection
103
  */
104
  public function init() {
105
  if ( defined( 'WP_CLI' ) && constant( 'WP_CLI' ) ) {
125
  add_filter( 'sanitize_title', [ $this, 'sanitize_title' ], 9, 3 );
126
  add_filter( 'sanitize_file_name', [ $this, 'sanitize_filename' ], 10, 2 );
127
  add_filter( 'wp_insert_post_data', [ $this, 'sanitize_post_name' ], 10, 2 );
128
+
129
+ if ( class_exists( 'Polylang' ) ) {
130
+ add_filter( 'locale', [ $this, 'pll_locale_filter' ] );
131
+ }
132
  }
133
 
134
  /**
139
  * @param string $context The context for which the title is being sanitized.
140
  *
141
  * @return string
142
+ * @noinspection PhpUnusedParameterInspection
143
  */
144
  public function sanitize_title( $title, $raw_title = '', $context = '' ) {
145
  global $wpdb;
214
  * @param string $filename_raw The filename prior to sanitization.
215
  *
216
  * @return string
217
+ * @noinspection PhpUnusedParameterInspection
218
  */
219
  public function sanitize_filename( $filename, $filename_raw ) {
220
  $pre = apply_filters( 'ctl_pre_sanitize_filename', false, $filename );
303
 
304
  if ( function_exists( 'iconv' ) ) {
305
  $new_string = iconv( 'UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string );
306
+ return $new_string ?: $string;
307
  }
308
 
309
  return $string;
315
  * @link https://kagg.eu/how-to-catch-gutenberg/
316
  *
317
  * @return bool
318
+ * @noinspection PhpIncludeInspection
319
  */
320
  private function is_classic_editor_plugin_active() {
321
  // @codeCoverageIgnoreStart
364
  * @param array $postarr An array of sanitized, but otherwise unmodified post data.
365
  *
366
  * @return mixed
367
+ * @noinspection PhpUnusedParameterInspection
368
  */
369
  public function sanitize_post_name( $data, $postarr = [] ) {
370
  global $current_screen;
388
  return $data;
389
  }
390
 
391
+ /**
392
+ * Locale filter for Polylang.
393
+ *
394
+ * @param string $locale Locale.
395
+ *
396
+ * @return string
397
+ */
398
+ public function pll_locale_filter( $locale ) {
399
+ if ( $this->pll_locale ) {
400
+ return $this->pll_locale;
401
+ }
402
+
403
+ if ( defined( 'REST_REQUEST' ) && constant( 'REST_REQUEST' ) ) {
404
+ $rest_server = rest_get_server();
405
+ $data = json_decode( $rest_server::get_raw_data(), false );
406
+ if ( isset( $data->lang ) ) {
407
+ $this->pll_locale = $data->lang;
408
+
409
+ return $this->pll_locale;
410
+ }
411
+
412
+ return $locale;
413
+ }
414
+
415
+ if ( ! is_admin() ) {
416
+ return $locale;
417
+ }
418
+
419
+ $pll_get_post_language = false;
420
+
421
+ // phpcs:disable WordPress.Security.NonceVerification.Missing
422
+ // phpcs:disable WordPress.Security.NonceVerification.Recommended
423
+ if ( isset( $_POST['post_ID'] ) ) {
424
+ $pll_get_post_language = pll_get_post_language(
425
+ (int) filter_input( INPUT_POST, 'post_ID', FILTER_SANITIZE_STRING )
426
+ );
427
+ }
428
+ if ( isset( $_POST['pll_post_id'] ) ) {
429
+ $pll_get_post_language = pll_get_post_language(
430
+ (int) filter_input( INPUT_POST, 'pll_post_id', FILTER_SANITIZE_STRING )
431
+ );
432
+ }
433
+ if ( isset( $_GET['post'] ) ) {
434
+ $pll_get_post_language = pll_get_post_language(
435
+ (int) filter_input( INPUT_GET, 'post', FILTER_SANITIZE_STRING )
436
+ );
437
+ }
438
+ // phpcs:enable WordPress.Security.NonceVerification.Recommended
439
+ // phpcs:enable WordPress.Security.NonceVerification.Missing
440
+
441
+ if ( false !== $pll_get_post_language ) {
442
+ $this->pll_locale = $pll_get_post_language;
443
+
444
+ return $this->pll_locale;
445
+ }
446
+
447
+ $pll_get_term_language = false;
448
+
449
+ // phpcs:disable WordPress.Security.NonceVerification.Missing
450
+ if ( isset( $_POST['term_lang_choice'] ) ) {
451
+ $pll_get_language = PLL()->model->get_language(
452
+ filter_input( INPUT_POST, 'term_lang_choice', FILTER_SANITIZE_STRING )
453
+ );
454
+
455
+ if ( $pll_get_language ) {
456
+ $pll_get_term_language = $pll_get_language->slug;
457
+ }
458
+ }
459
+ // phpcs:enable WordPress.Security.NonceVerification.Missing
460
+
461
+ if ( false !== $pll_get_term_language ) {
462
+ $this->pll_locale = $pll_get_term_language;
463
+
464
+ return $this->pll_locale;
465
+ }
466
+
467
+ return $locale;
468
+ }
469
+
470
  /**
471
  * Changes array of items into string of items, separated by comma and sql-escaped
472
  *
classes/class-requirements.php CHANGED
@@ -42,6 +42,8 @@ if ( ! class_exists( __NAMESPACE__ . '\Requirements' ) ) {
42
  *
43
  * @param Admin_Notices $admin_notices Admin notices.
44
  * @param WP_Filesystem_Direct $wp_filesystem File system.
 
 
45
  */
46
  public function __construct( $admin_notices = null, $wp_filesystem = null ) {
47
  $this->admin_notices = $admin_notices;
@@ -106,6 +108,7 @@ if ( ! class_exists( __NAMESPACE__ . '\Requirements' ) ) {
106
  * Check php version.
107
  *
108
  * @return bool
 
109
  */
110
  private function is_php_version_required() {
111
  if ( version_compare( constant( 'CYR_TO_LAT_MINIMUM_PHP_REQUIRED_VERSION' ), phpversion(), '>' ) ) {
@@ -143,7 +146,7 @@ if ( ! class_exists( __NAMESPACE__ . '\Requirements' ) ) {
143
 
144
  if ( constant( 'CYR_TO_LAT_REQUIRED_MAX_INPUT_VARS' ) > ini_get( 'max_input_vars' ) ) {
145
  $mtime = $this->wp_filesystem->mtime( $this->get_user_ini_filename() );
146
- $ini_ttl = intval( ini_get( 'user_ini.cache_ttl' ) );
147
  $time_left = ( $mtime + $ini_ttl ) - time();
148
 
149
  if ( 0 < $time_left ) {
@@ -176,12 +179,11 @@ if ( ! class_exists( __NAMESPACE__ . '\Requirements' ) ) {
176
 
177
  $content = $this->wp_filesystem->get_contents( $user_ini_filename );
178
 
179
- $content = str_replace( "\r\n", "\n", $content );
180
- $content = str_replace( "\r", "\n", $content );
181
  $content_arr = explode( "\n", $content );
182
 
183
  array_map(
184
- function ( $line ) use ( &$value ) {
185
  if ( preg_match( '/(?<![; ])\s*?(max_input_vars).*?=\D*?(\d+)/i', $line, $matches ) ) {
186
  $value = (int) $matches[2];
187
  }
@@ -195,7 +197,7 @@ if ( ! class_exists( __NAMESPACE__ . '\Requirements' ) ) {
195
 
196
  $content_arr = array_filter(
197
  $content_arr,
198
- function ( $line ) {
199
  return false === strpos( $line, 'max_input_vars' );
200
  }
201
  );
42
  *
43
  * @param Admin_Notices $admin_notices Admin notices.
44
  * @param WP_Filesystem_Direct $wp_filesystem File system.
45
+ *
46
+ * @noinspection PhpIncludeInspection
47
  */
48
  public function __construct( $admin_notices = null, $wp_filesystem = null ) {
49
  $this->admin_notices = $admin_notices;
108
  * Check php version.
109
  *
110
  * @return bool
111
+ * @noinspection ConstantCanBeUsedInspection
112
  */
113
  private function is_php_version_required() {
114
  if ( version_compare( constant( 'CYR_TO_LAT_MINIMUM_PHP_REQUIRED_VERSION' ), phpversion(), '>' ) ) {
146
 
147
  if ( constant( 'CYR_TO_LAT_REQUIRED_MAX_INPUT_VARS' ) > ini_get( 'max_input_vars' ) ) {
148
  $mtime = $this->wp_filesystem->mtime( $this->get_user_ini_filename() );
149
+ $ini_ttl = (int) ini_get( 'user_ini.cache_ttl' );
150
  $time_left = ( $mtime + $ini_ttl ) - time();
151
 
152
  if ( 0 < $time_left ) {
179
 
180
  $content = $this->wp_filesystem->get_contents( $user_ini_filename );
181
 
182
+ $content = str_replace( [ "\r\n", "\r" ], "\n", $content );
 
183
  $content_arr = explode( "\n", $content );
184
 
185
  array_map(
186
+ static function ( $line ) use ( &$value ) {
187
  if ( preg_match( '/(?<![; ])\s*?(max_input_vars).*?=\D*?(\d+)/i', $line, $matches ) ) {
188
  $value = (int) $matches[2];
189
  }
197
 
198
  $content_arr = array_filter(
199
  $content_arr,
200
+ static function ( $line ) {
201
  return false === strpos( $line, 'max_input_vars' );
202
  }
203
  );
classes/class-settings.php CHANGED
@@ -18,52 +18,47 @@ class Settings {
18
 
19
  /**
20
  * Admin screen id.
21
- *
22
- * @var string
23
  */
24
  const SCREEN_ID = 'settings_page_cyr-to-lat';
25
 
26
  /**
27
  * Option group.
28
- *
29
- * @var string
30
  */
31
  const OPTION_GROUP = 'cyr_to_lat_group';
32
 
33
  /**
34
  * Option page.
35
- *
36
- * @var string
37
  */
38
  const PAGE = 'cyr-to-lat';
39
 
40
  /**
41
  * Plugin options name.
42
- *
43
- * @var string
44
  */
45
  const OPTION_NAME = 'cyr_to_lat_settings';
46
 
47
  /**
48
- * Form fields.
49
- *
50
- * @var array
51
  */
52
- public $form_fields;
53
 
54
  /**
55
- * Plugin options.
 
 
 
 
 
56
  *
57
  * @var array
58
  */
59
- public $settings;
60
 
61
  /**
62
  * Plugin options.
63
  *
64
  * @var array
65
  */
66
- private $options;
67
 
68
  /**
69
  * Served locales.
@@ -107,6 +102,7 @@ class Settings {
107
  add_filter( 'pre_update_option_' . self::OPTION_NAME, [ $this, 'pre_update_option_filter' ], 10, 3 );
108
 
109
  add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] );
 
110
  }
111
 
112
  /**
@@ -121,6 +117,7 @@ class Settings {
121
  * 'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'.
122
  *
123
  * @return array|mixed Plugin links
 
124
  */
125
  public function add_settings_link( $actions, $plugin_file, $plugin_data, $context ) {
126
  $ctl_actions = [
@@ -189,7 +186,7 @@ class Settings {
189
  private function get_current_locale() {
190
  $current_locale = get_locale();
191
 
192
- return in_array( $current_locale, array_keys( $this->locales ), true ) ? $current_locale : 'iso9';
193
  }
194
 
195
  /**
@@ -304,31 +301,15 @@ class Settings {
304
  </form>
305
 
306
  <form id="ctl-convert-existing-slugs" action="" method="post">
 
307
  <?php
308
  wp_nonce_field( self::OPTION_GROUP . '-options' );
309
- submit_button( __( 'Convert Existing Slugs', 'cyr2lat' ), 'secondary', 'cyr2lat-convert' );
310
  ?>
311
  </form>
312
 
313
- <div id="donate">
314
  <h2>
315
- <?php echo esc_html( __( 'Donate', 'cyr2lat' ) ); ?>
316
- </h2>
317
- <p>
318
- <?php echo esc_html( __( 'Would you like to support the advancement of this plugin?', 'cyr2lat' ) ); ?>
319
- </p>
320
- <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
321
- <input type="hidden" name="cmd" value="_s-xclick">
322
- <input type="hidden" name="hosted_button_id" value="BENCPARA8S224">
323
- <input
324
- type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif"
325
- name="submit" alt="PayPal - The safer, easier way to pay online!">
326
- <img
327
- alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1"
328
- height="1">
329
- </form>
330
-
331
- <h2 id="appreciation">
332
  <?php echo esc_html( __( 'Your appreciation', 'cyr2lat' ) ); ?>
333
  </h2>
334
  <a
@@ -381,9 +362,6 @@ class Settings {
381
 
382
  register_setting( self::OPTION_GROUP, self::OPTION_NAME );
383
 
384
- // Get current settings.
385
- $this->options = get_option( self::OPTION_NAME );
386
-
387
  foreach ( $this->form_fields as $key => $field ) {
388
  $field['field_id'] = $key;
389
 
@@ -508,10 +486,8 @@ class Settings {
508
  $options_markup = '';
509
  foreach ( $arguments['options'] as $key => $label ) {
510
  $selected = '';
511
- if ( is_array( $value ) ) {
512
- if ( in_array( $key, $value, true ) ) {
513
- $selected = selected( $key, $key, false );
514
- }
515
  }
516
  $options_markup .= sprintf(
517
  '<option value="%s" %s>%s</option>',
@@ -600,7 +576,7 @@ class Settings {
600
  $this->settings[ $key ] = isset( $form_fields[ $key ] ) ? $this->get_field_default( $form_fields[ $key ] ) : '';
601
  }
602
 
603
- if ( ! is_null( $empty_value ) && '' === $this->settings[ $key ] ) {
604
  $this->settings[ $key ] = $empty_value;
605
  }
606
 
@@ -641,6 +617,7 @@ class Settings {
641
  * @param string $option Option name.
642
  *
643
  * @return mixed
 
644
  */
645
  public function pre_update_option_filter( $value, $old_value, $option ) {
646
  if ( $value === $old_value ) {
@@ -654,14 +631,10 @@ class Settings {
654
 
655
  $form_fields = $this->get_form_fields();
656
  foreach ( $form_fields as $key => $form_field ) {
657
- switch ( $form_field['type'] ) {
658
- case 'checkbox':
659
- $form_field_value = isset( $value[ $key ] ) ? $value[ $key ] : 'no';
660
- $form_field_value = '1' === $form_field_value || 'yes' === $form_field_value ? 'yes' : 'no';
661
- $value[ $key ] = $form_field_value;
662
- break;
663
- default:
664
- break;
665
  }
666
  }
667
 
@@ -677,21 +650,65 @@ class Settings {
677
  }
678
 
679
  wp_enqueue_script(
680
- 'cyr-to-lat-settings',
681
  constant( 'CYR_TO_LAT_URL' ) . '/dist/js/settings/app.js',
682
  [],
683
  constant( 'CYR_TO_LAT_VERSION' ),
684
  true
685
  );
686
 
 
 
 
 
 
 
 
 
 
687
  wp_enqueue_style(
688
- 'cyr-to-lat-admin',
689
  constant( 'CYR_TO_LAT_URL' ) . '/css/cyr-to-lat-admin.css',
690
  [],
691
  constant( 'CYR_TO_LAT_VERSION' )
692
  );
693
  }
694
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
695
  /**
696
  * Load plugin text domain.
697
  */
18
 
19
  /**
20
  * Admin screen id.
 
 
21
  */
22
  const SCREEN_ID = 'settings_page_cyr-to-lat';
23
 
24
  /**
25
  * Option group.
 
 
26
  */
27
  const OPTION_GROUP = 'cyr_to_lat_group';
28
 
29
  /**
30
  * Option page.
 
 
31
  */
32
  const PAGE = 'cyr-to-lat';
33
 
34
  /**
35
  * Plugin options name.
 
 
36
  */
37
  const OPTION_NAME = 'cyr_to_lat_settings';
38
 
39
  /**
40
+ * Script handle.
 
 
41
  */
42
+ const HANDLE = 'cyr-to-lat-settings';
43
 
44
  /**
45
+ * Script localization object.
46
+ */
47
+ const OBJECT = 'Cyr2LatSettingsObject';
48
+
49
+ /**
50
+ * Form fields.
51
  *
52
  * @var array
53
  */
54
+ public $form_fields;
55
 
56
  /**
57
  * Plugin options.
58
  *
59
  * @var array
60
  */
61
+ public $settings;
62
 
63
  /**
64
  * Served locales.
102
  add_filter( 'pre_update_option_' . self::OPTION_NAME, [ $this, 'pre_update_option_filter' ], 10, 3 );
103
 
104
  add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] );
105
+ add_action( 'in_admin_header', [ $this, 'in_admin_header' ] );
106
  }
107
 
108
  /**
117
  * 'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'.
118
  *
119
  * @return array|mixed Plugin links
120
+ * @noinspection PhpUnusedParameterInspection
121
  */
122
  public function add_settings_link( $actions, $plugin_file, $plugin_data, $context ) {
123
  $ctl_actions = [
186
  private function get_current_locale() {
187
  $current_locale = get_locale();
188
 
189
+ return array_key_exists( $current_locale, $this->locales ) ? $current_locale : 'iso9';
190
  }
191
 
192
  /**
301
  </form>
302
 
303
  <form id="ctl-convert-existing-slugs" action="" method="post">
304
+ <input type="hidden" name="ctl-convert" />
305
  <?php
306
  wp_nonce_field( self::OPTION_GROUP . '-options' );
307
+ submit_button( __( 'Convert Existing Slugs', 'cyr2lat' ), 'secondary', 'ctl-convert-button' );
308
  ?>
309
  </form>
310
 
311
+ <div id="appreciation">
312
  <h2>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
  <?php echo esc_html( __( 'Your appreciation', 'cyr2lat' ) ); ?>
314
  </h2>
315
  <a
362
 
363
  register_setting( self::OPTION_GROUP, self::OPTION_NAME );
364
 
 
 
 
365
  foreach ( $this->form_fields as $key => $field ) {
366
  $field['field_id'] = $key;
367
 
486
  $options_markup = '';
487
  foreach ( $arguments['options'] as $key => $label ) {
488
  $selected = '';
489
+ if ( is_array( $value ) && in_array( $key, $value, true ) ) {
490
+ $selected = selected( $key, $key, false );
 
 
491
  }
492
  $options_markup .= sprintf(
493
  '<option value="%s" %s>%s</option>',
576
  $this->settings[ $key ] = isset( $form_fields[ $key ] ) ? $this->get_field_default( $form_fields[ $key ] ) : '';
577
  }
578
 
579
+ if ( '' === $this->settings[ $key ] && ! is_null( $empty_value ) ) {
580
  $this->settings[ $key ] = $empty_value;
581
  }
582
 
617
  * @param string $option Option name.
618
  *
619
  * @return mixed
620
+ * @noinspection PhpUnusedParameterInspection
621
  */
622
  public function pre_update_option_filter( $value, $old_value, $option ) {
623
  if ( $value === $old_value ) {
631
 
632
  $form_fields = $this->get_form_fields();
633
  foreach ( $form_fields as $key => $form_field ) {
634
+ if ( 'checkbox' === $form_field['type'] ) {
635
+ $form_field_value = isset( $value[ $key ] ) ? $value[ $key ] : 'no';
636
+ $form_field_value = '1' === $form_field_value || 'yes' === $form_field_value ? 'yes' : 'no';
637
+ $value[ $key ] = $form_field_value;
 
 
 
 
638
  }
639
  }
640
 
650
  }
651
 
652
  wp_enqueue_script(
653
+ self::HANDLE,
654
  constant( 'CYR_TO_LAT_URL' ) . '/dist/js/settings/app.js',
655
  [],
656
  constant( 'CYR_TO_LAT_VERSION' ),
657
  true
658
  );
659
 
660
+ wp_localize_script(
661
+ self::HANDLE,
662
+ self::OBJECT,
663
+ [
664
+ 'optionsSaveSuccessMessage' => __( 'Options saved.', 'cyr2lat' ),
665
+ 'optionsSaveErrorMessage' => __( 'Error saving options.', 'cyr2lat' ),
666
+ ]
667
+ );
668
+
669
  wp_enqueue_style(
670
+ self::HANDLE,
671
  constant( 'CYR_TO_LAT_URL' ) . '/css/cyr-to-lat-admin.css',
672
  [],
673
  constant( 'CYR_TO_LAT_VERSION' )
674
  );
675
  }
676
 
677
+ /**
678
+ * Output convert confirmation popup.
679
+ */
680
+ public function in_admin_header() {
681
+ if ( ! $this->is_options_screen() ) {
682
+ return;
683
+ }
684
+
685
+ ?>
686
+ <div id="ctl-confirm-popup">
687
+ <div id="ctl-confirm-content">
688
+ <p>
689
+ <strong><?php esc_html_e( 'Important:', 'cyr2lat' ); ?></strong>
690
+ <?php
691
+ esc_html_e(
692
+ 'This operation is irreversible. Please make sure that you have made backup copy of your database.',
693
+ 'cyr2lat'
694
+ );
695
+ ?>
696
+ </p>
697
+ <p><?php esc_html_e( 'Are you sure to continue?', 'cyr2lat' ); ?></p>
698
+ <div id="ctl-confirm-buttons">
699
+ <input
700
+ type="button" id="ctl-confirm-ok" class="button button-primary"
701
+ value="<?php esc_html_e( 'OK', 'cyr2lat' ); ?>">
702
+ <button
703
+ type="button" id="ctl-confirm-cancel" class="button button-secondary">
704
+ <?php esc_html_e( 'Cancel', 'cyr2lat' ); ?>
705
+ </button>
706
+ </div>
707
+ </div>
708
+ </div>
709
+ <?php
710
+ }
711
+
712
  /**
713
  * Load plugin text domain.
714
  */
classes/class-wp-cli.php CHANGED
@@ -6,6 +6,9 @@
6
  * @link https://github.com/mihdan/wp-rocket-cli/blob/master/command.php
7
  */
8
 
 
 
 
9
  namespace Cyr_To_Lat;
10
 
11
  use cli\progress\Bar;
@@ -49,6 +52,8 @@ class WP_CLI extends WP_CLI_Command {
49
  *
50
  * @param array $args Arguments.
51
  * @param array $assoc_args Arguments in associative array.
 
 
52
  */
53
  public function regenerate( $args = [], $assoc_args = [] ) {
54
 
6
  * @link https://github.com/mihdan/wp-rocket-cli/blob/master/command.php
7
  */
8
 
9
+ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
10
+ /** @noinspection PhpUndefinedClassInspection */
11
+
12
  namespace Cyr_To_Lat;
13
 
14
  use cli\progress\Bar;
52
  *
53
  * @param array $args Arguments.
54
  * @param array $assoc_args Arguments in associative array.
55
+ *
56
+ * @noinspection PhpUnusedParameterInspection
57
  */
58
  public function regenerate( $args = [], $assoc_args = [] ) {
59
 
css/cyr-to-lat-admin.css CHANGED
@@ -132,10 +132,31 @@ body.js #ctl-options .ctl-table {
132
  outline: none;
133
  }
134
 
135
- #donate {
136
  clear: both;
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  @media screen and (max-width: 767px) {
140
  .ctl-table-cell label {
141
  width: 2.2em;
132
  outline: none;
133
  }
134
 
135
+ #appreciation {
136
  clear: both;
137
  }
138
 
139
+ #ctl-confirm-popup {
140
+ display: none;
141
+ position: fixed;
142
+ left: 0;
143
+ right: 0;
144
+ top: 0;
145
+ bottom: 0;
146
+ background: rgba(241,241,241,0.8);
147
+ z-index: 9999;
148
+ }
149
+
150
+ #ctl-confirm-content {
151
+ display: block;
152
+ position: fixed;
153
+ left: 50%;
154
+ top: 50%;
155
+ transform: translate(-50%, -50%);
156
+ background: #fff;
157
+ padding: 20px;
158
+ }
159
+
160
  @media screen and (max-width: 767px) {
161
  .ctl-table-cell label {
162
  width: 2.2em;
cyr-to-lat.php CHANGED
@@ -9,8 +9,8 @@
9
  * Author URI: https://profiles.wordpress.org/sergeybiryukov/
10
  * Requires at least: 5.1
11
  * Tested up to: 5.6
12
- * Version: 4.5.1
13
- * Stable tag: 4.5.1
14
  *
15
  * Text Domain: cyr2lat
16
  * Domain Path: /languages/
@@ -21,11 +21,11 @@
21
 
22
  namespace Cyr_To_Lat;
23
 
24
- // @codeCoverageIgnoreStart
25
  if ( ! defined( 'ABSPATH' ) ) {
26
- exit; // Exit if accessed directly.
 
 
27
  }
28
- // @codeCoverageIgnoreEnd
29
 
30
  if ( defined( 'CYR_TO_LAT_VERSION' ) ) {
31
  return;
@@ -34,12 +34,12 @@ if ( defined( 'CYR_TO_LAT_VERSION' ) ) {
34
  /**
35
  * Plugin version.
36
  */
37
- define( 'CYR_TO_LAT_VERSION', '4.5.1' );
38
 
39
  /**
40
  * Path to the plugin dir.
41
  */
42
- define( 'CYR_TO_LAT_PATH', dirname( __FILE__ ) );
43
 
44
  /**
45
  * Plugin dir url.
@@ -87,5 +87,6 @@ if ( ! $cyr_to_lat_requirements->are_requirements_met() ) {
87
  return;
88
  }
89
 
90
- $cyr_to_lat_plugin = new Main();
91
 
 
9
  * Author URI: https://profiles.wordpress.org/sergeybiryukov/
10
  * Requires at least: 5.1
11
  * Tested up to: 5.6
12
+ * Version: 4.6.0
13
+ * Stable tag: 4.6.0
14
  *
15
  * Text Domain: cyr2lat
16
  * Domain Path: /languages/
21
 
22
  namespace Cyr_To_Lat;
23
 
 
24
  if ( ! defined( 'ABSPATH' ) ) {
25
+ // @codeCoverageIgnoreStart
26
+ exit;
27
+ // @codeCoverageIgnoreEnd
28
  }
 
29
 
30
  if ( defined( 'CYR_TO_LAT_VERSION' ) ) {
31
  return;
34
  /**
35
  * Plugin version.
36
  */
37
+ define( 'CYR_TO_LAT_VERSION', '4.6.0' );
38
 
39
  /**
40
  * Path to the plugin dir.
41
  */
42
+ define( 'CYR_TO_LAT_PATH', __DIR__ );
43
 
44
  /**
45
  * Plugin dir url.
87
  return;
88
  }
89
 
90
+ global $cyr_to_lat_plugin;
91
 
92
+ $cyr_to_lat_plugin = new Main();
dist/js/settings/app.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ !function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){n(1),t.exports=n(2)},function(t,e){var n=function(t){function e(){this.fetch=!1,this.DOMException=t.DOMException}return e.prototype=t,new e}("undefined"!=typeof self?self:this);!function(t){!function(e){var n="URLSearchParams"in t,r="Symbol"in t&&"iterator"in Symbol,i="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),o="FormData"in t,s="ArrayBuffer"in t;if(s)var a=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],u=ArrayBuffer.isView||function(t){return t&&a.indexOf(Object.prototype.toString.call(t))>-1};function l(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function c(t){return"string"!=typeof t&&(t=String(t)),t}function h(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return r&&(e[Symbol.iterator]=function(){return e}),e}function d(t){this.map={},t instanceof d?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function p(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function f(t){return new Promise((function(e,n){t.onload=function(){e(t.result)},t.onerror=function(){n(t.error)}}))}function y(t){var e=new FileReader,n=f(e);return e.readAsArrayBuffer(t),n}function b(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function v(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:i&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:o&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:n&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():s&&i&&((e=t)&&DataView.prototype.isPrototypeOf(e))?(this._bodyArrayBuffer=b(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):s&&(ArrayBuffer.prototype.isPrototypeOf(t)||u(t))?this._bodyArrayBuffer=b(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):n&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},i&&(this.blob=function(){var t=p(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?p(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(y)}),this.text=function(){var t,e,n,r=p(this);if(r)return r;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,n=f(e),e.readAsText(t),n;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),n=new Array(e.length),r=0;r<e.length;r++)n[r]=String.fromCharCode(e[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},o&&(this.formData=function(){return this.text().then(S)}),this.json=function(){return this.text().then(JSON.parse)},this}d.prototype.append=function(t,e){t=l(t),e=c(e);var n=this.map[t];this.map[t]=n?n+", "+e:e},d.prototype.delete=function(t){delete this.map[l(t)]},d.prototype.get=function(t){return t=l(t),this.has(t)?this.map[t]:null},d.prototype.has=function(t){return this.map.hasOwnProperty(l(t))},d.prototype.set=function(t,e){this.map[l(t)]=c(e)},d.prototype.forEach=function(t,e){for(var n in this.map)this.map.hasOwnProperty(n)&&t.call(e,this.map[n],n,this)},d.prototype.keys=function(){var t=[];return this.forEach((function(e,n){t.push(n)})),h(t)},d.prototype.values=function(){var t=[];return this.forEach((function(e){t.push(e)})),h(t)},d.prototype.entries=function(){var t=[];return this.forEach((function(e,n){t.push([n,e])})),h(t)},r&&(d.prototype[Symbol.iterator]=d.prototype.entries);var m=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function E(t,e){var n,r,i=(e=e||{}).body;if(t instanceof E){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new d(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,i||null==t._bodyInit||(i=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"same-origin",!e.headers&&this.headers||(this.headers=new d(e.headers)),this.method=(n=e.method||this.method||"GET",r=n.toUpperCase(),m.indexOf(r)>-1?r:n),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&i)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(i)}function S(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var n=t.split("="),r=n.shift().replace(/\+/g," "),i=n.join("=").replace(/\+/g," ");e.append(decodeURIComponent(r),decodeURIComponent(i))}})),e}function L(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new d(e.headers),this.url=e.url||"",this._initBody(t)}E.prototype.clone=function(){return new E(this,{body:this._bodyInit})},v.call(E.prototype),v.call(L.prototype),L.prototype.clone=function(){return new L(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new d(this.headers),url:this.url})},L.error=function(){var t=new L(null,{status:0,statusText:""});return t.type="error",t};var T=[301,302,303,307,308];L.redirect=function(t,e){if(-1===T.indexOf(e))throw new RangeError("Invalid status code");return new L(null,{status:e,headers:{location:t}})},e.DOMException=t.DOMException;try{new e.DOMException}catch(t){e.DOMException=function(t,e){this.message=t,this.name=e;var n=Error(t);this.stack=n.stack},e.DOMException.prototype=Object.create(Error.prototype),e.DOMException.prototype.constructor=e.DOMException}function _(t,n){return new Promise((function(r,o){var s=new E(t,n);if(s.signal&&s.signal.aborted)return o(new e.DOMException("Aborted","AbortError"));var a=new XMLHttpRequest;function u(){a.abort()}a.onload=function(){var t,e,n={status:a.status,statusText:a.statusText,headers:(t=a.getAllResponseHeaders()||"",e=new d,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(t){var n=t.split(":"),r=n.shift().trim();if(r){var i=n.join(":").trim();e.append(r,i)}})),e)};n.url="responseURL"in a?a.responseURL:n.headers.get("X-Request-URL");var i="response"in a?a.response:a.responseText;r(new L(i,n))},a.onerror=function(){o(new TypeError("Network request failed"))},a.ontimeout=function(){o(new TypeError("Network request failed"))},a.onabort=function(){o(new e.DOMException("Aborted","AbortError"))},a.open(s.method,s.url,!0),"include"===s.credentials?a.withCredentials=!0:"omit"===s.credentials&&(a.withCredentials=!1),"responseType"in a&&i&&(a.responseType="blob"),s.headers.forEach((function(t,e){a.setRequestHeader(e,t)})),s.signal&&(s.signal.addEventListener("abort",u),a.onreadystatechange=function(){4===a.readyState&&s.signal.removeEventListener("abort",u)}),a.send(void 0===s._bodyInit?null:s._bodyInit)}))}_.polyfill=!0,t.fetch||(t.fetch=_,t.Headers=d,t.Request=E,t.Response=L),e.Headers=d,e.Request=E,e.Response=L,e.fetch=_}({})}(n),delete n.fetch.polyfill,(e=n.fetch).default=n.fetch,e.fetch=n.fetch,e.Headers=n.Headers,e.Request=n.Request,e.Response=n.Response,t.exports=e},function(t,e,n){"use strict";var r,i=n(3),o=(r=i)&&r.__esModule?r:{default:r};document.addEventListener("DOMContentLoaded",(function(){new o.default}))},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}();function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)}var o=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.OPTIONS_FORM_SELECTOR="#ctl-options",this.HEADER_SELECTOR=this.OPTIONS_FORM_SELECTOR+" h2",this.TABLE_SELECTOR=this.OPTIONS_FORM_SELECTOR+" table",this.SUBMIT_SELECTOR=this.OPTIONS_FORM_SELECTOR+" #submit",this.CONVERT_FORM_SELECTOR="#ctl-convert-existing-slugs",this.CONVERT_BUTTON_SELECTOR="#ctl-convert-button",this.CONFIRM_POPUP_SELECTOR="#ctl-confirm-popup",this.CONFIRM_OK_SELECTOR="#ctl-confirm-ok",this.CONFIRM_CANCEL_SELECTOR="#ctl-confirm-cancel",this.CURRENT_STUB_ID="ctl-current",this.CURRENT_NAV_TAB_CLASS="nav-tab-current",this.ACTIVE_NAV_TAB_CLASS="nav-tab-active",this.ACTIVE_TABLE_CLASS="active",this.EDIT_LABEL_ID="ctl-edit-label",this.EDIT_LABEL_ERROR_CLASS="ctl-edit-label-error",this.plusButton='<button type="button" aria-haspopup="true" aria-expanded="false" class="components-button block-editor-inserter__toggle has-icon" aria-label="Добавить блок"><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 24 24" role="img" aria-hidden="true" focusable="false"><path d="M10 1c-5 0-9 4-9 9s4 9 9 9 9-4 9-9-4-9-9-9zm0 16c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7zm1-11H9v3H6v2h3v3h2v-3h3V9h-3V6zM10 1c-5 0-9 4-9 9s4 9 9 9 9-4 9-9-4-9-9-9zm0 16c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7zm1-11H9v3H6v2h3v3h2v-3h3V9h-3V6z"></path></svg></button>',this.PLUS_CLASS="ctl-plus",this.optionsForm=document.querySelector(this.OPTIONS_FORM_SELECTOR),this.tablesData=this.getTablesData(),this.submitButton=document.querySelector(this.SUBMIT_SELECTOR),this.confirmPopup=document.querySelector(this.CONFIRM_POPUP_SELECTOR),this.optionsSaveSuccessMessage=Cyr2LatSettingsObject.optionsSaveSuccessMessage,this.optionsSaveErrorMessage=Cyr2LatSettingsObject.optionsSaveErrorMessage,this.addWrapper(),this.addMessageLines(),this.addEditLabelInput(),this.hideTables(),this.bindEvents(),this.setSubmitStatus()}return r(t,[{key:"getHeaders",value:function(){return[].concat(i(document.querySelectorAll(this.HEADER_SELECTOR)))}},{key:"getActiveHeader",value:function(){return document.querySelector(this.HEADER_SELECTOR+"."+this.ACTIVE_NAV_TAB_CLASS)}},{key:"getActiveIndex",value:function(){return this.getActiveHeader().dataset.index}},{key:"getTables",value:function(){return[].concat(i(document.querySelectorAll(this.TABLE_SELECTOR)))}},{key:"getActiveTable",value:function(){return document.querySelector(this.TABLE_SELECTOR+"."+this.ACTIVE_TABLE_CLASS)}},{key:"getInputs",value:function(){return[].concat(i(document.querySelectorAll(this.OPTIONS_FORM_SELECTOR+" input")))}},{key:"getLabels",value:function(){return[].concat(i(document.querySelectorAll(this.OPTIONS_FORM_SELECTOR+" label")))}},{key:"getPlusButtons",value:function(){return[].concat(i(document.querySelectorAll(this.OPTIONS_FORM_SELECTOR+" ."+this.PLUS_CLASS)))}},{key:"isActiveTableChanged",value:function(){var t=this.getActiveIndex();return JSON.stringify(this.getActiveTableData())!==JSON.stringify(this.tablesData[t])}},{key:"setSubmitStatus",value:function(){this.submitButton.disabled=!this.isActiveTableChanged()}},{key:"saveActiveTable",value:function(){var t=this;if(this.isActiveTableChanged()){var e=this.getActiveTable(),n=document.createElement("form");return n.action=this.optionsForm.getAttribute("action"),n.method=this.optionsForm.method,n.appendChild(e.cloneNode(!0)),[].concat(i(e.querySelectorAll("input"))).map((function(t){return n.querySelector("#"+t.id).value=t.value})),[].concat(i(this.optionsForm.querySelectorAll('input[type="hidden"]'))).map((function(t){return n.appendChild(t.cloneNode(!0))})),document.body.appendChild(n),fetch(this.optionsForm.getAttribute("action"),{method:n.method,body:new URLSearchParams([].concat(i(new FormData(n))))}).then((function(e){return e.ok?(t.showMessage(t.successMessage,t.optionsSaveSuccessMessage),t.tablesData=t.getTablesData()):t.showMessage(t.errorMessage,t.optionsSaveErrorMessage),e.json()})).finally((function(){n.parentNode.removeChild(n),t.setSubmitStatus()}))}}},{key:"getTableData",value:function(t){var e=this,n=[].concat(i(t.querySelectorAll("input"))),r={};return n.forEach((function(t){var n=document.querySelector(e.OPTIONS_FORM_SELECTOR+' label[for="'+t.id+'"]');r[n.innerHTML]=t.value})),r}},{key:"getTablesData",value:function(){var t=this;return this.getTables().map((function(e){return t.getTableData(e)}))}},{key:"getActiveTableData",value:function(){return this.getTableData(this.getActiveTable())}},{key:"addWrapper",value:function(){this.wrapper=document.createElement("ul"),this.wrapper.classList.add("nav-tab-wrapper"),this.optionsForm.insertBefore(this.wrapper,this.optionsForm.firstChild)}},{key:"addMessageLine",value:function(t){var e=document.createElement("div");return e.id=t,this.optionsForm.insertBefore(e,this.optionsForm.firstChild),e}},{key:"addMessageLines",value:function(){this.successMessage=this.addMessageLine("ctl-success"),this.errorMessage=this.addMessageLine("ctl-error")}},{key:"addEditLabelInput",value:function(){this.editLabelInput=document.createElement("input"),this.editLabelInput.id=this.EDIT_LABEL_ID,this.editLabelInput.style.display="none",document.body.appendChild(this.editLabelInput)}},{key:"hideEditLabelInput",value:function(){this.editLabelInput.style.display="none",this.editLabelInput.classList.remove(this.EDIT_LABEL_ERROR_CLASS),document.body.appendChild(this.editLabelInput)}},{key:"getLastCell",value:function(){return document.querySelector(this.OPTIONS_FORM_SELECTOR+" ."+this.ACTIVE_TABLE_CLASS+" ."+this.PLUS_CLASS).previousElementSibling}},{key:"addCell",value:function(){var t=this.getLastCell();t.parentElement.insertBefore(t.cloneNode(!0),t.nextElementSibling);var e=(t=this.getLastCell()).querySelector("label"),n=t.querySelector("input"),r=n.id.split("-"),i=r[0]+"-"+(parseInt(r[1])+1);e.htmlFor=i,e.innerHTML="",n.id=i,n.value="",n.setAttribute("value",""),this.replaceName(n,""),this.bindEvents(),this.editLabel(e)}},{key:"hideTables",value:function(){var t=this,e=0;this.getTables().map((function(n,r){n.classList.add("ctl-table"),t.CURRENT_STUB_ID===n.previousElementSibling.id&&(e=r,n.classList.add(t.ACTIVE_TABLE_CLASS));var i=document.createElement("div");return i.classList.add(t.PLUS_CLASS),i.innerHTML=t.plusButton,n.querySelector("td").appendChild(i),null})),this.getHeaders().map((function(n,r){return n.classList.add("nav-tab"),n.dataset.index=r,t.wrapper.appendChild(n),r===e&&(n.classList.add(t.CURRENT_NAV_TAB_CLASS),n.classList.add(t.ACTIVE_NAV_TAB_CLASS)),null}))}},{key:"bindEvents",value:function(){var t=this;this.getHeaders().map((function(e,n,r){return e.onclick=function(e){e.preventDefault();var n=e.target.dataset.index;if(n===t.getActiveIndex())return!1;t.saveActiveTable(),r.map((function(e){return e.classList.remove(t.ACTIVE_NAV_TAB_CLASS)})),r[n].classList.add(t.ACTIVE_NAV_TAB_CLASS);var i=t.getTables();return i.map((function(e){return e.classList.remove(t.ACTIVE_TABLE_CLASS)})),i[n].classList.add(t.ACTIVE_TABLE_CLASS),t.setSubmitStatus(),!1},null})),this.getInputs().map((function(e){return e.oninput=function(){t.setSubmitStatus()},null})),this.getLabels().map((function(e){return e.onclick=function(e){return e.preventDefault(),t.editLabel(e.target),!1},null})),this.editLabelInput.onblur=function(){t.saveLabel()},this.editLabelInput.onkeyup=function(e){"Escape"===e.key&&t.saveLabel(!0),"Enter"===e.key&&t.saveLabel()},this.getPlusButtons().map((function(e){return e.onclick=function(e){return e.preventDefault(),t.addCell(e.target),!1},null})),this.submitButton.onclick=function(e){return e.preventDefault(),t.saveActiveTable(),!1},document.querySelector(this.CONVERT_BUTTON_SELECTOR).onclick=function(e){return e.preventDefault(),t.confirmPopup.style.display="block",!1},this.confirmPopup.onclick=function(){t.hideConfirmPopup()},document.querySelector(this.CONFIRM_OK_SELECTOR).onclick=function(e){e.stopPropagation(),t.hideConfirmPopup(),document.querySelector(t.CONVERT_FORM_SELECTOR).submit()},document.querySelector(this.CONFIRM_CANCEL_SELECTOR).onclick=function(e){e.stopPropagation(),t.hideConfirmPopup()}}},{key:"hideConfirmPopup",value:function(){this.confirmPopup.style.display="none"}},{key:"editLabel",value:function(t){t.parentNode.appendChild(this.editLabelInput),this.editLabelInput.value=t.innerHTML,this.editLabelInput.classList.remove(this.EDIT_LABEL_ERROR_CLASS),this.editLabelInput.style.display="block",this.editLabelInput.focus()}},{key:"isUniqueLabel",value:function(t){return[].concat(i(this.getActiveTable().querySelectorAll("label"))).reduce((function(e,n){return e&&n.innerHTML!==t}),!0)}},{key:"saveLabel",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if("none"!==this.editLabelInput.style.display){var e=this.editLabelInput.value.trim();if(""===e){var n=document.getElementById(this.EDIT_LABEL_ID).parentElement;return this.hideEditLabelInput(),n.parentNode.removeChild(n),void this.setSubmitStatus()}var r=this.editLabelInput.parentNode.querySelector("label");if(t||e===r.innerHTML)this.hideEditLabelInput();else if(this.isUniqueLabel(e)){var i=this.editLabelInput.parentNode.querySelector("input");this.hideEditLabelInput(),r.innerHTML=e,this.replaceName(i,e),this.setSubmitStatus()}else this.editLabelInput.classList.add(this.EDIT_LABEL_ERROR_CLASS)}}},{key:"replaceName",value:function(t,e){t.name=t.name.replace(/(.+\[.+])\[.*]/g,"$1["+e+"]")}},{key:"clearMessage",value:function(t){t.innerHTML="",t.classList.remove("active")}},{key:"clearMessages",value:function(){this.clearMessage(this.successMessage),this.clearMessage(this.errorMessage),clearTimeout(this.msgTimer)}},{key:"showMessage",value:function(t,e){var n=this;t.innerHTML=e,t.classList.add("active"),this.msgTimer=setTimeout((function(){n.clearMessages()}),5e3)}}]),t}();e.default=o}]);
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Nyb3NzLWZldGNoL2Rpc3QvYnJvd3Nlci1wb255ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9qcy9zZXR0aW5ncy9hcHAuanMiLCJ3ZWJwYWNrOi8vLy4vanMvc2V0dGluZ3Mvc2V0dGluZ3MuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJfX3NlbGZfXyIsInJvb3QiLCJGIiwidGhpcyIsImZldGNoIiwiRE9NRXhjZXB0aW9uIiwic2VsZiIsInN1cHBvcnQiLCJCbG9iIiwiZSIsInZpZXdDbGFzc2VzIiwiaXNBcnJheUJ1ZmZlclZpZXciLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsIm9iaiIsImluZGV4T2YiLCJ0b1N0cmluZyIsIm5vcm1hbGl6ZU5hbWUiLCJTdHJpbmciLCJ0ZXN0IiwiVHlwZUVycm9yIiwidG9Mb3dlckNhc2UiLCJub3JtYWxpemVWYWx1ZSIsIml0ZXJhdG9yRm9yIiwiaXRlbXMiLCJpdGVyYXRvciIsIm5leHQiLCJzaGlmdCIsImRvbmUiLCJ1bmRlZmluZWQiLCJIZWFkZXJzIiwiaGVhZGVycyIsIm1hcCIsImZvckVhY2giLCJhcHBlbmQiLCJBcnJheSIsImlzQXJyYXkiLCJoZWFkZXIiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiY29uc3VtZWQiLCJib2R5IiwiYm9keVVzZWQiLCJQcm9taXNlIiwicmVqZWN0IiwiZmlsZVJlYWRlclJlYWR5IiwicmVhZGVyIiwicmVzb2x2ZSIsIm9ubG9hZCIsInJlc3VsdCIsIm9uZXJyb3IiLCJlcnJvciIsInJlYWRCbG9iQXNBcnJheUJ1ZmZlciIsImJsb2IiLCJGaWxlUmVhZGVyIiwicHJvbWlzZSIsInJlYWRBc0FycmF5QnVmZmVyIiwiYnVmZmVyQ2xvbmUiLCJidWYiLCJzbGljZSIsInZpZXciLCJVaW50OEFycmF5IiwiYnl0ZUxlbmd0aCIsInNldCIsImJ1ZmZlciIsIkJvZHkiLCJfaW5pdEJvZHkiLCJfYm9keUluaXQiLCJfYm9keVRleHQiLCJpc1Byb3RvdHlwZU9mIiwiX2JvZHlCbG9iIiwiRm9ybURhdGEiLCJfYm9keUZvcm1EYXRhIiwiVVJMU2VhcmNoUGFyYW1zIiwiRGF0YVZpZXciLCJfYm9keUFycmF5QnVmZmVyIiwidHlwZSIsInJlamVjdGVkIiwiRXJyb3IiLCJhcnJheUJ1ZmZlciIsInRoZW4iLCJ0ZXh0IiwicmVhZEFzVGV4dCIsImNoYXJzIiwibGVuZ3RoIiwiZnJvbUNoYXJDb2RlIiwiam9pbiIsInJlYWRBcnJheUJ1ZmZlckFzVGV4dCIsImZvcm1EYXRhIiwiZGVjb2RlIiwianNvbiIsIkpTT04iLCJwYXJzZSIsIm9sZFZhbHVlIiwiaGFzIiwiY2FsbGJhY2siLCJ0aGlzQXJnIiwia2V5cyIsInB1c2giLCJ2YWx1ZXMiLCJlbnRyaWVzIiwibWV0aG9kcyIsIlJlcXVlc3QiLCJpbnB1dCIsIm9wdGlvbnMiLCJtZXRob2QiLCJ1cGNhc2VkIiwidXJsIiwiY3JlZGVudGlhbHMiLCJzaWduYWwiLCJ0b1VwcGVyQ2FzZSIsInJlZmVycmVyIiwiZm9ybSIsInRyaW0iLCJzcGxpdCIsImJ5dGVzIiwicmVwbGFjZSIsImRlY29kZVVSSUNvbXBvbmVudCIsIlJlc3BvbnNlIiwiYm9keUluaXQiLCJzdGF0dXMiLCJvayIsInN0YXR1c1RleHQiLCJjbG9uZSIsInJlc3BvbnNlIiwicmVkaXJlY3RTdGF0dXNlcyIsInJlZGlyZWN0IiwiUmFuZ2VFcnJvciIsImxvY2F0aW9uIiwiZXJyIiwibWVzc2FnZSIsInN0YWNrIiwiY29uc3RydWN0b3IiLCJpbml0IiwicmVxdWVzdCIsImFib3J0ZWQiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsImFib3J0WGhyIiwiYWJvcnQiLCJyYXdIZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwibGluZSIsInBhcnRzIiwicmVzcG9uc2VVUkwiLCJyZXNwb25zZVRleHQiLCJvbnRpbWVvdXQiLCJvbmFib3J0Iiwib3BlbiIsIndpdGhDcmVkZW50aWFscyIsInJlc3BvbnNlVHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZW5kIiwicG9seWZpbGwiLCJkZWZhdWx0IiwiZG9jdW1lbnQiLCJTZXR0aW5ncyIsIk9QVElPTlNfRk9STV9TRUxFQ1RPUiIsIkhFQURFUl9TRUxFQ1RPUiIsIlRBQkxFX1NFTEVDVE9SIiwiU1VCTUlUX1NFTEVDVE9SIiwiQ09OVkVSVF9GT1JNX1NFTEVDVE9SIiwiQ09OVkVSVF9CVVRUT05fU0VMRUNUT1IiLCJDT05GSVJNX1BPUFVQX1NFTEVDVE9SIiwiQ09ORklSTV9PS19TRUxFQ1RPUiIsIkNPTkZJUk1fQ0FOQ0VMX1NFTEVDVE9SIiwiQ1VSUkVOVF9TVFVCX0lEIiwiQ1VSUkVOVF9OQVZfVEFCX0NMQVNTIiwiQUNUSVZFX05BVl9UQUJfQ0xBU1MiLCJBQ1RJVkVfVEFCTEVfQ0xBU1MiLCJFRElUX0xBQkVMX0lEIiwiRURJVF9MQUJFTF9FUlJPUl9DTEFTUyIsInBsdXNCdXR0b24iLCJQTFVTX0NMQVNTIiwib3B0aW9uc0Zvcm0iLCJxdWVyeVNlbGVjdG9yIiwidGFibGVzRGF0YSIsImdldFRhYmxlc0RhdGEiLCJzdWJtaXRCdXR0b24iLCJjb25maXJtUG9wdXAiLCJvcHRpb25zU2F2ZVN1Y2Nlc3NNZXNzYWdlIiwiQ3lyMkxhdFNldHRpbmdzT2JqZWN0Iiwib3B0aW9uc1NhdmVFcnJvck1lc3NhZ2UiLCJhZGRXcmFwcGVyIiwiYWRkTWVzc2FnZUxpbmVzIiwiYWRkRWRpdExhYmVsSW5wdXQiLCJoaWRlVGFibGVzIiwiYmluZEV2ZW50cyIsInNldFN1Ym1pdFN0YXR1cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJnZXRBY3RpdmVIZWFkZXIiLCJkYXRhc2V0IiwiaW5kZXgiLCJhY3RpdmVJbmRleCIsImdldEFjdGl2ZUluZGV4Iiwic3RyaW5naWZ5IiwiZ2V0QWN0aXZlVGFibGVEYXRhIiwiZGlzYWJsZWQiLCJpc0FjdGl2ZVRhYmxlQ2hhbmdlZCIsImFjdGl2ZVRhYmxlIiwiZ2V0QWN0aXZlVGFibGUiLCJhY3RpdmVGb3JtIiwiY3JlYXRlRWxlbWVudCIsImFjdGlvbiIsImdldEF0dHJpYnV0ZSIsImFwcGVuZENoaWxkIiwiY2xvbmVOb2RlIiwiYWN0aXZlSW5wdXRzIiwiaWQiLCJoaWRkZW5JbnB1dHMiLCJzaG93TWVzc2FnZSIsInN1Y2Nlc3NNZXNzYWdlIiwiZXJyb3JNZXNzYWdlIiwiZmluYWxseSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsInRhYmxlIiwiaW5wdXRzIiwiZGF0YSIsImxhYmVsIiwiaW5uZXJIVE1MIiwiZ2V0VGFibGVzIiwiZ2V0VGFibGVEYXRhIiwid3JhcHBlciIsImNsYXNzTGlzdCIsImFkZCIsImluc2VydEJlZm9yZSIsImZpcnN0Q2hpbGQiLCJhZGRNZXNzYWdlTGluZSIsImVkaXRMYWJlbElucHV0Iiwic3R5bGUiLCJkaXNwbGF5IiwicmVtb3ZlIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImxhc3RDZWxsIiwiZ2V0TGFzdENlbGwiLCJwYXJlbnRFbGVtZW50IiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaWRBcnIiLCJuZXdJZCIsInBhcnNlSW50IiwiaHRtbEZvciIsInNldEF0dHJpYnV0ZSIsInJlcGxhY2VOYW1lIiwiZWRpdExhYmVsIiwiY3VycmVudEluZGV4IiwicGx1cyIsImdldEhlYWRlcnMiLCJvbmNsaWNrIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsInNhdmVBY3RpdmVUYWJsZSIsImFIZWFkZXIiLCJ0YWJsZXMiLCJnZXRJbnB1dHMiLCJvbmlucHV0IiwiZ2V0TGFiZWxzIiwib25ibHVyIiwic2F2ZUxhYmVsIiwib25rZXl1cCIsImdldFBsdXNCdXR0b25zIiwiYWRkQ2VsbCIsImhpZGVDb25maXJtUG9wdXAiLCJzdG9wUHJvcGFnYXRpb24iLCJzdWJtaXQiLCJmb2N1cyIsIm5ld1ZhbHVlIiwicmVkdWNlIiwiYWNjIiwiY2FuY2VsIiwiZWRpdGVkQ2VsbCIsImdldEVsZW1lbnRCeUlkIiwiaGlkZUVkaXRMYWJlbElucHV0IiwiaXNVbmlxdWVMYWJlbCIsImNsZWFyTWVzc2FnZSIsImNsZWFyVGltZW91dCIsIm1zZ1RpbWVyIiwiZWwiLCJzZXRUaW1lb3V0IiwiY2xlYXJNZXNzYWdlcyJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBS2ZGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlC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QUFRM04sS0FBS3FPLGVBQWVmLFdBQVd2QyxjQUFlLFNBQzVELEdBQUsrRixHQUFVSCxJQUFhaEQsRUFBTUMsVUFDakM1TixLQUFLaVIsMEJBS04sR0FBT2pSLEtBQUtrUixjQUFlUCxHQUEzQixDQU1BLElBQU14SyxFQUFRbkcsS0FBS3FPLGVBQWVmLFdBQVd2QyxjQUFlLFNBRTVEL0ssS0FBS2lSLHFCQUVMdEQsRUFBTUMsVUFBWStDLEVBQ2xCM1EsS0FBS21QLFlBQWFoSixFQUFPd0ssR0FFekIzUSxLQUFLNEwsdUJBWko1TCxLQUFLcU8sZUFBZUwsVUFBVUMsSUFBS2pPLEtBQUsySywyQixrQ0FxQjdCeEUsRUFBT3dLLEdBRW5CeEssRUFBTS9ILEtBQU8rSCxFQUFNL0gsS0FBSzRJLFFBQ3ZCLGtCQUNBLE1BQVEySixFQUFXLE8sbUNBU1A3SSxHQUNiQSxFQUFROEYsVUFBWSxHQUNwQjlGLEVBQVFrRyxVQUFVUSxPQUFRLFksc0NBTzFCeE8sS0FBS21SLGFBQWNuUixLQUFLbU4sZ0JBQ3hCbk4sS0FBS21SLGFBQWNuUixLQUFLb04sY0FDeEJnRSxhQUFjcFIsS0FBS3FSLFksa0NBU1BDLEVBQUl4SixHQUFVLFdBQzFCd0osRUFBRzFELFVBQVk5RixFQUNmd0osRUFBR3RELFVBQVVDLElBQUssVUFFbEJqTyxLQUFLcVIsU0FBV0UsWUFBWSxXQUMzQixFQUFLQyxrQkFDSCxTLGVBSVU1SCIsImZpbGUiOiJqcy9zZXR0aW5ncy9hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCJ2YXIgX19zZWxmX18gPSAoZnVuY3Rpb24gKHJvb3QpIHtcbmZ1bmN0aW9uIEYoKSB7XG50aGlzLmZldGNoID0gZmFsc2U7XG50aGlzLkRPTUV4Y2VwdGlvbiA9IHJvb3QuRE9NRXhjZXB0aW9uXG59XG5GLnByb3RvdHlwZSA9IHJvb3Q7XG5yZXR1cm4gbmV3IEYoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzKTtcbihmdW5jdGlvbihzZWxmKSB7XG5cbnZhciBpcnJlbGV2YW50ID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cbiAgdmFyIHN1cHBvcnQgPSB7XG4gICAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBzZWxmLFxuICAgIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBzZWxmICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICAgIGJsb2I6XG4gICAgICAnRmlsZVJlYWRlcicgaW4gc2VsZiAmJlxuICAgICAgJ0Jsb2InIGluIHNlbGYgJiZcbiAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXcgQmxvYigpO1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICBmb3JtRGF0YTogJ0Zvcm1EYXRhJyBpbiBzZWxmLFxuICAgIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIHNlbGZcbiAgfTtcblxuICBmdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikge1xuICAgIHJldHVybiBvYmogJiYgRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgICB2YXIgdmlld0NsYXNzZXMgPSBbXG4gICAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSdcbiAgICBdO1xuXG4gICAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fFxuICAgICAgZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgfVxuICAgIGlmICgvW15hLXowLTlcXC0jJCUmJyorLl5fYHx+XS9pLnRlc3QobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lJylcbiAgICB9XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8vIEJ1aWxkIGEgZGVzdHJ1Y3RpdmUgaXRlcmF0b3IgZm9yIHRoZSB2YWx1ZSBsaXN0XG4gIGZ1bmN0aW9uIGl0ZXJhdG9yRm9yKGl0ZW1zKSB7XG4gICAgdmFyIGl0ZXJhdG9yID0ge1xuICAgICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGl0ZW1zLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgICAgaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZXJhdG9yXG4gIH1cblxuICBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICB0aGlzLm1hcCA9IHt9O1xuXG4gICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKTtcbiAgICB2YWx1ZSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLm1hcFtuYW1lXTtcbiAgICB0aGlzLm1hcFtuYW1lXSA9IG9sZFZhbHVlID8gb2xkVmFsdWUgKyAnLCAnICsgdmFsdWUgOiB2YWx1ZTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldO1xuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLm1hcFtuYW1lXSA6IG51bGxcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIGl0ZW1zLnB1c2gobmFtZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxuICB9O1xuXG4gIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXM7XG4gIH1cblxuICBmdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gICAgaWYgKGJvZHkuYm9keVVzZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgICB9XG4gICAgYm9keS5ib2R5VXNlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpO1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcik7XG4gICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYik7XG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRBcnJheUJ1ZmZlckFzVGV4dChidWYpIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnMuam9pbignJylcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1Zikge1xuICAgIGlmIChidWYuc2xpY2UpIHtcbiAgICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYuYnl0ZUxlbmd0aCk7XG4gICAgICB2aWV3LnNldChuZXcgVWludDhBcnJheShidWYpKTtcbiAgICAgIHJldHVybiB2aWV3LmJ1ZmZlclxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIEJvZHkoKSB7XG4gICAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHk7XG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keTtcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5O1xuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmZvcm1EYXRhICYmIEZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHk7XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcik7XG4gICAgICAgIC8vIElFIDEwLTExIGNhbid0IGhhbmRsZSBhIERhdGFWaWV3IGJvZHkuXG4gICAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pO1xuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpO1xuICAgICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBjb25zdW1lZCh0aGlzKSB8fCBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpO1xuICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gSFRUUCBtZXRob2RzIHdob3NlIGNhcGl0YWxpemF0aW9uIHNob3VsZCBiZSBub3JtYWxpemVkXG4gIHZhciBtZXRob2RzID0gWydERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQT1NUJywgJ1BVVCddO1xuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIHJldHVybiBtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSA/IHVwY2FzZWQgOiBtZXRob2RcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keTtcblxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKVxuICAgICAgfVxuICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmw7XG4gICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsO1xuICAgICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICAgIGJvZHkgPSBpbnB1dC5fYm9keUluaXQ7XG4gICAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJztcbiAgICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKTtcbiAgICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGw7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbDtcbiAgICB0aGlzLnJlZmVycmVyID0gbnVsbDtcblxuICAgIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgICB9XG4gICAgdGhpcy5faW5pdEJvZHkoYm9keSk7XG4gIH1cblxuICBSZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KVxuICB9O1xuXG4gIGZ1bmN0aW9uIGRlY29kZShib2R5KSB7XG4gICAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICBib2R5XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJyYnKVxuICAgICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKTtcbiAgICAgICAgICB2YXIgbmFtZSA9IHNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1xcKy9nLCAnICcpO1xuICAgICAgICAgIGZvcm0uYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBmb3JtXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhlYWRlcnMocmF3SGVhZGVycykge1xuICAgIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjJcbiAgICB2YXIgcHJlUHJvY2Vzc2VkSGVhZGVycyA9IHJhd0hlYWRlcnMucmVwbGFjZSgvXFxyP1xcbltcXHQgXSsvZywgJyAnKTtcbiAgICBwcmVQcm9jZXNzZWRIZWFkZXJzLnNwbGl0KC9cXHI/XFxuLykuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6Jyk7XG4gICAgICB2YXIga2V5ID0gcGFydHMuc2hpZnQoKS50cmltKCk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKCk7XG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBCb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpO1xuXG4gIGZ1bmN0aW9uIFJlc3BvbnNlKGJvZHlJbml0LCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdGhpcy50eXBlID0gJ2RlZmF1bHQnO1xuICAgIHRoaXMuc3RhdHVzID0gb3B0aW9ucy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDIwMCA6IG9wdGlvbnMuc3RhdHVzO1xuICAgIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDA7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gJ3N0YXR1c1RleHQnIGluIG9wdGlvbnMgPyBvcHRpb25zLnN0YXR1c1RleHQgOiAnT0snO1xuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJztcbiAgICB0aGlzLl9pbml0Qm9keShib2R5SW5pdCk7XG4gIH1cblxuICBCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKTtcblxuICBSZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICAgIHVybDogdGhpcy51cmxcbiAgICB9KVxuICB9O1xuXG4gIFJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IDAsIHN0YXR1c1RleHQ6ICcnfSk7XG4gICAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcic7XG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH07XG5cbiAgdmFyIHJlZGlyZWN0U3RhdHVzZXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdO1xuXG4gIFJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG4gIH07XG5cbiAgZXhwb3J0cy5ET01FeGNlcHRpb24gPSBzZWxmLkRPTUV4Y2VwdGlvbjtcbiAgdHJ5IHtcbiAgICBuZXcgZXhwb3J0cy5ET01FeGNlcHRpb24oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXhwb3J0cy5ET01FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrO1xuICAgIH07XG4gICAgZXhwb3J0cy5ET01FeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICAgIGV4cG9ydHMuRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGV4cG9ydHMuRE9NRXhjZXB0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2goaW5wdXQsIGluaXQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KTtcblxuICAgICAgaWYgKHJlcXVlc3Quc2lnbmFsICYmIHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgZXhwb3J0cy5ET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfVxuXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIGZ1bmN0aW9uIGFib3J0WGhyKCkge1xuICAgICAgICB4aHIuYWJvcnQoKTtcbiAgICAgIH1cblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgICAgfTtcbiAgICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKTtcbiAgICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHQ7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgZXhwb3J0cy5ET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCByZXF1ZXN0LnVybCwgdHJ1ZSk7XG5cbiAgICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdvbWl0Jykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIgJiYgc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYic7XG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVxdWVzdC5zaWduYWwpIHtcbiAgICAgICAgcmVxdWVzdC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocik7XG5cbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgeGhyLnNlbmQodHlwZW9mIHJlcXVlc3QuX2JvZHlJbml0ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiByZXF1ZXN0Ll9ib2R5SW5pdCk7XG4gICAgfSlcbiAgfVxuXG4gIGZldGNoLnBvbHlmaWxsID0gdHJ1ZTtcblxuICBpZiAoIXNlbGYuZmV0Y2gpIHtcbiAgICBzZWxmLmZldGNoID0gZmV0Y2g7XG4gICAgc2VsZi5IZWFkZXJzID0gSGVhZGVycztcbiAgICBzZWxmLlJlcXVlc3QgPSBSZXF1ZXN0O1xuICAgIHNlbGYuUmVzcG9uc2UgPSBSZXNwb25zZTtcbiAgfVxuXG4gIGV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnM7XG4gIGV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG4gIGV4cG9ydHMuUmVzcG9uc2UgPSBSZXNwb25zZTtcbiAgZXhwb3J0cy5mZXRjaCA9IGZldGNoO1xuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KHt9KSk7XG59KShfX3NlbGZfXyk7XG5kZWxldGUgX19zZWxmX18uZmV0Y2gucG9seWZpbGxcbmV4cG9ydHMgPSBfX3NlbGZfXy5mZXRjaCAvLyBUbyBlbmFibGU6IGltcG9ydCBmZXRjaCBmcm9tICdjcm9zcy1mZXRjaCdcbmV4cG9ydHMuZGVmYXVsdCA9IF9fc2VsZl9fLmZldGNoIC8vIEZvciBUeXBlU2NyaXB0IGNvbnN1bWVycyB3aXRob3V0IGVzTW9kdWxlSW50ZXJvcC5cbmV4cG9ydHMuZmV0Y2ggPSBfX3NlbGZfXy5mZXRjaCAvLyBUbyBlbmFibGU6IGltcG9ydCB7ZmV0Y2h9IGZyb20gJ2Nyb3NzLWZldGNoJ1xuZXhwb3J0cy5IZWFkZXJzID0gX19zZWxmX18uSGVhZGVyc1xuZXhwb3J0cy5SZXF1ZXN0ID0gX19zZWxmX18uUmVxdWVzdFxuZXhwb3J0cy5SZXNwb25zZSA9IF9fc2VsZl9fLlJlc3BvbnNlXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNcbiIsIi8qKlxuICogQGZpbGUgU2V0dGluZ3MgQXBwbGljYXRpb24uXG4gKi9cbmltcG9ydCBTZXR0aW5ncyBmcm9tICcuL3NldHRpbmdzJztcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG5cdG5ldyBTZXR0aW5ncygpO1xufSApO1xuIiwiLyoqXG4gKiBAZmlsZSBjbGFzcyBTZXR0aW5ncy5cbiAqL1xuXG4vKiBnbG9iYWwgQ3lyMkxhdFNldHRpbmdzT2JqZWN0ICovXG5cbmNsYXNzIFNldHRpbmdzIHtcblx0LyoqXG5cdCAqIENsYXNzIGNvbnN0cnVjdG9yLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5PUFRJT05TX0ZPUk1fU0VMRUNUT1IgPSAnI2N0bC1vcHRpb25zJztcblx0XHR0aGlzLkhFQURFUl9TRUxFQ1RPUiA9IHRoaXMuT1BUSU9OU19GT1JNX1NFTEVDVE9SICsgJyBoMic7XG5cdFx0dGhpcy5UQUJMRV9TRUxFQ1RPUiA9IHRoaXMuT1BUSU9OU19GT1JNX1NFTEVDVE9SICsgJyB0YWJsZSc7XG5cdFx0dGhpcy5TVUJNSVRfU0VMRUNUT1IgPSB0aGlzLk9QVElPTlNfRk9STV9TRUxFQ1RPUiArICcgI3N1Ym1pdCc7XG5cdFx0dGhpcy5DT05WRVJUX0ZPUk1fU0VMRUNUT1IgPSAnI2N0bC1jb252ZXJ0LWV4aXN0aW5nLXNsdWdzJztcblx0XHR0aGlzLkNPTlZFUlRfQlVUVE9OX1NFTEVDVE9SID0gJyNjdGwtY29udmVydC1idXR0b24nO1xuXHRcdHRoaXMuQ09ORklSTV9QT1BVUF9TRUxFQ1RPUiA9ICcjY3RsLWNvbmZpcm0tcG9wdXAnO1xuXHRcdHRoaXMuQ09ORklSTV9PS19TRUxFQ1RPUiA9ICcjY3RsLWNvbmZpcm0tb2snO1xuXHRcdHRoaXMuQ09ORklSTV9DQU5DRUxfU0VMRUNUT1IgPSAnI2N0bC1jb25maXJtLWNhbmNlbCc7XG5cdFx0dGhpcy5DVVJSRU5UX1NUVUJfSUQgPSAnY3RsLWN1cnJlbnQnO1xuXHRcdHRoaXMuQ1VSUkVOVF9OQVZfVEFCX0NMQVNTID0gJ25hdi10YWItY3VycmVudCc7XG5cdFx0dGhpcy5BQ1RJVkVfTkFWX1RBQl9DTEFTUyA9ICduYXYtdGFiLWFjdGl2ZSc7XG5cdFx0dGhpcy5BQ1RJVkVfVEFCTEVfQ0xBU1MgPSAnYWN0aXZlJztcblx0XHR0aGlzLkVESVRfTEFCRUxfSUQgPSAnY3RsLWVkaXQtbGFiZWwnO1xuXHRcdHRoaXMuRURJVF9MQUJFTF9FUlJPUl9DTEFTUyA9ICdjdGwtZWRpdC1sYWJlbC1lcnJvcic7XG5cdFx0dGhpcy5wbHVzQnV0dG9uID1cblx0XHRcdCc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGNsYXNzPVwiY29tcG9uZW50cy1idXR0b24gYmxvY2stZWRpdG9yLWluc2VydGVyX190b2dnbGUgaGFzLWljb25cIiBhcmlhLWxhYmVsPVwi0JTQvtCx0LDQstC40YLRjCDQsdC70L7QulwiPicgK1xuXHRcdFx0Jzxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCItMiAtMiAyNCAyNFwiIHJvbGU9XCJpbWdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBmb2N1c2FibGU9XCJmYWxzZVwiPicgK1xuXHRcdFx0JzxwYXRoIGQ9XCJNMTAgMWMtNSAwLTkgNC05IDlzNCA5IDkgOSA5LTQgOS05LTQtOS05LTl6bTAgMTZjLTMuOSAwLTctMy4xLTctN3MzLjEtNyA3LTcgNyAzLjEgNyA3LTMuMSA3LTcgN3ptMS0xMUg5djNINnYyaDN2M2gydi0zaDNWOWgtM1Y2ek0xMCAxYy01IDAtOSA0LTkgOXM0IDkgOSA5IDktNCA5LTktNC05LTktOXptMCAxNmMtMy45IDAtNy0zLjEtNy03czMuMS03IDctNyA3IDMuMSA3IDctMy4xIDctNyA3em0xLTExSDl2M0g2djJoM3YzaDJ2LTNoM1Y5aC0zVjZ6XCI+JyArXG5cdFx0XHQnPC9wYXRoPicgK1xuXHRcdFx0Jzwvc3ZnPicgK1xuXHRcdFx0JzwvYnV0dG9uPic7XG5cdFx0dGhpcy5QTFVTX0NMQVNTID0gJ2N0bC1wbHVzJztcblxuXHRcdHRoaXMub3B0aW9uc0Zvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCB0aGlzLk9QVElPTlNfRk9STV9TRUxFQ1RPUiApO1xuXHRcdHRoaXMudGFibGVzRGF0YSA9IHRoaXMuZ2V0VGFibGVzRGF0YSgpO1xuXHRcdHRoaXMuc3VibWl0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggdGhpcy5TVUJNSVRfU0VMRUNUT1IgKTtcblx0XHR0aGlzLmNvbmZpcm1Qb3B1cCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XHR0aGlzLkNPTkZJUk1fUE9QVVBfU0VMRUNUT1Jcblx0XHQpO1xuXG5cdFx0Ly8gQ29weSB0byBjbGFzcyBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgZXNsaW50IG1hcmtzIHNvbWUgcHJvcGVydGllcyBvZiBnbG9iYWwgb2JqZWN0IGFzIHVucmVzb2x2ZWQuXG5cdFx0dGhpcy5vcHRpb25zU2F2ZVN1Y2Nlc3NNZXNzYWdlID1cblx0XHRcdEN5cjJMYXRTZXR0aW5nc09iamVjdC5vcHRpb25zU2F2ZVN1Y2Nlc3NNZXNzYWdlO1xuXHRcdHRoaXMub3B0aW9uc1NhdmVFcnJvck1lc3NhZ2UgPVxuXHRcdFx0Q3lyMkxhdFNldHRpbmdzT2JqZWN0Lm9wdGlvbnNTYXZlRXJyb3JNZXNzYWdlO1xuXG5cdFx0dGhpcy5hZGRXcmFwcGVyKCk7XG5cdFx0dGhpcy5hZGRNZXNzYWdlTGluZXMoKTtcblx0XHR0aGlzLmFkZEVkaXRMYWJlbElucHV0KCk7XG5cdFx0dGhpcy5oaWRlVGFibGVzKCk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKCk7XG5cdFx0dGhpcy5zZXRTdWJtaXRTdGF0dXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgaGVhZGVycy5cblx0ICpcblx0ICogQHJldHVybiB7KltdfSBIZWFkZXJzLlxuXHQgKi9cblx0Z2V0SGVhZGVycygpIHtcblx0XHRyZXR1cm4gWyAuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCB0aGlzLkhFQURFUl9TRUxFQ1RPUiApIF07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFjdGl2ZSBoZWFkZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge0VsZW1lbnR9IEFjdGl2ZSBoZWFkZXIuXG5cdCAqL1xuXHRnZXRBY3RpdmVIZWFkZXIoKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XHR0aGlzLkhFQURFUl9TRUxFQ1RPUiArICcuJyArIHRoaXMuQUNUSVZFX05BVl9UQUJfQ0xBU1Ncblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhY3RpdmUgaW5kZXguXG5cdCAqXG5cdCAqIEByZXR1cm4geyp9IEFjdGl2ZSBpbmRleC5cblx0ICovXG5cdGdldEFjdGl2ZUluZGV4KCkge1xuXHRcdHJldHVybiB0aGlzLmdldEFjdGl2ZUhlYWRlcigpLmRhdGFzZXQuaW5kZXg7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRhYmxlcy5cblx0ICpcblx0ICogQHJldHVybiB7KltdfSBUYWJsZXMuXG5cdCAqL1xuXHRnZXRUYWJsZXMoKSB7XG5cdFx0cmV0dXJuIFsgLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggdGhpcy5UQUJMRV9TRUxFQ1RPUiApIF07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFjdGl2ZSB0YWJsZS5cblx0ICpcblx0ICogQHJldHVybiB7RWxlbWVudH0gQWN0aXZlIHRhYmxlLlxuXHQgKi9cblx0Z2V0QWN0aXZlVGFibGUoKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XHR0aGlzLlRBQkxFX1NFTEVDVE9SICsgJy4nICsgdGhpcy5BQ1RJVkVfVEFCTEVfQ0xBU1Ncblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBpbnB1dHMuXG5cdCAqXG5cdCAqIEByZXR1cm4geypbXX0gSW5wdXRzLlxuXHQgKi9cblx0Z2V0SW5wdXRzKCkge1xuXHRcdHJldHVybiBbXG5cdFx0XHQuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdFx0XHR0aGlzLk9QVElPTlNfRk9STV9TRUxFQ1RPUiArICcgaW5wdXQnXG5cdFx0XHQpLFxuXHRcdF07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGxhYmVscy5cblx0ICpcblx0ICogQHJldHVybiB7KltdfSBMYWJlbHMuXG5cdCAqL1xuXHRnZXRMYWJlbHMoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdC4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG5cdFx0XHRcdHRoaXMuT1BUSU9OU19GT1JNX1NFTEVDVE9SICsgJyBsYWJlbCdcblx0XHRcdCksXG5cdFx0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgcGx1cyBidXR0b25zLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHsqW119IFBsdXMgYnV0dG9ucy5cblx0ICovXG5cdGdldFBsdXNCdXR0b25zKCkge1xuXHRcdHJldHVybiBbXG5cdFx0XHQuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdFx0XHR0aGlzLk9QVElPTlNfRk9STV9TRUxFQ1RPUiArICcgLicgKyB0aGlzLlBMVVNfQ0xBU1Ncblx0XHRcdCksXG5cdFx0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBvZiBhY3RpdmUgdGFibGUgd2FzIGNoYW5nZWQuXG5cdCAqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IElmIGFjdGl2ZSB0YWJsZSB3YXMgY2hhbmdlZC5cblx0ICovXG5cdGlzQWN0aXZlVGFibGVDaGFuZ2VkKCkge1xuXHRcdGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdEpTT04uc3RyaW5naWZ5KCB0aGlzLmdldEFjdGl2ZVRhYmxlRGF0YSgpICkgIT09XG5cdFx0XHRKU09OLnN0cmluZ2lmeSggdGhpcy50YWJsZXNEYXRhWyBhY3RpdmVJbmRleCBdIClcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBzdGF0dXMgb2Ygc3VibWl0IGJ1dHRvbi5cblx0ICovXG5cdHNldFN1Ym1pdFN0YXR1cygpIHtcblx0XHR0aGlzLnN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9ICEgdGhpcy5pc0FjdGl2ZVRhYmxlQ2hhbmdlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmUgYWN0aXZlIHRhYmxlLlxuXHQgKi9cblx0c2F2ZUFjdGl2ZVRhYmxlKCkge1xuXHRcdGlmICggISB0aGlzLmlzQWN0aXZlVGFibGVDaGFuZ2VkKCkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWN0aXZlVGFibGUgPSB0aGlzLmdldEFjdGl2ZVRhYmxlKCk7XG5cblx0XHRjb25zdCBhY3RpdmVGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2Zvcm0nICk7XG5cdFx0YWN0aXZlRm9ybS5hY3Rpb24gPSB0aGlzLm9wdGlvbnNGb3JtLmdldEF0dHJpYnV0ZSggJ2FjdGlvbicgKTtcblx0XHRhY3RpdmVGb3JtLm1ldGhvZCA9IHRoaXMub3B0aW9uc0Zvcm0ubWV0aG9kO1xuXHRcdGFjdGl2ZUZvcm0uYXBwZW5kQ2hpbGQoIGFjdGl2ZVRhYmxlLmNsb25lTm9kZSggdHJ1ZSApICk7XG5cblx0XHRjb25zdCBhY3RpdmVJbnB1dHMgPSBbIC4uLmFjdGl2ZVRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoICdpbnB1dCcgKSBdO1xuXHRcdGFjdGl2ZUlucHV0cy5tYXAoICggaW5wdXQgKSA9PiB7XG5cdFx0XHRyZXR1cm4gKCBhY3RpdmVGb3JtLnF1ZXJ5U2VsZWN0b3IoICcjJyArIGlucHV0LmlkICkudmFsdWUgPVxuXHRcdFx0XHRpbnB1dC52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHRcdGNvbnN0IGhpZGRlbklucHV0cyA9IFtcblx0XHRcdC4uLnRoaXMub3B0aW9uc0Zvcm0ucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W3R5cGU9XCJoaWRkZW5cIl0nICksXG5cdFx0XTtcblx0XHRoaWRkZW5JbnB1dHMubWFwKCAoIGlucHV0ICkgPT4ge1xuXHRcdFx0cmV0dXJuIGFjdGl2ZUZvcm0uYXBwZW5kQ2hpbGQoIGlucHV0LmNsb25lTm9kZSggdHJ1ZSApICk7XG5cdFx0fSApO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGFjdGl2ZUZvcm0gKTtcblxuXHRcdHJldHVybiBmZXRjaCggdGhpcy5vcHRpb25zRm9ybS5nZXRBdHRyaWJ1dGUoICdhY3Rpb24nICksIHtcblx0XHRcdG1ldGhvZDogYWN0aXZlRm9ybS5tZXRob2QsXG5cdFx0XHRib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKCBbIC4uLm5ldyBGb3JtRGF0YSggYWN0aXZlRm9ybSApIF0gKSxcblx0XHR9IClcblx0XHRcdC50aGVuKCAoIHJlc3BvbnNlICkgPT4ge1xuXHRcdFx0XHRpZiAoIHJlc3BvbnNlLm9rICkge1xuXHRcdFx0XHRcdHRoaXMuc2hvd01lc3NhZ2UoXG5cdFx0XHRcdFx0XHR0aGlzLnN1Y2Nlc3NNZXNzYWdlLFxuXHRcdFx0XHRcdFx0dGhpcy5vcHRpb25zU2F2ZVN1Y2Nlc3NNZXNzYWdlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR0aGlzLnRhYmxlc0RhdGEgPSB0aGlzLmdldFRhYmxlc0RhdGEoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnNob3dNZXNzYWdlKFxuXHRcdFx0XHRcdFx0dGhpcy5lcnJvck1lc3NhZ2UsXG5cdFx0XHRcdFx0XHR0aGlzLm9wdGlvbnNTYXZlRXJyb3JNZXNzYWdlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXNwb25zZS5qc29uKCk7XG5cdFx0XHR9IClcblx0XHRcdC5maW5hbGx5KCAoKSA9PiB7XG5cdFx0XHRcdGFjdGl2ZUZvcm0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggYWN0aXZlRm9ybSApO1xuXHRcdFx0XHR0aGlzLnNldFN1Ym1pdFN0YXR1cygpO1xuXHRcdFx0fSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0YWJsZSBkYXRhLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IHRhYmxlIFRhYmxlLlxuXHQgKiBAcmV0dXJuIHt7fVtdfSBUYWJsZSBkYXRhLlxuXHQgKi9cblx0Z2V0VGFibGVEYXRhKCB0YWJsZSApIHtcblx0XHRjb25zdCBpbnB1dHMgPSBbIC4uLnRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoICdpbnB1dCcgKSBdO1xuXG5cdFx0Y29uc3QgZGF0YSA9IHt9O1xuXHRcdGlucHV0cy5mb3JFYWNoKCAoIGlucHV0ICkgPT4ge1xuXHRcdFx0Y29uc3QgbGFiZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuXHRcdFx0XHR0aGlzLk9QVElPTlNfRk9STV9TRUxFQ1RPUiArICcgbGFiZWxbZm9yPVwiJyArIGlucHV0LmlkICsgJ1wiXSdcblx0XHRcdCk7XG5cblx0XHRcdGRhdGFbIGxhYmVsLmlubmVySFRNTCBdID0gaW5wdXQudmFsdWU7XG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGRhdGEgZnJvbSBhbGwgdGFibGVzLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHt7fVtdW119IERhdGEgZnJvbSBhbGwgdGFibGVzLlxuXHQgKi9cblx0Z2V0VGFibGVzRGF0YSgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUYWJsZXMoKS5tYXAoICggdGFibGUgKSA9PiB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRUYWJsZURhdGEoIHRhYmxlICk7XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhY3RpdmUgdGFibGUgZGF0YS5cblx0ICpcblx0ICogQHJldHVybiB7e31bXX0gQWN0aXZlIHRhYmxlIGRhdGEuXG5cdCAqL1xuXHRnZXRBY3RpdmVUYWJsZURhdGEoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VGFibGVEYXRhKCB0aGlzLmdldEFjdGl2ZVRhYmxlKCkgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgd3JhcHBlci5cblx0ICovXG5cdGFkZFdyYXBwZXIoKSB7XG5cdFx0dGhpcy53cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3VsJyApO1xuXHRcdHRoaXMud3JhcHBlci5jbGFzc0xpc3QuYWRkKCAnbmF2LXRhYi13cmFwcGVyJyApO1xuXHRcdHRoaXMub3B0aW9uc0Zvcm0uaW5zZXJ0QmVmb3JlKFxuXHRcdFx0dGhpcy53cmFwcGVyLFxuXHRcdFx0dGhpcy5vcHRpb25zRm9ybS5maXJzdENoaWxkXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgbWVzc2FnZSBsaW5lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgTWVzc2FnZSBpZC5cblx0ICogQHJldHVybiB7SFRNTERpdkVsZW1lbnR9IE1lc3NhZ2UgbGluZS5cblx0ICovXG5cdGFkZE1lc3NhZ2VMaW5lKCBpZCApIHtcblx0XHRjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcblx0XHRtZXNzYWdlLmlkID0gaWQ7XG5cdFx0dGhpcy5vcHRpb25zRm9ybS5pbnNlcnRCZWZvcmUoIG1lc3NhZ2UsIHRoaXMub3B0aW9uc0Zvcm0uZmlyc3RDaGlsZCApO1xuXG5cdFx0cmV0dXJuIG1lc3NhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHN1Y2Nlc3MgYW5kIGVycm9yIG1lc3NhZ2UgbGluZXMuXG5cdCAqL1xuXHRhZGRNZXNzYWdlTGluZXMoKSB7XG5cdFx0dGhpcy5zdWNjZXNzTWVzc2FnZSA9IHRoaXMuYWRkTWVzc2FnZUxpbmUoICdjdGwtc3VjY2VzcycgKTtcblx0XHR0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuYWRkTWVzc2FnZUxpbmUoICdjdGwtZXJyb3InICk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGVkaXQgbGFiZWwgaW5wdXQuXG5cdCAqL1xuXHRhZGRFZGl0TGFiZWxJbnB1dCgpIHtcblx0XHR0aGlzLmVkaXRMYWJlbElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2lucHV0JyApO1xuXHRcdHRoaXMuZWRpdExhYmVsSW5wdXQuaWQgPSB0aGlzLkVESVRfTEFCRUxfSUQ7XG5cdFx0dGhpcy5lZGl0TGFiZWxJbnB1dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIHRoaXMuZWRpdExhYmVsSW5wdXQgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIaWRlIGVkaXQgbGFiZWwgaW5wdXQuXG5cdCAqL1xuXHRoaWRlRWRpdExhYmVsSW5wdXQoKSB7XG5cdFx0dGhpcy5lZGl0TGFiZWxJbnB1dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdHRoaXMuZWRpdExhYmVsSW5wdXQuY2xhc3NMaXN0LnJlbW92ZSggdGhpcy5FRElUX0xBQkVMX0VSUk9SX0NMQVNTICk7XG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggdGhpcy5lZGl0TGFiZWxJbnB1dCApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBsYXN0IGNlbGwgaW4gYWN0aXZlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtFbGVtZW50fSBMYXN0IGNlbGwuXG5cdCAqL1xuXHRnZXRMYXN0Q2VsbCgpIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihcblx0XHRcdHRoaXMuT1BUSU9OU19GT1JNX1NFTEVDVE9SICtcblx0XHRcdFx0JyAuJyArXG5cdFx0XHRcdHRoaXMuQUNUSVZFX1RBQkxFX0NMQVNTICtcblx0XHRcdFx0JyAuJyArXG5cdFx0XHRcdHRoaXMuUExVU19DTEFTU1xuXHRcdCkucHJldmlvdXNFbGVtZW50U2libGluZztcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgbmV3IGNlbGwgdG8gdGhlIGFjdGl2ZSB0YWJsZS5cblx0ICovXG5cdGFkZENlbGwoKSB7XG5cdFx0bGV0IGxhc3RDZWxsID0gdGhpcy5nZXRMYXN0Q2VsbCgpO1xuXHRcdGxhc3RDZWxsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKFxuXHRcdFx0bGFzdENlbGwuY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRsYXN0Q2VsbC5uZXh0RWxlbWVudFNpYmxpbmdcblx0XHQpO1xuXG5cdFx0bGFzdENlbGwgPSB0aGlzLmdldExhc3RDZWxsKCk7XG5cdFx0Y29uc3QgbGFiZWwgPSBsYXN0Q2VsbC5xdWVyeVNlbGVjdG9yKCAnbGFiZWwnICk7XG5cdFx0Y29uc3QgaW5wdXQgPSBsYXN0Q2VsbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQnICk7XG5cblx0XHRjb25zdCBpZEFyciA9IGlucHV0LmlkLnNwbGl0KCAnLScgKTtcblx0XHRjb25zdCBuZXdJZCA9IGlkQXJyWyAwIF0gKyAnLScgKyAoIHBhcnNlSW50KCBpZEFyclsgMSBdICkgKyAxICk7XG5cblx0XHRsYWJlbC5odG1sRm9yID0gbmV3SWQ7XG5cdFx0bGFiZWwuaW5uZXJIVE1MID0gJyc7XG5cblx0XHRpbnB1dC5pZCA9IG5ld0lkO1xuXHRcdGlucHV0LnZhbHVlID0gJyc7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCAndmFsdWUnLCAnJyApO1xuXHRcdHRoaXMucmVwbGFjZU5hbWUoIGlucHV0LCAnJyApO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKCk7XG5cblx0XHR0aGlzLmVkaXRMYWJlbCggbGFiZWwgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIaWRlIGNvbnZlcnNpb24gdGFibGVzIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLlxuXHQgKiBDcmVhdGUgbmF2aWdhdGlvbiB0YWJzLlxuXHQgKi9cblx0aGlkZVRhYmxlcygpIHtcblx0XHRsZXQgY3VycmVudEluZGV4ID0gMDtcblxuXHRcdHRoaXMuZ2V0VGFibGVzKCkubWFwKCAoIHRhYmxlLCBpbmRleCApID0+IHtcblx0XHRcdHRhYmxlLmNsYXNzTGlzdC5hZGQoICdjdGwtdGFibGUnICk7XG5cblx0XHRcdGlmICggdGhpcy5DVVJSRU5UX1NUVUJfSUQgPT09IHRhYmxlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQgKSB7XG5cdFx0XHRcdGN1cnJlbnRJbmRleCA9IGluZGV4O1xuXHRcdFx0XHR0YWJsZS5jbGFzc0xpc3QuYWRkKCB0aGlzLkFDVElWRV9UQUJMRV9DTEFTUyApO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBwbHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcblx0XHRcdHBsdXMuY2xhc3NMaXN0LmFkZCggdGhpcy5QTFVTX0NMQVNTICk7XG5cdFx0XHRwbHVzLmlubmVySFRNTCA9IHRoaXMucGx1c0J1dHRvbjtcblx0XHRcdHRhYmxlLnF1ZXJ5U2VsZWN0b3IoICd0ZCcgKS5hcHBlbmRDaGlsZCggcGx1cyApO1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9ICk7XG5cblx0XHR0aGlzLmdldEhlYWRlcnMoKS5tYXAoICggaGVhZGVyLCBpbmRleCApID0+IHtcblx0XHRcdGhlYWRlci5jbGFzc0xpc3QuYWRkKCAnbmF2LXRhYicgKTtcblx0XHRcdGhlYWRlci5kYXRhc2V0LmluZGV4ID0gaW5kZXg7XG5cblx0XHRcdHRoaXMud3JhcHBlci5hcHBlbmRDaGlsZCggaGVhZGVyICk7XG5cdFx0XHRpZiAoIGluZGV4ID09PSBjdXJyZW50SW5kZXggKSB7XG5cdFx0XHRcdGhlYWRlci5jbGFzc0xpc3QuYWRkKCB0aGlzLkNVUlJFTlRfTkFWX1RBQl9DTEFTUyApO1xuXHRcdFx0XHRoZWFkZXIuY2xhc3NMaXN0LmFkZCggdGhpcy5BQ1RJVkVfTkFWX1RBQl9DTEFTUyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9ICk7XG5cdH1cblxuXHQvKipcblx0ICogQmluZCBldmVudHMgdG8gbWV0aG9kcy5cblx0ICovXG5cdGJpbmRFdmVudHMoKSB7XG5cdFx0dGhpcy5nZXRIZWFkZXJzKCkubWFwKCAoIGhlYWRlciwgaSwgaGVhZGVycyApID0+IHtcblx0XHRcdGhlYWRlci5vbmNsaWNrID0gKCBldmVudCApID0+IHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmluZGV4O1xuXHRcdFx0XHRjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0QWN0aXZlSW5kZXgoKTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ID09PSBhY3RpdmVJbmRleCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNhdmVBY3RpdmVUYWJsZSgpO1xuXG5cdFx0XHRcdGhlYWRlcnMubWFwKCAoIGFIZWFkZXIgKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGFIZWFkZXIuY2xhc3NMaXN0LnJlbW92ZShcblx0XHRcdFx0XHRcdHRoaXMuQUNUSVZFX05BVl9UQUJfQ0xBU1Ncblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGhlYWRlcnNbIGluZGV4IF0uY2xhc3NMaXN0LmFkZCggdGhpcy5BQ1RJVkVfTkFWX1RBQl9DTEFTUyApO1xuXG5cdFx0XHRcdGNvbnN0IHRhYmxlcyA9IHRoaXMuZ2V0VGFibGVzKCk7XG5cdFx0XHRcdHRhYmxlcy5tYXAoICggdGFibGUgKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRhYmxlLmNsYXNzTGlzdC5yZW1vdmUoIHRoaXMuQUNUSVZFX1RBQkxFX0NMQVNTICk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0dGFibGVzWyBpbmRleCBdLmNsYXNzTGlzdC5hZGQoIHRoaXMuQUNUSVZFX1RBQkxFX0NMQVNTICk7XG5cblx0XHRcdFx0dGhpcy5zZXRTdWJtaXRTdGF0dXMoKTtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9ICk7XG5cblx0XHR0aGlzLmdldElucHV0cygpLm1hcCggKCBpbnB1dCApID0+IHtcblx0XHRcdGlucHV0Lm9uaW5wdXQgPSAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc2V0U3VibWl0U3RhdHVzKCk7XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9ICk7XG5cblx0XHR0aGlzLmdldExhYmVscygpLm1hcCggKCBsYWJlbCApID0+IHtcblx0XHRcdGxhYmVsLm9uY2xpY2sgPSAoIGV2ZW50ICkgPT4ge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR0aGlzLmVkaXRMYWJlbCggZXZlbnQudGFyZ2V0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0gKTtcblxuXHRcdHRoaXMuZWRpdExhYmVsSW5wdXQub25ibHVyID0gKCkgPT4ge1xuXHRcdFx0dGhpcy5zYXZlTGFiZWwoKTtcblx0XHR9O1xuXG5cdFx0dGhpcy5lZGl0TGFiZWxJbnB1dC5vbmtleXVwID0gKCBlICkgPT4ge1xuXHRcdFx0aWYgKCAnRXNjYXBlJyA9PT0gZS5rZXkgKSB7XG5cdFx0XHRcdHRoaXMuc2F2ZUxhYmVsKCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggJ0VudGVyJyA9PT0gZS5rZXkgKSB7XG5cdFx0XHRcdHRoaXMuc2F2ZUxhYmVsKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuZ2V0UGx1c0J1dHRvbnMoKS5tYXAoICggcGx1cyApID0+IHtcblx0XHRcdHBsdXMub25jbGljayA9ICggZXZlbnQgKSA9PiB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdHRoaXMuYWRkQ2VsbCggZXZlbnQudGFyZ2V0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0gKTtcblxuXHRcdHRoaXMuc3VibWl0QnV0dG9uLm9uY2xpY2sgPSAoIGV2ZW50ICkgPT4ge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMuc2F2ZUFjdGl2ZVRhYmxlKCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHRoaXMuQ09OVkVSVF9CVVRUT05fU0VMRUNUT1IgKS5vbmNsaWNrID0gKFxuXHRcdFx0ZXZlbnRcblx0XHQpID0+IHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR0aGlzLmNvbmZpcm1Qb3B1cC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0dGhpcy5jb25maXJtUG9wdXAub25jbGljayA9ICgpID0+IHtcblx0XHRcdHRoaXMuaGlkZUNvbmZpcm1Qb3B1cCgpO1xuXHRcdH07XG5cblx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCB0aGlzLkNPTkZJUk1fT0tfU0VMRUNUT1IgKS5vbmNsaWNrID0gKFxuXHRcdFx0ZXZlbnRcblx0XHQpID0+IHtcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0dGhpcy5oaWRlQ29uZmlybVBvcHVwKCk7XG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCB0aGlzLkNPTlZFUlRfRk9STV9TRUxFQ1RPUiApLnN1Ym1pdCgpO1xuXHRcdH07XG5cblx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCB0aGlzLkNPTkZJUk1fQ0FOQ0VMX1NFTEVDVE9SICkub25jbGljayA9IChcblx0XHRcdGV2ZW50XG5cdFx0KSA9PiB7XG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdHRoaXMuaGlkZUNvbmZpcm1Qb3B1cCgpO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogSGlkZSBjb25maXJtYXRpb24gcG9wdXAuXG5cdCAqL1xuXHRoaWRlQ29uZmlybVBvcHVwKCkge1xuXHRcdHRoaXMuY29uZmlybVBvcHVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdH1cblxuXHQvKipcblx0ICogRWRpdCBsYWJlbC5cblx0ICpcblx0ICogQHBhcmFtIHtFbGVtZW50fSBsYWJlbCBMYWJlbCB0byBlZGl0LlxuXHQgKi9cblx0ZWRpdExhYmVsKCBsYWJlbCApIHtcblx0XHRsYWJlbC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKCB0aGlzLmVkaXRMYWJlbElucHV0ICk7XG5cdFx0dGhpcy5lZGl0TGFiZWxJbnB1dC52YWx1ZSA9IGxhYmVsLmlubmVySFRNTDtcblxuXHRcdHRoaXMuZWRpdExhYmVsSW5wdXQuY2xhc3NMaXN0LnJlbW92ZSggdGhpcy5FRElUX0xBQkVMX0VSUk9SX0NMQVNTICk7XG5cdFx0dGhpcy5lZGl0TGFiZWxJbnB1dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHR0aGlzLmVkaXRMYWJlbElucHV0LmZvY3VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogSXMgbmV3IHZhbHVlIG9mIGVkaXRlZCBsYWJlbCB1bmlxdWUgaW4gYWN0aXZlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmV3VmFsdWUgTmV3IFZhbHVlIGZyb20gZWRpdGVkIGxhYmVsLlxuXHQgKiBAcmV0dXJuIHsqfSBJZiBuZXcgdmFsdWUgb2YgZWRpdGVkIGxhYmVsIGlzIHVuaXF1ZSBpbiBhY3RpdmUgdGFibGUuXG5cdCAqL1xuXHRpc1VuaXF1ZUxhYmVsKCBuZXdWYWx1ZSApIHtcblx0XHRyZXR1cm4gWyAuLi50aGlzLmdldEFjdGl2ZVRhYmxlKCkucXVlcnlTZWxlY3RvckFsbCggJ2xhYmVsJyApIF0ucmVkdWNlKFxuXHRcdFx0KCBhY2MsIGxhYmVsICkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWNjICYmIGxhYmVsLmlubmVySFRNTCAhPT0gbmV3VmFsdWU7XG5cdFx0XHR9LFxuXHRcdFx0dHJ1ZVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZSBtb2RpZmllZCBsYWJlbC5cblx0ICpcblx0ICogQHBhcmFtIHtib29sZWFufSBjYW5jZWwgQ2FuY2VsLlxuXHQgKi9cblx0c2F2ZUxhYmVsKCBjYW5jZWwgPSBmYWxzZSApIHtcblx0XHRpZiAoICdub25lJyA9PT0gdGhpcy5lZGl0TGFiZWxJbnB1dC5zdHlsZS5kaXNwbGF5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5lZGl0TGFiZWxJbnB1dC52YWx1ZS50cmltKCk7XG5cblx0XHRpZiAoICcnID09PSBuZXdWYWx1ZSApIHtcblx0XHRcdGNvbnN0IGVkaXRlZENlbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggdGhpcy5FRElUX0xBQkVMX0lEIClcblx0XHRcdFx0LnBhcmVudEVsZW1lbnQ7XG5cdFx0XHR0aGlzLmhpZGVFZGl0TGFiZWxJbnB1dCgpO1xuXHRcdFx0ZWRpdGVkQ2VsbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlZGl0ZWRDZWxsICk7XG5cdFx0XHR0aGlzLnNldFN1Ym1pdFN0YXR1cygpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbGFiZWwgPSB0aGlzLmVkaXRMYWJlbElucHV0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvciggJ2xhYmVsJyApO1xuXHRcdGlmICggY2FuY2VsIHx8IG5ld1ZhbHVlID09PSBsYWJlbC5pbm5lckhUTUwgKSB7XG5cdFx0XHR0aGlzLmhpZGVFZGl0TGFiZWxJbnB1dCgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAhIHRoaXMuaXNVbmlxdWVMYWJlbCggbmV3VmFsdWUgKSApIHtcblx0XHRcdHRoaXMuZWRpdExhYmVsSW5wdXQuY2xhc3NMaXN0LmFkZCggdGhpcy5FRElUX0xBQkVMX0VSUk9SX0NMQVNTICk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpbnB1dCA9IHRoaXMuZWRpdExhYmVsSW5wdXQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCAnaW5wdXQnICk7XG5cblx0XHR0aGlzLmhpZGVFZGl0TGFiZWxJbnB1dCgpO1xuXG5cdFx0bGFiZWwuaW5uZXJIVE1MID0gbmV3VmFsdWU7XG5cdFx0dGhpcy5yZXBsYWNlTmFtZSggaW5wdXQsIG5ld1ZhbHVlICk7XG5cblx0XHR0aGlzLnNldFN1Ym1pdFN0YXR1cygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2UgaW5wdXQgbmFtZSBhY2NvcmRpbmcgdG8gdGhlIG5ldyBsYWJlbCB2YWx1ZS5cblx0ICpcblx0ICogQHBhcmFtIHtFbGVtZW50fSBpbnB1dCBJbnB1dFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmV3VmFsdWUgTmV3IGxhYmVsIHZhbHVlXG5cdCAqL1xuXHRyZXBsYWNlTmFtZSggaW5wdXQsIG5ld1ZhbHVlICkge1xuXHRcdC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuXHRcdGlucHV0Lm5hbWUgPSBpbnB1dC5uYW1lLnJlcGxhY2UoXG5cdFx0XHQvKC4rXFxbLitdKVxcWy4qXS9nLFxuXHRcdFx0JyQxWycgKyBuZXdWYWx1ZSArICddJ1xuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgbWVzc2FnZS5cblx0ICpcblx0ICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gbWVzc2FnZSBNZXNzYWdlLlxuXHQgKi9cblx0Y2xlYXJNZXNzYWdlKCBtZXNzYWdlICkge1xuXHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJyc7XG5cdFx0bWVzc2FnZS5jbGFzc0xpc3QucmVtb3ZlKCAnYWN0aXZlJyApO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIG1lc3NhZ2VzLlxuXHQgKi9cblx0Y2xlYXJNZXNzYWdlcygpIHtcblx0XHR0aGlzLmNsZWFyTWVzc2FnZSggdGhpcy5zdWNjZXNzTWVzc2FnZSApO1xuXHRcdHRoaXMuY2xlYXJNZXNzYWdlKCB0aGlzLmVycm9yTWVzc2FnZSApO1xuXHRcdGNsZWFyVGltZW91dCggdGhpcy5tc2dUaW1lciApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3cgbWVzc2FnZS5cblx0ICpcblx0ICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gZWwgRWxlbWVudC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZS5cblx0ICovXG5cdHNob3dNZXNzYWdlKCBlbCwgbWVzc2FnZSApIHtcblx0XHRlbC5pbm5lckhUTUwgPSBtZXNzYWdlO1xuXHRcdGVsLmNsYXNzTGlzdC5hZGQoICdhY3RpdmUnICk7XG5cblx0XHR0aGlzLm1zZ1RpbWVyID0gc2V0VGltZW91dCggKCkgPT4ge1xuXHRcdFx0dGhpcy5jbGVhck1lc3NhZ2VzKCk7XG5cdFx0fSwgNTAwMCApO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNldHRpbmdzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
languages/cyr2lat-ru_RU.mo CHANGED
Binary file
languages/cyr2lat-ru_RU.po CHANGED
@@ -1,19 +1,19 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: Cyr To Lat\n"
4
- "POT-Creation-Date: 2020-05-19 22:53+0300\n"
5
- "PO-Revision-Date: 2020-05-19 22:55+0300\n"
6
  "Last-Translator: KAGG Design <info@kagg.eu>\n"
7
  "Language-Team: KAGG Design\n"
8
  "Language: ru_RU\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.3.1\n"
13
  "X-Poedit-Basepath: ..\n"
14
  "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
  "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
16
- "X-Poedit-KeywordsList: __;esc_html__;esc_attr__\n"
17
  "X-Poedit-Flags-xgettext: --add-comments\n"
18
  "X-Poedit-SearchPath-0: .\n"
19
  "X-Poedit-SearchPathExcluded-0: .git\n"
@@ -28,85 +28,85 @@ msgstr ""
28
  "X-Poedit-SearchPathExcluded-9: tests\n"
29
  "X-Poedit-SearchPathExcluded-10: vendor\n"
30
 
31
- #: classes/background-processes/class-post-conversion-process.php:72
32
  msgid "Post slug converted:"
33
  msgstr "Ярлык поста сконвертирован:"
34
 
35
- #: classes/background-processes/class-post-conversion-process.php:101
36
  msgid "Attachment file converted:"
37
  msgstr "Файл вложения сконвертирован:"
38
 
39
- #: classes/background-processes/class-post-conversion-process.php:107
40
  msgid "Cannot convert attachment file for attachment id:"
41
  msgstr "Невозможно сконвертировать файл вложения для вложения с id:"
42
 
43
- #: classes/background-processes/class-post-conversion-process.php:125
44
  msgid "Thumbnail file renamed:"
45
  msgstr "Файл миниатюры переименован:"
46
 
47
- #: classes/background-processes/class-post-conversion-process.php:128
48
  msgid "Cannot rename thumbnail file:"
49
  msgstr "Невозможно переименовать файл миниатюры:"
50
 
51
- #: classes/background-processes/class-post-conversion-process.php:197
52
  msgid "Post slugs conversion completed."
53
  msgstr "Конвертация ярлыков постов завершена."
54
 
55
- #: classes/background-processes/class-term-conversion-process.php:71
56
  msgid "Term slug converted:"
57
  msgstr "Ярлык термина сконвертирован:"
58
 
59
- #: classes/background-processes/class-term-conversion-process.php:83
60
  msgid "Term slugs conversion completed."
61
  msgstr "Конвертация ярлыков терминов завершена."
62
 
63
- #: classes/class-converter.php:115
64
  msgid "Cyr To Lat converts existing post slugs in the background process."
65
  msgstr "Cyr To Lat конвертирует существующие ярлыки постов в фоновом процессе."
66
 
67
- #: classes/class-converter.php:122
68
  msgid "Cyr To Lat converts existing term slugs in the background process."
69
  msgstr ""
70
  "Cyr To Lat конвертирует существующие ярлыки терминов в фоновом процессе."
71
 
72
- #: classes/class-converter.php:129
73
  msgid "Cyr To Lat completed conversion of existing post slugs."
74
  msgstr "Cyr To Lat завершил конвертацию существующих ярлыков постов."
75
 
76
- #: classes/class-converter.php:136
77
  msgid "Cyr To Lat completed conversion of existing term slugs."
78
  msgstr "Cyr To Lat завершил конвертацию существующих ярлыков терминов."
79
 
80
- #: classes/class-converter.php:214
81
  msgid "Cyr To Lat has not found existing post slugs for conversion."
82
  msgstr "Cyr To Lat не нашёл существующих ярлыков постов для конвертации."
83
 
84
- #: classes/class-converter.php:226
85
  msgid "Post slugs conversion started."
86
  msgstr "Начата конвертация ярлыков постов."
87
 
88
- #: classes/class-converter.php:228
89
  msgid "Cyr To Lat started conversion of existing post slugs."
90
  msgstr "Cyr To Lat начал конвертацию существующих ярлыков постов."
91
 
92
- #: classes/class-converter.php:253
93
  msgid "Cyr To Lat has not found existing term slugs for conversion."
94
  msgstr "Cyr To Lat не нашёл существующих ярлыков терминов для конвертации."
95
 
96
- #: classes/class-converter.php:265
97
  msgid "Term slugs conversion started."
98
  msgstr "Начата конвертация ярлыков терминов."
99
 
100
- #: classes/class-converter.php:267
101
  msgid "Cyr To Lat started conversion of existing term slugs."
102
  msgstr "Cyr To Lat начал конвертацию существующих ярлыков терминов."
103
 
104
- #: classes/class-requirements.php:99
105
  msgid "Cyr To Lat plugin has been deactivated."
106
  msgstr "Плагин Cyr To Lat был деактивирован."
107
 
108
  #. translators: 1: Current PHP version number, 2: Cyr To Lat version, 3: Minimum required PHP version number
109
- #: classes/class-requirements.php:113
110
  #, php-format
111
  msgid ""
112
  "Your server is running PHP version %1$s but Cyr To Lat %2$s requires at "
@@ -115,12 +115,12 @@ msgstr ""
115
  "На сервере установлен PHP версии %1$s, однако для Cyr To Lat %2$s требуется "
116
  "хотя бы %3$s."
117
 
118
- #: classes/class-requirements.php:134
119
  msgid "Unable to get filesystem access."
120
  msgstr "Невозможно получить доступ к файловой системе."
121
 
122
  #. translators: 1: max_input_vars value, 2: Cyr To Lat version, 3: Minimum required max_input_vars
123
- #: classes/class-requirements.php:151
124
  #, php-format
125
  msgid ""
126
  "Your server is running PHP with max_input_vars=%1$d but Cyr To Lat %2$s "
@@ -130,22 +130,22 @@ msgstr ""
130
  "требуется хотя бы %3$d."
131
 
132
  #. translators: 1: .user.ini filename
133
- #: classes/class-requirements.php:155
134
  #, php-format
135
  msgid "We have updated settings in %s."
136
  msgstr "Мы обновили настройки в %s."
137
 
138
  #. translators: 1: Wait time in seconds
139
- #: classes/class-requirements.php:158
140
  #, php-format
141
  msgid "Please try again in %d s."
142
  msgstr "Пожалуйста, попробуйте снова через %d сек."
143
 
144
- #: classes/class-requirements.php:224
145
  msgid "Please increase max input vars limit up to 1500."
146
  msgstr "Пожалуйста, увеличьте лимит max input vars до 1500."
147
 
148
- #: classes/class-requirements.php:227
149
  msgid ""
150
  "See: <a href=\"http://sevenspark.com/docs/ubermenu-3/faqs/menu-item-limit\" "
151
  "target=\"_blank\">Increasing max input vars limit.</a>"
@@ -153,101 +153,131 @@ msgstr ""
153
  "См.: <a href=\"http://sevenspark.com/docs/ubermenu-3/faqs/menu-item-limit\" "
154
  "target=\"_blank\">Увеличение лимита max input vars.</a>"
155
 
156
- #: classes/class-settings.php:129
157
  msgid "View Cyr To Lat settings"
158
  msgstr "Посмотреть настройки Cyr To Lat"
159
 
160
- #: classes/class-settings.php:130
161
  msgid "Settings"
162
  msgstr "Настройки"
163
 
164
- #: classes/class-settings.php:146
165
  msgid "ISO9 Table"
166
  msgstr "Таблица ISO9"
167
 
168
- #: classes/class-settings.php:149
169
  msgid "bel Table"
170
  msgstr "Таблица bel"
171
 
172
- #: classes/class-settings.php:152
173
  msgid "uk Table"
174
  msgstr "Таблица uk"
175
 
176
- #: classes/class-settings.php:155
177
  msgid "bg_BG Table"
178
  msgstr "Таблица bg_BG"
179
 
180
- #: classes/class-settings.php:158
181
  msgid "mk_MK Table"
182
  msgstr "Таблица mk_MK"
183
 
184
- #: classes/class-settings.php:161
185
  msgid "sr_RS Table"
186
  msgstr "Таблица sr_RS"
187
 
188
- #: classes/class-settings.php:164
189
  msgid "el Table"
190
  msgstr "Таблица el"
191
 
192
- #: classes/class-settings.php:167
193
  msgid "hy Table"
194
  msgstr "Таблица hy"
195
 
196
- #: classes/class-settings.php:170
197
  msgid "ka_GE Table"
198
  msgstr "Таблица ka_GE"
199
 
200
- #: classes/class-settings.php:173
201
  msgid "kk Table"
202
  msgstr "Таблица kk"
203
 
204
- #: classes/class-settings.php:176
205
  msgid "he_IL Table"
206
  msgstr "Таблица he_IL"
207
 
208
- #: classes/class-settings.php:179
209
  msgid "zh_CN Table"
210
  msgstr "Таблица zh_CN"
211
 
212
- #: classes/class-settings.php:206
213
  msgid "(current)"
214
  msgstr "(текущая)"
215
 
216
- #: classes/class-settings.php:273 classes/class-settings.php:274
217
  msgid "Cyr To Lat"
218
  msgstr "Cyr To Lat"
219
 
220
  #. Admin panel title.
221
- #: classes/class-settings.php:294
222
  msgid "Cyr To Lat Plugin Options"
223
  msgstr "Опции плагина Cyr To Lat"
224
 
225
- #: classes/class-settings.php:309
226
  msgid "Convert Existing Slugs"
227
  msgstr "Конвертировать существующие ярлыки"
228
 
229
- #: classes/class-settings.php:315
230
- msgid "Donate"
231
- msgstr "Пожертвовать"
232
-
233
- #: classes/class-settings.php:318
234
- msgid "Would you like to support the advancement of this plugin?"
235
- msgstr "Хотите поддержать развитие этого плагина?"
236
-
237
- #: classes/class-settings.php:332
238
  msgid "Your appreciation"
239
  msgstr "Ваша оценка"
240
 
241
- #: classes/class-settings.php:337
242
  msgid "Leave a ★★★★★ plugin review on WordPress.org"
243
  msgstr "Оставьте ★★★★★ обзор плагина на WordPress.org"
244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
  #. translators: %d: cron interval
246
  #: lib/wp-background-processing/class-wp-background-process.php:399
247
  #, php-format
248
  msgid "Every %d Minutes"
249
  msgstr "Каждые %d минут"
250
 
 
 
 
 
 
 
251
  #~ msgid "Please try again."
252
  #~ msgstr "Пожалуйста, попробуйте снова."
253
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: Cyr To Lat\n"
4
+ "POT-Creation-Date: 2021-02-10 14:55+0200\n"
5
+ "PO-Revision-Date: 2021-02-10 14:57+0200\n"
6
  "Last-Translator: KAGG Design <info@kagg.eu>\n"
7
  "Language-Team: KAGG Design\n"
8
  "Language: ru_RU\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.4.2\n"
13
  "X-Poedit-Basepath: ..\n"
14
  "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
  "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
16
+ "X-Poedit-KeywordsList: __;esc_html__;esc_attr__;esc_html_e\n"
17
  "X-Poedit-Flags-xgettext: --add-comments\n"
18
  "X-Poedit-SearchPath-0: .\n"
19
  "X-Poedit-SearchPathExcluded-0: .git\n"
28
  "X-Poedit-SearchPathExcluded-9: tests\n"
29
  "X-Poedit-SearchPathExcluded-10: vendor\n"
30
 
31
+ #: classes/background-processes/class-post-conversion-process.php:73
32
  msgid "Post slug converted:"
33
  msgstr "Ярлык поста сконвертирован:"
34
 
35
+ #: classes/background-processes/class-post-conversion-process.php:102
36
  msgid "Attachment file converted:"
37
  msgstr "Файл вложения сконвертирован:"
38
 
39
+ #: classes/background-processes/class-post-conversion-process.php:108
40
  msgid "Cannot convert attachment file for attachment id:"
41
  msgstr "Невозможно сконвертировать файл вложения для вложения с id:"
42
 
43
+ #: classes/background-processes/class-post-conversion-process.php:126
44
  msgid "Thumbnail file renamed:"
45
  msgstr "Файл миниатюры переименован:"
46
 
47
+ #: classes/background-processes/class-post-conversion-process.php:129
48
  msgid "Cannot rename thumbnail file:"
49
  msgstr "Невозможно переименовать файл миниатюры:"
50
 
51
+ #: classes/background-processes/class-post-conversion-process.php:198
52
  msgid "Post slugs conversion completed."
53
  msgstr "Конвертация ярлыков постов завершена."
54
 
55
+ #: classes/background-processes/class-term-conversion-process.php:72
56
  msgid "Term slug converted:"
57
  msgstr "Ярлык термина сконвертирован:"
58
 
59
+ #: classes/background-processes/class-term-conversion-process.php:84
60
  msgid "Term slugs conversion completed."
61
  msgstr "Конвертация ярлыков терминов завершена."
62
 
63
+ #: classes/class-converter.php:106
64
  msgid "Cyr To Lat converts existing post slugs in the background process."
65
  msgstr "Cyr To Lat конвертирует существующие ярлыки постов в фоновом процессе."
66
 
67
+ #: classes/class-converter.php:113
68
  msgid "Cyr To Lat converts existing term slugs in the background process."
69
  msgstr ""
70
  "Cyr To Lat конвертирует существующие ярлыки терминов в фоновом процессе."
71
 
72
+ #: classes/class-converter.php:120
73
  msgid "Cyr To Lat completed conversion of existing post slugs."
74
  msgstr "Cyr To Lat завершил конвертацию существующих ярлыков постов."
75
 
76
+ #: classes/class-converter.php:127
77
  msgid "Cyr To Lat completed conversion of existing term slugs."
78
  msgstr "Cyr To Lat завершил конвертацию существующих ярлыков терминов."
79
 
80
+ #: classes/class-converter.php:205
81
  msgid "Cyr To Lat has not found existing post slugs for conversion."
82
  msgstr "Cyr To Lat не нашёл существующих ярлыков постов для конвертации."
83
 
84
+ #: classes/class-converter.php:216