taon-typeorm 18.0.24 → 19.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1725) hide show
  1. package/assets/shared/shared_folder_info.txt +3 -3
  2. package/browser/README.md +24 -24
  3. package/client/README.md +24 -24
  4. package/index.js.map +1 -1
  5. package/lib/build-info._auto-generated_.d.ts +1 -0
  6. package/lib/build-info._auto-generated_.js +4 -1
  7. package/lib/build-info._auto-generated_.js.map +1 -1
  8. package/lib/index._auto-generated_.js +2 -2
  9. package/lib/index._auto-generated_.js.map +1 -1
  10. package/lib/index.js.map +1 -1
  11. package/lib/typeorm/cache/DbQueryResultCache.js.map +1 -1
  12. package/lib/typeorm/cache/QueryResultCache.js.map +1 -1
  13. package/lib/typeorm/cache/QueryResultCacheFactory.js.map +1 -1
  14. package/lib/typeorm/cache/QueryResultCacheOptions.js.map +1 -1
  15. package/lib/typeorm/cache/RedisQueryResultCache.js.map +1 -1
  16. package/lib/typeorm/cli-ts-node-commonjs.js.map +1 -1
  17. package/lib/typeorm/cli-ts-node-esm.js.map +1 -1
  18. package/lib/typeorm/cli.js.map +1 -1
  19. package/lib/typeorm/commands/CacheClearCommand.js.map +1 -1
  20. package/lib/typeorm/commands/CommandUtils.js.map +1 -1
  21. package/lib/typeorm/commands/EntityCreateCommand.js.map +1 -1
  22. package/lib/typeorm/commands/InitCommand.js.map +1 -1
  23. package/lib/typeorm/commands/MigrationCreateCommand.js.map +1 -1
  24. package/lib/typeorm/commands/MigrationGenerateCommand.js.map +1 -1
  25. package/lib/typeorm/commands/MigrationRevertCommand.js.map +1 -1
  26. package/lib/typeorm/commands/MigrationRunCommand.js.map +1 -1
  27. package/lib/typeorm/commands/MigrationShowCommand.js.map +1 -1
  28. package/lib/typeorm/commands/QueryCommand.js.map +1 -1
  29. package/lib/typeorm/commands/SchemaDropCommand.js.map +1 -1
  30. package/lib/typeorm/commands/SchemaLogCommand.js.map +1 -1
  31. package/lib/typeorm/commands/SchemaSyncCommand.js.map +1 -1
  32. package/lib/typeorm/commands/SubscriberCreateCommand.js.map +1 -1
  33. package/lib/typeorm/commands/VersionCommand.js.map +1 -1
  34. package/lib/typeorm/common/DeepPartial.js.map +1 -1
  35. package/lib/typeorm/common/EntityTarget.js.map +1 -1
  36. package/lib/typeorm/common/MixedList.js.map +1 -1
  37. package/lib/typeorm/common/NonNever.js.map +1 -1
  38. package/lib/typeorm/common/ObjectLiteral.js.map +1 -1
  39. package/lib/typeorm/common/ObjectType.js.map +1 -1
  40. package/lib/typeorm/common/RelationType.js.map +1 -1
  41. package/lib/typeorm/connection/BaseConnectionOptions.js.map +1 -1
  42. package/lib/typeorm/connection/Connection.js.map +1 -1
  43. package/lib/typeorm/connection/ConnectionManager.js.map +1 -1
  44. package/lib/typeorm/connection/ConnectionMetadataBuilder.js.map +1 -1
  45. package/lib/typeorm/connection/ConnectionOptions.js.map +1 -1
  46. package/lib/typeorm/connection/ConnectionOptionsReader.js.map +1 -1
  47. package/lib/typeorm/connection/options-reader/ConnectionOptionsEnvReader.js.map +1 -1
  48. package/lib/typeorm/connection/options-reader/ConnectionOptionsXmlReader.js.map +1 -1
  49. package/lib/typeorm/connection/options-reader/ConnectionOptionsYmlReader.js.map +1 -1
  50. package/lib/typeorm/constants.js.map +1 -1
  51. package/lib/typeorm/container.js.map +1 -1
  52. package/lib/typeorm/data-source/BaseDataSourceOptions.js.map +1 -1
  53. package/lib/typeorm/data-source/DataSource.js.map +1 -1
  54. package/lib/typeorm/data-source/DataSourceOptions.js.map +1 -1
  55. package/lib/typeorm/data-source/index.js.map +1 -1
  56. package/lib/typeorm/decorator/Check.js.map +1 -1
  57. package/lib/typeorm/decorator/EntityRepository.js.map +1 -1
  58. package/lib/typeorm/decorator/Exclusion.js.map +1 -1
  59. package/lib/typeorm/decorator/Generated.js.map +1 -1
  60. package/lib/typeorm/decorator/Index.js.map +1 -1
  61. package/lib/typeorm/decorator/Unique.js.map +1 -1
  62. package/lib/typeorm/decorator/columns/Column.js.map +1 -1
  63. package/lib/typeorm/decorator/columns/CreateDateColumn.js.map +1 -1
  64. package/lib/typeorm/decorator/columns/DeleteDateColumn.js.map +1 -1
  65. package/lib/typeorm/decorator/columns/ObjectIdColumn.js.map +1 -1
  66. package/lib/typeorm/decorator/columns/PrimaryColumn.js.map +1 -1
  67. package/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.js.map +1 -1
  68. package/lib/typeorm/decorator/columns/UpdateDateColumn.js.map +1 -1
  69. package/lib/typeorm/decorator/columns/VersionColumn.js.map +1 -1
  70. package/lib/typeorm/decorator/columns/ViewColumn.js.map +1 -1
  71. package/lib/typeorm/decorator/columns/VirtualColumn.js.map +1 -1
  72. package/lib/typeorm/decorator/entity/ChildEntity.js.map +1 -1
  73. package/lib/typeorm/decorator/entity/Entity.js.map +1 -1
  74. package/lib/typeorm/decorator/entity/TableInheritance.js.map +1 -1
  75. package/lib/typeorm/decorator/entity-view/ViewEntity.js.map +1 -1
  76. package/lib/typeorm/decorator/listeners/AfterInsert.js.map +1 -1
  77. package/lib/typeorm/decorator/listeners/AfterLoad.js.map +1 -1
  78. package/lib/typeorm/decorator/listeners/AfterRecover.js.map +1 -1
  79. package/lib/typeorm/decorator/listeners/AfterRemove.js.map +1 -1
  80. package/lib/typeorm/decorator/listeners/AfterSoftRemove.js.map +1 -1
  81. package/lib/typeorm/decorator/listeners/AfterUpdate.js.map +1 -1
  82. package/lib/typeorm/decorator/listeners/BeforeInsert.js.map +1 -1
  83. package/lib/typeorm/decorator/listeners/BeforeRecover.js.map +1 -1
  84. package/lib/typeorm/decorator/listeners/BeforeRemove.js.map +1 -1
  85. package/lib/typeorm/decorator/listeners/BeforeSoftRemove.js.map +1 -1
  86. package/lib/typeorm/decorator/listeners/BeforeUpdate.js.map +1 -1
  87. package/lib/typeorm/decorator/listeners/EventSubscriber.js.map +1 -1
  88. package/lib/typeorm/decorator/options/ColumnCommonOptions.js.map +1 -1
  89. package/lib/typeorm/decorator/options/ColumnEmbeddedOptions.js.map +1 -1
  90. package/lib/typeorm/decorator/options/ColumnEnumOptions.js.map +1 -1
  91. package/lib/typeorm/decorator/options/ColumnHstoreOptions.js.map +1 -1
  92. package/lib/typeorm/decorator/options/ColumnNumericOptions.js.map +1 -1
  93. package/lib/typeorm/decorator/options/ColumnOptions.js.map +1 -1
  94. package/lib/typeorm/decorator/options/ColumnWithLengthOptions.js.map +1 -1
  95. package/lib/typeorm/decorator/options/ColumnWithWidthOptions.js.map +1 -1
  96. package/lib/typeorm/decorator/options/EntityOptions.js.map +1 -1
  97. package/lib/typeorm/decorator/options/IndexOptions.js.map +1 -1
  98. package/lib/typeorm/decorator/options/JoinColumnOptions.js.map +1 -1
  99. package/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.js.map +1 -1
  100. package/lib/typeorm/decorator/options/JoinTableOptions.js.map +1 -1
  101. package/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
  102. package/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
  103. package/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
  104. package/lib/typeorm/decorator/options/RelationOptions.js.map +1 -1
  105. package/lib/typeorm/decorator/options/SpatialColumnOptions.js.map +1 -1
  106. package/lib/typeorm/decorator/options/TransactionOptions.js.map +1 -1
  107. package/lib/typeorm/decorator/options/UniqueOptions.js.map +1 -1
  108. package/lib/typeorm/decorator/options/ValueTransformer.js.map +1 -1
  109. package/lib/typeorm/decorator/options/ViewColumnOptions.js.map +1 -1
  110. package/lib/typeorm/decorator/options/ViewEntityOptions.js.map +1 -1
  111. package/lib/typeorm/decorator/options/VirtualColumnOptions.js.map +1 -1
  112. package/lib/typeorm/decorator/relations/JoinColumn.js.map +1 -1
  113. package/lib/typeorm/decorator/relations/JoinTable.js.map +1 -1
  114. package/lib/typeorm/decorator/relations/ManyToMany.js.map +1 -1
  115. package/lib/typeorm/decorator/relations/ManyToOne.js.map +1 -1
  116. package/lib/typeorm/decorator/relations/OneToMany.js.map +1 -1
  117. package/lib/typeorm/decorator/relations/OneToOne.js.map +1 -1
  118. package/lib/typeorm/decorator/relations/RelationCount.js.map +1 -1
  119. package/lib/typeorm/decorator/relations/RelationId.js.map +1 -1
  120. package/lib/typeorm/decorator/tree/Tree.js.map +1 -1
  121. package/lib/typeorm/decorator/tree/TreeChildren.js.map +1 -1
  122. package/lib/typeorm/decorator/tree/TreeLevelColumn.js.map +1 -1
  123. package/lib/typeorm/decorator/tree/TreeParent.js.map +1 -1
  124. package/lib/typeorm/driver/Driver.js.map +1 -1
  125. package/lib/typeorm/driver/DriverFactory.js.map +1 -1
  126. package/lib/typeorm/driver/DriverUtils.js.map +1 -1
  127. package/lib/typeorm/driver/Query.js.map +1 -1
  128. package/lib/typeorm/driver/SqlInMemory.js.map +1 -1
  129. package/lib/typeorm/driver/aurora-mysql/AuroraMysqlConnection.js.map +1 -1
  130. package/lib/typeorm/driver/aurora-mysql/AuroraMysqlConnectionCredentialsOptions.js.map +1 -1
  131. package/lib/typeorm/driver/aurora-mysql/AuroraMysqlConnectionOptions.js.map +1 -1
  132. package/lib/typeorm/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
  133. package/lib/typeorm/driver/aurora-mysql/AuroraMysqlQueryRunner.js.map +1 -1
  134. package/lib/typeorm/driver/aurora-postgres/AuroraPostgresConnectionOptions.js.map +1 -1
  135. package/lib/typeorm/driver/aurora-postgres/AuroraPostgresDriver.js.map +1 -1
  136. package/lib/typeorm/driver/aurora-postgres/AuroraPostgresQueryRunner.js.map +1 -1
  137. package/lib/typeorm/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js.map +1 -1
  138. package/lib/typeorm/driver/better-sqlite3/BetterSqlite3Driver.js.map +1 -1
  139. package/lib/typeorm/driver/better-sqlite3/BetterSqlite3QueryRunner.js.map +1 -1
  140. package/lib/typeorm/driver/capacitor/CapacitorConnectionOptions.js.map +1 -1
  141. package/lib/typeorm/driver/capacitor/CapacitorDriver.js.map +1 -1
  142. package/lib/typeorm/driver/capacitor/CapacitorQueryRunner.js.map +1 -1
  143. package/lib/typeorm/driver/cockroachdb/CockroachConnectionCredentialsOptions.js.map +1 -1
  144. package/lib/typeorm/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
  145. package/lib/typeorm/driver/cockroachdb/CockroachDriver.js.map +1 -1
  146. package/lib/typeorm/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  147. package/lib/typeorm/driver/cordova/CordovaConnectionOptions.js.map +1 -1
  148. package/lib/typeorm/driver/cordova/CordovaDriver.js.map +1 -1
  149. package/lib/typeorm/driver/cordova/CordovaQueryRunner.js.map +1 -1
  150. package/lib/typeorm/driver/expo/ExpoConnectionOptions.js.map +1 -1
  151. package/lib/typeorm/driver/expo/ExpoDriver.js.map +1 -1
  152. package/lib/typeorm/driver/expo/ExpoQueryRunner.js.map +1 -1
  153. package/lib/typeorm/driver/mongodb/MongoConnectionOptions.js.map +1 -1
  154. package/lib/typeorm/driver/mongodb/MongoDriver.js.map +1 -1
  155. package/lib/typeorm/driver/mongodb/MongoQueryRunner.js.map +1 -1
  156. package/lib/typeorm/driver/mongodb/typings.js.map +1 -1
  157. package/lib/typeorm/driver/mysql/MysqlConnectionCredentialsOptions.js.map +1 -1
  158. package/lib/typeorm/driver/mysql/MysqlConnectionOptions.js.map +1 -1
  159. package/lib/typeorm/driver/mysql/MysqlDriver.js.map +1 -1
  160. package/lib/typeorm/driver/mysql/MysqlQueryRunner.js.map +1 -1
  161. package/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.js.map +1 -1
  162. package/lib/typeorm/driver/nativescript/NativescriptDriver.js.map +1 -1
  163. package/lib/typeorm/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
  164. package/lib/typeorm/driver/oracle/OracleConnectionCredentialsOptions.js.map +1 -1
  165. package/lib/typeorm/driver/oracle/OracleConnectionOptions.js.map +1 -1
  166. package/lib/typeorm/driver/oracle/OracleDriver.js.map +1 -1
  167. package/lib/typeorm/driver/oracle/OracleQueryRunner.js.map +1 -1
  168. package/lib/typeorm/driver/postgres/PostgresConnectionCredentialsOptions.js.map +1 -1
  169. package/lib/typeorm/driver/postgres/PostgresConnectionOptions.js.map +1 -1
  170. package/lib/typeorm/driver/postgres/PostgresDriver.js.map +1 -1
  171. package/lib/typeorm/driver/postgres/PostgresQueryRunner.js.map +1 -1
  172. package/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.js.map +1 -1
  173. package/lib/typeorm/driver/react-native/ReactNativeDriver.js.map +1 -1
  174. package/lib/typeorm/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
  175. package/lib/typeorm/driver/sap/SapConnectionCredentialsOptions.js.map +1 -1
  176. package/lib/typeorm/driver/sap/SapConnectionOptions.js.map +1 -1
  177. package/lib/typeorm/driver/sap/SapDriver.js.map +1 -1
  178. package/lib/typeorm/driver/sap/SapQueryRunner.js.map +1 -1
  179. package/lib/typeorm/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -1
  180. package/lib/typeorm/driver/spanner/SpannerConnectionOptions.js.map +1 -1
  181. package/lib/typeorm/driver/spanner/SpannerDriver.js.map +1 -1
  182. package/lib/typeorm/driver/spanner/SpannerQueryRunner.js.map +1 -1
  183. package/lib/typeorm/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
  184. package/lib/typeorm/driver/sqlite/SqliteDriver.js.map +1 -1
  185. package/lib/typeorm/driver/sqlite/SqliteQueryRunner.js.map +1 -1
  186. package/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  187. package/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  188. package/lib/typeorm/driver/sqljs/SqljsConnectionOptions.js.map +1 -1
  189. package/lib/typeorm/driver/sqljs/SqljsDriver.js.map +1 -1
  190. package/lib/typeorm/driver/sqljs/SqljsQueryRunner.js.map +1 -1
  191. package/lib/typeorm/driver/sqlserver/MssqlParameter.js.map +1 -1
  192. package/lib/typeorm/driver/sqlserver/SqlServerConnectionCredentialsOptions.js.map +1 -1
  193. package/lib/typeorm/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
  194. package/lib/typeorm/driver/sqlserver/SqlServerDriver.js.map +1 -1
  195. package/lib/typeorm/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  196. package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryAccessTokenAuthentication.js.map +1 -1
  197. package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryMsiAppServiceAuthentication.js.map +1 -1
  198. package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryMsiVmAuthentication.js.map +1 -1
  199. package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryPasswordAuthentication.js.map +1 -1
  200. package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryServicePrincipalSecret.js.map +1 -1
  201. package/lib/typeorm/driver/sqlserver/authentication/DefaultAuthentication.js.map +1 -1
  202. package/lib/typeorm/driver/sqlserver/authentication/NtlmAuthentication.js.map +1 -1
  203. package/lib/typeorm/driver/types/ColumnTypes.js.map +1 -1
  204. package/lib/typeorm/driver/types/CteCapabilities.js.map +1 -1
  205. package/lib/typeorm/driver/types/DataTypeDefaults.js.map +1 -1
  206. package/lib/typeorm/driver/types/DatabaseType.js.map +1 -1
  207. package/lib/typeorm/driver/types/IsolationLevel.js.map +1 -1
  208. package/lib/typeorm/driver/types/MappedColumnTypes.js.map +1 -1
  209. package/lib/typeorm/driver/types/MetadataTableType.js.map +1 -1
  210. package/lib/typeorm/driver/types/ReplicationMode.js.map +1 -1
  211. package/lib/typeorm/driver/types/UpsertType.js.map +1 -1
  212. package/lib/typeorm/entity-manager/EntityManager.js.map +1 -1
  213. package/lib/typeorm/entity-manager/EntityManagerFactory.js.map +1 -1
  214. package/lib/typeorm/entity-manager/MongoEntityManager.js.map +1 -1
  215. package/lib/typeorm/entity-manager/SqljsEntityManager.js.map +1 -1
  216. package/lib/typeorm/entity-schema/EntitySchema.js.map +1 -1
  217. package/lib/typeorm/entity-schema/EntitySchemaCheckOptions.js.map +1 -1
  218. package/lib/typeorm/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  219. package/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.js.map +1 -1
  220. package/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.js.map +1 -1
  221. package/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.js.map +1 -1
  222. package/lib/typeorm/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
  223. package/lib/typeorm/entity-schema/EntitySchemaOptions.js.map +1 -1
  224. package/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.js.map +1 -1
  225. package/lib/typeorm/entity-schema/EntitySchemaRelationOptions.js.map +1 -1
  226. package/lib/typeorm/entity-schema/EntitySchemaTransformer.js.map +1 -1
  227. package/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.js.map +1 -1
  228. package/lib/typeorm/error/AlreadyHasActiveConnectionError.js.map +1 -1
  229. package/lib/typeorm/error/CannotAttachTreeChildrenEntityError.js.map +1 -1
  230. package/lib/typeorm/error/CannotConnectAlreadyConnectedError.js.map +1 -1
  231. package/lib/typeorm/error/CannotCreateEntityIdMapError.js.map +1 -1
  232. package/lib/typeorm/error/CannotDetermineEntityError.js.map +1 -1
  233. package/lib/typeorm/error/CannotExecuteNotConnectedError.js.map +1 -1
  234. package/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.js.map +1 -1
  235. package/lib/typeorm/error/CannotReflectMethodParameterTypeError.js.map +1 -1
  236. package/lib/typeorm/error/CircularRelationsError.js.map +1 -1
  237. package/lib/typeorm/error/ColumnTypeUndefinedError.js.map +1 -1
  238. package/lib/typeorm/error/ConnectionIsNotSetError.js.map +1 -1
  239. package/lib/typeorm/error/ConnectionNotFoundError.js.map +1 -1
  240. package/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.js.map +1 -1
  241. package/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.js.map +1 -1
  242. package/lib/typeorm/error/CustomRepositoryNotFoundError.js.map +1 -1
  243. package/lib/typeorm/error/DataTypeNotSupportedError.js.map +1 -1
  244. package/lib/typeorm/error/DriverOptionNotSetError.js.map +1 -1
  245. package/lib/typeorm/error/DriverPackageNotInstalledError.js.map +1 -1
  246. package/lib/typeorm/error/EntityMetadataNotFoundError.js.map +1 -1
  247. package/lib/typeorm/error/EntityNotFoundError.js.map +1 -1
  248. package/lib/typeorm/error/EntityPropertyNotFoundError.js.map +1 -1
  249. package/lib/typeorm/error/FindRelationsNotFoundError.js.map +1 -1
  250. package/lib/typeorm/error/ForbiddenTransactionModeOverrideError.js.map +1 -1
  251. package/lib/typeorm/error/InitializedRelationError.js.map +1 -1
  252. package/lib/typeorm/error/InsertValuesMissingError.js.map +1 -1
  253. package/lib/typeorm/error/LimitOnUpdateNotSupportedError.js.map +1 -1
  254. package/lib/typeorm/error/LockNotSupportedOnGivenDriverError.js.map +1 -1
  255. package/lib/typeorm/error/MetadataAlreadyExistsError.js.map +1 -1
  256. package/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.js.map +1 -1
  257. package/lib/typeorm/error/MissingDeleteDateColumnError.js.map +1 -1
  258. package/lib/typeorm/error/MissingDriverError.js.map +1 -1
  259. package/lib/typeorm/error/MissingJoinColumnError.js.map +1 -1
  260. package/lib/typeorm/error/MissingJoinTableError.js.map +1 -1
  261. package/lib/typeorm/error/MissingPrimaryColumnError.js.map +1 -1
  262. package/lib/typeorm/error/MustBeEntityError.js.map +1 -1
  263. package/lib/typeorm/error/NamingStrategyNotFoundError.js.map +1 -1
  264. package/lib/typeorm/error/NestedSetMultipleRootError.js.map +1 -1
  265. package/lib/typeorm/error/NoConnectionForRepositoryError.js.map +1 -1
  266. package/lib/typeorm/error/NoConnectionOptionError.js.map +1 -1
  267. package/lib/typeorm/error/NoNeedToReleaseEntityManagerError.js.map +1 -1
  268. package/lib/typeorm/error/NoVersionOrUpdateDateColumnError.js.map +1 -1
  269. package/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.js.map +1 -1
  270. package/lib/typeorm/error/OptimisticLockCanNotBeUsedError.js.map +1 -1
  271. package/lib/typeorm/error/OptimisticLockVersionMismatchError.js.map +1 -1
  272. package/lib/typeorm/error/PersistedEntityNotFoundError.js.map +1 -1
  273. package/lib/typeorm/error/PessimisticLockTransactionRequiredError.js.map +1 -1
  274. package/lib/typeorm/error/PrimaryColumnCannotBeNullableError.js.map +1 -1
  275. package/lib/typeorm/error/QueryFailedError.js.map +1 -1
  276. package/lib/typeorm/error/QueryRunnerAlreadyReleasedError.js.map +1 -1
  277. package/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.js.map +1 -1
  278. package/lib/typeorm/error/RepositoryNotTreeError.js.map +1 -1
  279. package/lib/typeorm/error/ReturningStatementNotSupportedError.js.map +1 -1
  280. package/lib/typeorm/error/SubjectRemovedAndUpdatedError.js.map +1 -1
  281. package/lib/typeorm/error/SubjectWithoutIdentifierError.js.map +1 -1
  282. package/lib/typeorm/error/TransactionAlreadyStartedError.js.map +1 -1
  283. package/lib/typeorm/error/TransactionNotStartedError.js.map +1 -1
  284. package/lib/typeorm/error/TreeRepositoryNotSupportedError.js.map +1 -1
  285. package/lib/typeorm/error/TypeORMError.js.map +1 -1
  286. package/lib/typeorm/error/UpdateValuesMissingError.js.map +1 -1
  287. package/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.js.map +1 -1
  288. package/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.js.map +1 -1
  289. package/lib/typeorm/error/UsingJoinTableIsNotAllowedError.js.map +1 -1
  290. package/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.js.map +1 -1
  291. package/lib/typeorm/error/index.js.map +1 -1
  292. package/lib/typeorm/find-options/EqualOperator.js.map +1 -1
  293. package/lib/typeorm/find-options/FindManyOptions.js.map +1 -1
  294. package/lib/typeorm/find-options/FindOneOptions.js.map +1 -1
  295. package/lib/typeorm/find-options/FindOperator.js.map +1 -1
  296. package/lib/typeorm/find-options/FindOperatorType.js.map +1 -1
  297. package/lib/typeorm/find-options/FindOptionsOrder.js.map +1 -1
  298. package/lib/typeorm/find-options/FindOptionsRelations.js.map +1 -1
  299. package/lib/typeorm/find-options/FindOptionsSelect.js.map +1 -1
  300. package/lib/typeorm/find-options/FindOptionsUtils.js.map +1 -1
  301. package/lib/typeorm/find-options/FindOptionsWhere.js.map +1 -1
  302. package/lib/typeorm/find-options/FindTreeOptions.js.map +1 -1
  303. package/lib/typeorm/find-options/JoinOptions.js.map +1 -1
  304. package/lib/typeorm/find-options/OrderByCondition.js.map +1 -1
  305. package/lib/typeorm/find-options/mongodb/MongoFindManyOptions.js.map +1 -1
  306. package/lib/typeorm/find-options/mongodb/MongoFindOneOptions.js.map +1 -1
  307. package/lib/typeorm/find-options/operator/And.js.map +1 -1
  308. package/lib/typeorm/find-options/operator/Any.js.map +1 -1
  309. package/lib/typeorm/find-options/operator/ArrayContainedBy.js.map +1 -1
  310. package/lib/typeorm/find-options/operator/ArrayContains.js.map +1 -1
  311. package/lib/typeorm/find-options/operator/ArrayOverlap.js.map +1 -1
  312. package/lib/typeorm/find-options/operator/Between.js.map +1 -1
  313. package/lib/typeorm/find-options/operator/Equal.js.map +1 -1
  314. package/lib/typeorm/find-options/operator/ILike.js.map +1 -1
  315. package/lib/typeorm/find-options/operator/In.js.map +1 -1
  316. package/lib/typeorm/find-options/operator/IsNull.js.map +1 -1
  317. package/lib/typeorm/find-options/operator/LessThan.js.map +1 -1
  318. package/lib/typeorm/find-options/operator/LessThanOrEqual.js.map +1 -1
  319. package/lib/typeorm/find-options/operator/Like.js.map +1 -1
  320. package/lib/typeorm/find-options/operator/MoreThan.js.map +1 -1
  321. package/lib/typeorm/find-options/operator/MoreThanOrEqual.js.map +1 -1
  322. package/lib/typeorm/find-options/operator/Not.js.map +1 -1
  323. package/lib/typeorm/find-options/operator/Raw.js.map +1 -1
  324. package/lib/typeorm/globals.js.map +1 -1
  325. package/lib/typeorm/index.js.map +1 -1
  326. package/lib/typeorm/logger/AdvancedConsoleLogger.js.map +1 -1
  327. package/lib/typeorm/logger/DebugLogger.js.map +1 -1
  328. package/lib/typeorm/logger/FileLogger.js.map +1 -1
  329. package/lib/typeorm/logger/Logger.js.map +1 -1
  330. package/lib/typeorm/logger/LoggerFactory.js.map +1 -1
  331. package/lib/typeorm/logger/LoggerOptions.js.map +1 -1
  332. package/lib/typeorm/logger/SimpleConsoleLogger.js.map +1 -1
  333. package/lib/typeorm/metadata/CheckMetadata.js.map +1 -1
  334. package/lib/typeorm/metadata/ColumnMetadata.js.map +1 -1
  335. package/lib/typeorm/metadata/EmbeddedMetadata.js.map +1 -1
  336. package/lib/typeorm/metadata/EntityListenerMetadata.js.map +1 -1
  337. package/lib/typeorm/metadata/EntityMetadata.js.map +1 -1
  338. package/lib/typeorm/metadata/ExclusionMetadata.js.map +1 -1
  339. package/lib/typeorm/metadata/ForeignKeyMetadata.js.map +1 -1
  340. package/lib/typeorm/metadata/IndexMetadata.js.map +1 -1
  341. package/lib/typeorm/metadata/RelationCountMetadata.js.map +1 -1
  342. package/lib/typeorm/metadata/RelationIdMetadata.js.map +1 -1
  343. package/lib/typeorm/metadata/RelationMetadata.js.map +1 -1
  344. package/lib/typeorm/metadata/UniqueMetadata.js.map +1 -1
  345. package/lib/typeorm/metadata/types/ClosureTreeOptions.js.map +1 -1
  346. package/lib/typeorm/metadata/types/DeferrableType.js.map +1 -1
  347. package/lib/typeorm/metadata/types/EventListenerTypes.js.map +1 -1
  348. package/lib/typeorm/metadata/types/OnDeleteType.js.map +1 -1
  349. package/lib/typeorm/metadata/types/OnUpdateType.js.map +1 -1
  350. package/lib/typeorm/metadata/types/PropertyTypeInFunction.js.map +1 -1
  351. package/lib/typeorm/metadata/types/RelationTypeInFunction.js.map +1 -1
  352. package/lib/typeorm/metadata/types/RelationTypes.js.map +1 -1
  353. package/lib/typeorm/metadata/types/TableTypes.js.map +1 -1
  354. package/lib/typeorm/metadata/types/TreeTypes.js.map +1 -1
  355. package/lib/typeorm/metadata-args/CheckMetadataArgs.js.map +1 -1
  356. package/lib/typeorm/metadata-args/ColumnMetadataArgs.js.map +1 -1
  357. package/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.js.map +1 -1
  358. package/lib/typeorm/metadata-args/EmbeddedMetadataArgs.js.map +1 -1
  359. package/lib/typeorm/metadata-args/EntityListenerMetadataArgs.js.map +1 -1
  360. package/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.js.map +1 -1
  361. package/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.js.map +1 -1
  362. package/lib/typeorm/metadata-args/ExclusionMetadataArgs.js.map +1 -1
  363. package/lib/typeorm/metadata-args/GeneratedMetadataArgs.js.map +1 -1
  364. package/lib/typeorm/metadata-args/IndexMetadataArgs.js.map +1 -1
  365. package/lib/typeorm/metadata-args/InheritanceMetadataArgs.js.map +1 -1
  366. package/lib/typeorm/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
  367. package/lib/typeorm/metadata-args/JoinTableMetadataArgs.js.map +1 -1
  368. package/lib/typeorm/metadata-args/MetadataArgsStorage.js.map +1 -1
  369. package/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.js.map +1 -1
  370. package/lib/typeorm/metadata-args/RelationCountMetadataArgs.js.map +1 -1
  371. package/lib/typeorm/metadata-args/RelationIdMetadataArgs.js.map +1 -1
  372. package/lib/typeorm/metadata-args/RelationMetadataArgs.js.map +1 -1
  373. package/lib/typeorm/metadata-args/TableMetadataArgs.js.map +1 -1
  374. package/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.js.map +1 -1
  375. package/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.js.map +1 -1
  376. package/lib/typeorm/metadata-args/TreeMetadataArgs.js.map +1 -1
  377. package/lib/typeorm/metadata-args/UniqueMetadataArgs.js.map +1 -1
  378. package/lib/typeorm/metadata-args/types/ColumnMode.js.map +1 -1
  379. package/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
  380. package/lib/typeorm/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  381. package/lib/typeorm/metadata-builder/EntityMetadataValidator.js.map +1 -1
  382. package/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  383. package/lib/typeorm/metadata-builder/MetadataUtils.js.map +1 -1
  384. package/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  385. package/lib/typeorm/migration/Migration.js.map +1 -1
  386. package/lib/typeorm/migration/MigrationExecutor.js.map +1 -1
  387. package/lib/typeorm/migration/MigrationInterface.js.map +1 -1
  388. package/lib/typeorm/naming-strategy/DefaultNamingStrategy.js.map +1 -1
  389. package/lib/typeorm/naming-strategy/NamingStrategyInterface.js.map +1 -1
  390. package/lib/typeorm/persistence/EntityPersistExecutor.js.map +1 -1
  391. package/lib/typeorm/persistence/Subject.js.map +1 -1
  392. package/lib/typeorm/persistence/SubjectChangeMap.js.map +1 -1
  393. package/lib/typeorm/persistence/SubjectChangedColumnsComputer.js.map +1 -1
  394. package/lib/typeorm/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
  395. package/lib/typeorm/persistence/SubjectExecutor.js.map +1 -1
  396. package/lib/typeorm/persistence/SubjectTopoligicalSorter.js.map +1 -1
  397. package/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.js.map +1 -1
  398. package/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.js.map +1 -1
  399. package/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.js.map +1 -1
  400. package/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.js.map +1 -1
  401. package/lib/typeorm/persistence/tree/ClosureSubjectExecutor.js.map +1 -1
  402. package/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.js.map +1 -1
  403. package/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.js.map +1 -1
  404. package/lib/typeorm/platform/PlatformTools.js.map +1 -1
  405. package/lib/typeorm/query-builder/Alias.js.map +1 -1
  406. package/lib/typeorm/query-builder/Brackets.js.map +1 -1
  407. package/lib/typeorm/query-builder/DeleteQueryBuilder.js.map +1 -1
  408. package/lib/typeorm/query-builder/InsertOrUpdateOptions.js.map +1 -1
  409. package/lib/typeorm/query-builder/InsertQueryBuilder.js.map +1 -1
  410. package/lib/typeorm/query-builder/JoinAttribute.js.map +1 -1
  411. package/lib/typeorm/query-builder/JoinOptions.js.map +1 -1
  412. package/lib/typeorm/query-builder/NotBrackets.js.map +1 -1
  413. package/lib/typeorm/query-builder/QueryBuilder.js.map +1 -1
  414. package/lib/typeorm/query-builder/QueryBuilderCte.js.map +1 -1
  415. package/lib/typeorm/query-builder/QueryBuilderUtils.js.map +1 -1
  416. package/lib/typeorm/query-builder/QueryExpressionMap.js.map +1 -1
  417. package/lib/typeorm/query-builder/QueryPartialEntity.js.map +1 -1
  418. package/lib/typeorm/query-builder/RelationIdLoader.js.map +1 -1
  419. package/lib/typeorm/query-builder/RelationLoader.js.map +1 -1
  420. package/lib/typeorm/query-builder/RelationQueryBuilder.js.map +1 -1
  421. package/lib/typeorm/query-builder/RelationRemover.js.map +1 -1
  422. package/lib/typeorm/query-builder/RelationUpdater.js.map +1 -1
  423. package/lib/typeorm/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
  424. package/lib/typeorm/query-builder/SelectQuery.js.map +1 -1
  425. package/lib/typeorm/query-builder/SelectQueryBuilder.js.map +1 -1
  426. package/lib/typeorm/query-builder/SelectQueryBuilderOption.js.map +1 -1
  427. package/lib/typeorm/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
  428. package/lib/typeorm/query-builder/UpdateQueryBuilder.js.map +1 -1
  429. package/lib/typeorm/query-builder/WhereClause.js.map +1 -1
  430. package/lib/typeorm/query-builder/WhereExpressionBuilder.js.map +1 -1
  431. package/lib/typeorm/query-builder/relation-count/RelationCountAttribute.js.map +1 -1
  432. package/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.js.map +1 -1
  433. package/lib/typeorm/query-builder/relation-count/RelationCountLoader.js.map +1 -1
  434. package/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.js.map +1 -1
  435. package/lib/typeorm/query-builder/relation-id/RelationIdAttribute.js.map +1 -1
  436. package/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.js.map +1 -1
  437. package/lib/typeorm/query-builder/relation-id/RelationIdLoader.js.map +1 -1
  438. package/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.js.map +1 -1
  439. package/lib/typeorm/query-builder/result/DeleteResult.js.map +1 -1
  440. package/lib/typeorm/query-builder/result/InsertResult.js.map +1 -1
  441. package/lib/typeorm/query-builder/result/UpdateResult.js.map +1 -1
  442. package/lib/typeorm/query-builder/transformer/DocumentToEntityTransformer.js.map +1 -1
  443. package/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.js.map +1 -1
  444. package/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.js.map +1 -1
  445. package/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
  446. package/lib/typeorm/query-runner/BaseQueryRunner.js.map +1 -1
  447. package/lib/typeorm/query-runner/QueryLock.js.map +1 -1
  448. package/lib/typeorm/query-runner/QueryResult.js.map +1 -1
  449. package/lib/typeorm/query-runner/QueryRunner.js.map +1 -1
  450. package/lib/typeorm/repository/AbstractRepository.js.map +1 -1
  451. package/lib/typeorm/repository/BaseEntity.js.map +1 -1
  452. package/lib/typeorm/repository/EntityId.js.map +1 -1
  453. package/lib/typeorm/repository/FindTreesOptions.js.map +1 -1
  454. package/lib/typeorm/repository/MongoRepository.js.map +1 -1
  455. package/lib/typeorm/repository/RemoveOptions.js.map +1 -1
  456. package/lib/typeorm/repository/Repository.js.map +1 -1
  457. package/lib/typeorm/repository/SaveOptions.js.map +1 -1
  458. package/lib/typeorm/repository/TreeRepository.js.map +1 -1
  459. package/lib/typeorm/repository/UpsertOptions.js.map +1 -1
  460. package/lib/typeorm/schema-builder/MongoSchemaBuilder.js.map +1 -1
  461. package/lib/typeorm/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  462. package/lib/typeorm/schema-builder/SchemaBuilder.js.map +1 -1
  463. package/lib/typeorm/schema-builder/options/TableCheckOptions.js.map +1 -1
  464. package/lib/typeorm/schema-builder/options/TableColumnOptions.js.map +1 -1
  465. package/lib/typeorm/schema-builder/options/TableExclusionOptions.js.map +1 -1
  466. package/lib/typeorm/schema-builder/options/TableForeignKeyOptions.js.map +1 -1
  467. package/lib/typeorm/schema-builder/options/TableIndexOptions.js.map +1 -1
  468. package/lib/typeorm/schema-builder/options/TableOptions.js.map +1 -1
  469. package/lib/typeorm/schema-builder/options/TableUniqueOptions.js.map +1 -1
  470. package/lib/typeorm/schema-builder/options/ViewOptions.js.map +1 -1
  471. package/lib/typeorm/schema-builder/table/Table.js.map +1 -1
  472. package/lib/typeorm/schema-builder/table/TableCheck.js.map +1 -1
  473. package/lib/typeorm/schema-builder/table/TableColumn.js.map +1 -1
  474. package/lib/typeorm/schema-builder/table/TableExclusion.js.map +1 -1
  475. package/lib/typeorm/schema-builder/table/TableForeignKey.js.map +1 -1
  476. package/lib/typeorm/schema-builder/table/TableIndex.js.map +1 -1
  477. package/lib/typeorm/schema-builder/table/TableUnique.js.map +1 -1
  478. package/lib/typeorm/schema-builder/util/TableUtils.js.map +1 -1
  479. package/lib/typeorm/schema-builder/util/ViewUtils.js.map +1 -1
  480. package/lib/typeorm/schema-builder/view/View.js.map +1 -1
  481. package/lib/typeorm/subscriber/Broadcaster.js.map +1 -1
  482. package/lib/typeorm/subscriber/BroadcasterResult.js.map +1 -1
  483. package/lib/typeorm/subscriber/EntitySubscriberInterface.js.map +1 -1
  484. package/lib/typeorm/subscriber/event/InsertEvent.js.map +1 -1
  485. package/lib/typeorm/subscriber/event/LoadEvent.js.map +1 -1
  486. package/lib/typeorm/subscriber/event/RecoverEvent.js.map +1 -1
  487. package/lib/typeorm/subscriber/event/RemoveEvent.js.map +1 -1
  488. package/lib/typeorm/subscriber/event/SoftRemoveEvent.js.map +1 -1
  489. package/lib/typeorm/subscriber/event/TransactionCommitEvent.js.map +1 -1
  490. package/lib/typeorm/subscriber/event/TransactionRollbackEvent.js.map +1 -1
  491. package/lib/typeorm/subscriber/event/TransactionStartEvent.js.map +1 -1
  492. package/lib/typeorm/subscriber/event/UpdateEvent.js.map +1 -1
  493. package/lib/typeorm/util/ApplyValueTransformers.js.map +1 -1
  494. package/lib/typeorm/util/DateUtils.js.map +1 -1
  495. package/lib/typeorm/util/DepGraph.js.map +1 -1
  496. package/lib/typeorm/util/DirectoryExportedClassesLoader.js.map +1 -1
  497. package/lib/typeorm/util/ImportUtils.js.map +1 -1
  498. package/lib/typeorm/util/InstanceChecker.js.map +1 -1
  499. package/lib/typeorm/util/ObjectUtils.js.map +1 -1
  500. package/lib/typeorm/util/OrmUtils.js.map +1 -1
  501. package/lib/typeorm/util/PathUtils.js.map +1 -1
  502. package/lib/typeorm/util/RandomGenerator.js.map +1 -1
  503. package/lib/typeorm/util/StringUtils.js.map +1 -1
  504. package/lib/typeorm/util/TreeRepositoryUtils.js.map +1 -1
  505. package/lib/typeorm/util/VersionUtils.js.map +1 -1
  506. package/lib/typeorm/util/escapeRegExp.js.map +1 -1
  507. package/migrations/index.js.map +1 -1
  508. package/migrations/migrations_index._auto-generated_.js.map +1 -1
  509. package/package.json +2 -2
  510. package/src.d.ts +3 -3
  511. package/taon.jsonc +7 -9
  512. package/tmp-environment.json +4 -3
  513. package/websql/README.md +24 -24
  514. package/browser/esm2022/lib/index.mjs +0 -4
  515. package/browser/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
  516. package/browser/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
  517. package/browser/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
  518. package/browser/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
  519. package/browser/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
  520. package/browser/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
  521. package/browser/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
  522. package/browser/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
  523. package/browser/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
  524. package/browser/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
  525. package/browser/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
  526. package/browser/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
  527. package/browser/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
  528. package/browser/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
  529. package/browser/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
  530. package/browser/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
  531. package/browser/esm2022/lib/typeorm/constants.mjs +0 -4
  532. package/browser/esm2022/lib/typeorm/container.mjs +0 -57
  533. package/browser/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
  534. package/browser/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
  535. package/browser/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
  536. package/browser/esm2022/lib/typeorm/data-source/index.mjs +0 -4
  537. package/browser/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
  538. package/browser/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
  539. package/browser/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
  540. package/browser/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
  541. package/browser/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
  542. package/browser/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
  543. package/browser/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
  544. package/browser/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
  545. package/browser/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
  546. package/browser/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
  547. package/browser/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
  548. package/browser/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
  549. package/browser/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
  550. package/browser/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
  551. package/browser/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
  552. package/browser/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
  553. package/browser/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
  554. package/browser/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
  555. package/browser/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
  556. package/browser/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
  557. package/browser/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
  558. package/browser/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
  559. package/browser/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
  560. package/browser/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
  561. package/browser/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
  562. package/browser/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
  563. package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
  564. package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
  565. package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
  566. package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
  567. package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
  568. package/browser/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
  569. package/browser/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
  570. package/browser/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
  571. package/browser/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
  572. package/browser/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
  573. package/browser/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
  574. package/browser/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
  575. package/browser/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
  576. package/browser/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
  577. package/browser/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
  578. package/browser/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
  579. package/browser/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
  580. package/browser/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
  581. package/browser/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
  582. package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
  583. package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
  584. package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
  585. package/browser/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
  586. package/browser/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
  587. package/browser/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
  588. package/browser/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
  589. package/browser/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
  590. package/browser/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
  591. package/browser/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
  592. package/browser/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
  593. package/browser/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
  594. package/browser/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
  595. package/browser/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
  596. package/browser/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
  597. package/browser/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
  598. package/browser/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
  599. package/browser/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
  600. package/browser/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
  601. package/browser/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
  602. package/browser/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
  603. package/browser/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
  604. package/browser/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
  605. package/browser/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
  606. package/browser/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
  607. package/browser/esm2022/lib/typeorm/driver/Query.mjs +0 -13
  608. package/browser/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
  609. package/browser/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
  610. package/browser/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
  611. package/browser/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
  612. package/browser/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
  613. package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
  614. package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
  615. package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
  616. package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
  617. package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
  618. package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
  619. package/browser/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
  620. package/browser/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
  621. package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
  622. package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
  623. package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
  624. package/browser/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
  625. package/browser/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
  626. package/browser/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
  627. package/browser/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
  628. package/browser/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
  629. package/browser/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
  630. package/browser/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
  631. package/browser/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
  632. package/browser/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
  633. package/browser/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
  634. package/browser/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
  635. package/browser/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
  636. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
  637. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
  638. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
  639. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
  640. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
  641. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
  642. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
  643. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
  644. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
  645. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
  646. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
  647. package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
  648. package/browser/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
  649. package/browser/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
  650. package/browser/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
  651. package/browser/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
  652. package/browser/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
  653. package/browser/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
  654. package/browser/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
  655. package/browser/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
  656. package/browser/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
  657. package/browser/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
  658. package/browser/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
  659. package/browser/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
  660. package/browser/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
  661. package/browser/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
  662. package/browser/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
  663. package/browser/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
  664. package/browser/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
  665. package/browser/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
  666. package/browser/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
  667. package/browser/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
  668. package/browser/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
  669. package/browser/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
  670. package/browser/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
  671. package/browser/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
  672. package/browser/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
  673. package/browser/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
  674. package/browser/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
  675. package/browser/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
  676. package/browser/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
  677. package/browser/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
  678. package/browser/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
  679. package/browser/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
  680. package/browser/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
  681. package/browser/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
  682. package/browser/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
  683. package/browser/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
  684. package/browser/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
  685. package/browser/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
  686. package/browser/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
  687. package/browser/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
  688. package/browser/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
  689. package/browser/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
  690. package/browser/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
  691. package/browser/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
  692. package/browser/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
  693. package/browser/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
  694. package/browser/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
  695. package/browser/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
  696. package/browser/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
  697. package/browser/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
  698. package/browser/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
  699. package/browser/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
  700. package/browser/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
  701. package/browser/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
  702. package/browser/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
  703. package/browser/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
  704. package/browser/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
  705. package/browser/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
  706. package/browser/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
  707. package/browser/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
  708. package/browser/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
  709. package/browser/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
  710. package/browser/esm2022/lib/typeorm/error/index.mjs +0 -63
  711. package/browser/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
  712. package/browser/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
  713. package/browser/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
  714. package/browser/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
  715. package/browser/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
  716. package/browser/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
  717. package/browser/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
  718. package/browser/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
  719. package/browser/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
  720. package/browser/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
  721. package/browser/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
  722. package/browser/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
  723. package/browser/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
  724. package/browser/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
  725. package/browser/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
  726. package/browser/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
  727. package/browser/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
  728. package/browser/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
  729. package/browser/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
  730. package/browser/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
  731. package/browser/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
  732. package/browser/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
  733. package/browser/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
  734. package/browser/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
  735. package/browser/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
  736. package/browser/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
  737. package/browser/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
  738. package/browser/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
  739. package/browser/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
  740. package/browser/esm2022/lib/typeorm/globals.mjs +0 -165
  741. package/browser/esm2022/lib/typeorm/index.mjs +0 -157
  742. package/browser/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
  743. package/browser/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
  744. package/browser/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
  745. package/browser/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
  746. package/browser/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
  747. package/browser/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
  748. package/browser/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
  749. package/browser/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
  750. package/browser/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
  751. package/browser/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
  752. package/browser/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
  753. package/browser/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
  754. package/browser/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
  755. package/browser/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
  756. package/browser/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
  757. package/browser/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
  758. package/browser/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
  759. package/browser/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
  760. package/browser/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
  761. package/browser/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
  762. package/browser/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
  763. package/browser/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
  764. package/browser/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
  765. package/browser/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
  766. package/browser/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
  767. package/browser/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
  768. package/browser/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
  769. package/browser/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
  770. package/browser/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
  771. package/browser/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
  772. package/browser/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
  773. package/browser/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
  774. package/browser/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
  775. package/browser/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
  776. package/browser/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
  777. package/browser/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
  778. package/browser/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
  779. package/browser/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
  780. package/browser/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
  781. package/browser/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
  782. package/browser/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
  783. package/browser/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
  784. package/browser/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
  785. package/browser/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
  786. package/browser/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
  787. package/browser/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
  788. package/browser/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
  789. package/browser/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
  790. package/browser/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
  791. package/browser/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
  792. package/browser/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
  793. package/browser/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
  794. package/browser/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
  795. package/browser/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
  796. package/browser/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
  797. package/browser/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
  798. package/browser/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
  799. package/browser/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
  800. package/browser/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
  801. package/browser/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
  802. package/browser/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
  803. package/browser/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
  804. package/browser/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
  805. package/browser/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
  806. package/browser/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
  807. package/browser/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
  808. package/browser/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
  809. package/browser/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
  810. package/browser/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
  811. package/browser/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
  812. package/browser/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
  813. package/browser/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
  814. package/browser/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
  815. package/browser/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
  816. package/browser/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
  817. package/browser/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
  818. package/browser/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
  819. package/browser/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -346
  820. package/browser/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
  821. package/browser/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
  822. package/browser/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
  823. package/browser/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
  824. package/browser/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
  825. package/browser/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
  826. package/browser/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
  827. package/browser/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
  828. package/browser/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
  829. package/browser/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
  830. package/browser/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
  831. package/browser/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
  832. package/browser/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
  833. package/browser/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
  834. package/browser/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
  835. package/browser/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
  836. package/browser/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
  837. package/browser/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
  838. package/browser/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
  839. package/browser/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
  840. package/browser/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
  841. package/browser/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
  842. package/browser/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
  843. package/browser/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
  844. package/browser/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
  845. package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
  846. package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
  847. package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
  848. package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
  849. package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
  850. package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
  851. package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
  852. package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
  853. package/browser/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
  854. package/browser/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
  855. package/browser/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
  856. package/browser/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
  857. package/browser/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
  858. package/browser/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
  859. package/browser/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
  860. package/browser/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
  861. package/browser/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
  862. package/browser/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
  863. package/browser/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
  864. package/browser/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
  865. package/browser/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
  866. package/browser/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
  867. package/browser/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
  868. package/browser/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
  869. package/browser/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
  870. package/browser/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
  871. package/browser/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
  872. package/browser/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
  873. package/browser/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
  874. package/browser/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
  875. package/browser/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
  876. package/browser/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
  877. package/browser/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
  878. package/browser/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
  879. package/browser/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
  880. package/browser/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
  881. package/browser/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
  882. package/browser/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
  883. package/browser/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
  884. package/browser/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
  885. package/browser/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
  886. package/browser/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
  887. package/browser/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
  888. package/browser/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
  889. package/browser/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
  890. package/browser/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
  891. package/browser/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
  892. package/browser/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
  893. package/browser/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
  894. package/browser/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
  895. package/browser/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
  896. package/browser/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
  897. package/browser/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
  898. package/browser/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
  899. package/browser/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
  900. package/browser/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
  901. package/browser/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
  902. package/browser/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
  903. package/browser/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
  904. package/browser/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
  905. package/browser/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
  906. package/browser/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
  907. package/browser/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
  908. package/browser/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
  909. package/browser/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
  910. package/browser/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
  911. package/browser/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
  912. package/browser/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
  913. package/browser/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
  914. package/browser/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
  915. package/browser/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
  916. package/browser/esm2022/public-api.mjs +0 -2
  917. package/browser/esm2022/taon-typeorm.mjs +0 -5
  918. package/client/esm2022/lib/index.mjs +0 -4
  919. package/client/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
  920. package/client/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
  921. package/client/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
  922. package/client/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
  923. package/client/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
  924. package/client/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
  925. package/client/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
  926. package/client/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
  927. package/client/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
  928. package/client/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
  929. package/client/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
  930. package/client/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
  931. package/client/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
  932. package/client/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
  933. package/client/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
  934. package/client/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
  935. package/client/esm2022/lib/typeorm/constants.mjs +0 -4
  936. package/client/esm2022/lib/typeorm/container.mjs +0 -57
  937. package/client/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
  938. package/client/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
  939. package/client/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
  940. package/client/esm2022/lib/typeorm/data-source/index.mjs +0 -4
  941. package/client/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
  942. package/client/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
  943. package/client/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
  944. package/client/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
  945. package/client/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
  946. package/client/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
  947. package/client/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
  948. package/client/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
  949. package/client/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
  950. package/client/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
  951. package/client/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
  952. package/client/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
  953. package/client/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
  954. package/client/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
  955. package/client/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
  956. package/client/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
  957. package/client/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
  958. package/client/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
  959. package/client/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
  960. package/client/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
  961. package/client/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
  962. package/client/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
  963. package/client/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
  964. package/client/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
  965. package/client/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
  966. package/client/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
  967. package/client/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
  968. package/client/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
  969. package/client/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
  970. package/client/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
  971. package/client/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
  972. package/client/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
  973. package/client/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
  974. package/client/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
  975. package/client/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
  976. package/client/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
  977. package/client/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
  978. package/client/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
  979. package/client/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
  980. package/client/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
  981. package/client/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
  982. package/client/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
  983. package/client/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
  984. package/client/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
  985. package/client/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
  986. package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
  987. package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
  988. package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
  989. package/client/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
  990. package/client/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
  991. package/client/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
  992. package/client/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
  993. package/client/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
  994. package/client/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
  995. package/client/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
  996. package/client/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
  997. package/client/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
  998. package/client/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
  999. package/client/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
  1000. package/client/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
  1001. package/client/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
  1002. package/client/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
  1003. package/client/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
  1004. package/client/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
  1005. package/client/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
  1006. package/client/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
  1007. package/client/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
  1008. package/client/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
  1009. package/client/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
  1010. package/client/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
  1011. package/client/esm2022/lib/typeorm/driver/Query.mjs +0 -13
  1012. package/client/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
  1013. package/client/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
  1014. package/client/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
  1015. package/client/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
  1016. package/client/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
  1017. package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
  1018. package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
  1019. package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
  1020. package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
  1021. package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
  1022. package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
  1023. package/client/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
  1024. package/client/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
  1025. package/client/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
  1026. package/client/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
  1027. package/client/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
  1028. package/client/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
  1029. package/client/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
  1030. package/client/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
  1031. package/client/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
  1032. package/client/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
  1033. package/client/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
  1034. package/client/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
  1035. package/client/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
  1036. package/client/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
  1037. package/client/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
  1038. package/client/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
  1039. package/client/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
  1040. package/client/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
  1041. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
  1042. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
  1043. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
  1044. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
  1045. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
  1046. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
  1047. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
  1048. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
  1049. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
  1050. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
  1051. package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
  1052. package/client/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
  1053. package/client/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
  1054. package/client/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
  1055. package/client/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
  1056. package/client/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
  1057. package/client/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
  1058. package/client/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
  1059. package/client/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
  1060. package/client/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
  1061. package/client/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
  1062. package/client/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
  1063. package/client/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
  1064. package/client/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
  1065. package/client/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
  1066. package/client/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
  1067. package/client/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
  1068. package/client/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
  1069. package/client/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
  1070. package/client/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
  1071. package/client/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
  1072. package/client/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
  1073. package/client/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
  1074. package/client/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
  1075. package/client/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
  1076. package/client/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
  1077. package/client/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
  1078. package/client/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
  1079. package/client/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
  1080. package/client/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
  1081. package/client/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
  1082. package/client/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
  1083. package/client/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
  1084. package/client/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
  1085. package/client/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
  1086. package/client/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
  1087. package/client/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
  1088. package/client/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
  1089. package/client/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
  1090. package/client/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
  1091. package/client/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
  1092. package/client/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
  1093. package/client/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
  1094. package/client/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
  1095. package/client/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
  1096. package/client/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
  1097. package/client/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
  1098. package/client/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
  1099. package/client/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
  1100. package/client/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
  1101. package/client/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
  1102. package/client/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
  1103. package/client/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
  1104. package/client/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
  1105. package/client/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
  1106. package/client/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
  1107. package/client/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
  1108. package/client/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
  1109. package/client/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
  1110. package/client/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
  1111. package/client/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
  1112. package/client/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
  1113. package/client/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
  1114. package/client/esm2022/lib/typeorm/error/index.mjs +0 -63
  1115. package/client/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
  1116. package/client/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
  1117. package/client/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
  1118. package/client/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
  1119. package/client/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
  1120. package/client/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
  1121. package/client/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
  1122. package/client/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
  1123. package/client/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
  1124. package/client/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
  1125. package/client/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
  1126. package/client/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
  1127. package/client/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
  1128. package/client/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
  1129. package/client/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
  1130. package/client/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
  1131. package/client/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
  1132. package/client/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
  1133. package/client/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
  1134. package/client/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
  1135. package/client/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
  1136. package/client/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
  1137. package/client/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
  1138. package/client/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
  1139. package/client/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
  1140. package/client/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
  1141. package/client/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
  1142. package/client/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
  1143. package/client/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
  1144. package/client/esm2022/lib/typeorm/globals.mjs +0 -165
  1145. package/client/esm2022/lib/typeorm/index.mjs +0 -157
  1146. package/client/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
  1147. package/client/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
  1148. package/client/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
  1149. package/client/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
  1150. package/client/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
  1151. package/client/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
  1152. package/client/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
  1153. package/client/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
  1154. package/client/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
  1155. package/client/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
  1156. package/client/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
  1157. package/client/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
  1158. package/client/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
  1159. package/client/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
  1160. package/client/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
  1161. package/client/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
  1162. package/client/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
  1163. package/client/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
  1164. package/client/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
  1165. package/client/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
  1166. package/client/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
  1167. package/client/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
  1168. package/client/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
  1169. package/client/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
  1170. package/client/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
  1171. package/client/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
  1172. package/client/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
  1173. package/client/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
  1174. package/client/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
  1175. package/client/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
  1176. package/client/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
  1177. package/client/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
  1178. package/client/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
  1179. package/client/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
  1180. package/client/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
  1181. package/client/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
  1182. package/client/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
  1183. package/client/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
  1184. package/client/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
  1185. package/client/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
  1186. package/client/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
  1187. package/client/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
  1188. package/client/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
  1189. package/client/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
  1190. package/client/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
  1191. package/client/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
  1192. package/client/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
  1193. package/client/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
  1194. package/client/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
  1195. package/client/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
  1196. package/client/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
  1197. package/client/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
  1198. package/client/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
  1199. package/client/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
  1200. package/client/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
  1201. package/client/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
  1202. package/client/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
  1203. package/client/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
  1204. package/client/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
  1205. package/client/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
  1206. package/client/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
  1207. package/client/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
  1208. package/client/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
  1209. package/client/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
  1210. package/client/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
  1211. package/client/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
  1212. package/client/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
  1213. package/client/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
  1214. package/client/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
  1215. package/client/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
  1216. package/client/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
  1217. package/client/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
  1218. package/client/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
  1219. package/client/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
  1220. package/client/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
  1221. package/client/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
  1222. package/client/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
  1223. package/client/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -346
  1224. package/client/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
  1225. package/client/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
  1226. package/client/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
  1227. package/client/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
  1228. package/client/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
  1229. package/client/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
  1230. package/client/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
  1231. package/client/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
  1232. package/client/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
  1233. package/client/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
  1234. package/client/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
  1235. package/client/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
  1236. package/client/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
  1237. package/client/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
  1238. package/client/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
  1239. package/client/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
  1240. package/client/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
  1241. package/client/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
  1242. package/client/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
  1243. package/client/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
  1244. package/client/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
  1245. package/client/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
  1246. package/client/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
  1247. package/client/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
  1248. package/client/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
  1249. package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
  1250. package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
  1251. package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
  1252. package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
  1253. package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
  1254. package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
  1255. package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
  1256. package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
  1257. package/client/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
  1258. package/client/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
  1259. package/client/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
  1260. package/client/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
  1261. package/client/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
  1262. package/client/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
  1263. package/client/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
  1264. package/client/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
  1265. package/client/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
  1266. package/client/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
  1267. package/client/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
  1268. package/client/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
  1269. package/client/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
  1270. package/client/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
  1271. package/client/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
  1272. package/client/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
  1273. package/client/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
  1274. package/client/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
  1275. package/client/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
  1276. package/client/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
  1277. package/client/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
  1278. package/client/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
  1279. package/client/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
  1280. package/client/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
  1281. package/client/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
  1282. package/client/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
  1283. package/client/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
  1284. package/client/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
  1285. package/client/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
  1286. package/client/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
  1287. package/client/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
  1288. package/client/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
  1289. package/client/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
  1290. package/client/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
  1291. package/client/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
  1292. package/client/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
  1293. package/client/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
  1294. package/client/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
  1295. package/client/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
  1296. package/client/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
  1297. package/client/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
  1298. package/client/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
  1299. package/client/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
  1300. package/client/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
  1301. package/client/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
  1302. package/client/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
  1303. package/client/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
  1304. package/client/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
  1305. package/client/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
  1306. package/client/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
  1307. package/client/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
  1308. package/client/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
  1309. package/client/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
  1310. package/client/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
  1311. package/client/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
  1312. package/client/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
  1313. package/client/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
  1314. package/client/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
  1315. package/client/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
  1316. package/client/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
  1317. package/client/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
  1318. package/client/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
  1319. package/client/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
  1320. package/client/esm2022/public-api.mjs +0 -2
  1321. package/client/esm2022/taon-typeorm.mjs +0 -5
  1322. package/websql/esm2022/lib/index.mjs +0 -4
  1323. package/websql/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
  1324. package/websql/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
  1325. package/websql/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
  1326. package/websql/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
  1327. package/websql/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
  1328. package/websql/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
  1329. package/websql/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
  1330. package/websql/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
  1331. package/websql/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
  1332. package/websql/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
  1333. package/websql/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
  1334. package/websql/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
  1335. package/websql/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
  1336. package/websql/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
  1337. package/websql/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
  1338. package/websql/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
  1339. package/websql/esm2022/lib/typeorm/constants.mjs +0 -4
  1340. package/websql/esm2022/lib/typeorm/container.mjs +0 -57
  1341. package/websql/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
  1342. package/websql/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
  1343. package/websql/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
  1344. package/websql/esm2022/lib/typeorm/data-source/index.mjs +0 -4
  1345. package/websql/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
  1346. package/websql/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
  1347. package/websql/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
  1348. package/websql/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
  1349. package/websql/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
  1350. package/websql/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
  1351. package/websql/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
  1352. package/websql/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
  1353. package/websql/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
  1354. package/websql/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
  1355. package/websql/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
  1356. package/websql/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
  1357. package/websql/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
  1358. package/websql/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
  1359. package/websql/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
  1360. package/websql/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
  1361. package/websql/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
  1362. package/websql/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
  1363. package/websql/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
  1364. package/websql/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
  1365. package/websql/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
  1366. package/websql/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
  1367. package/websql/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
  1368. package/websql/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
  1369. package/websql/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
  1370. package/websql/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
  1371. package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
  1372. package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
  1373. package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
  1374. package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
  1375. package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
  1376. package/websql/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
  1377. package/websql/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
  1378. package/websql/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
  1379. package/websql/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
  1380. package/websql/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
  1381. package/websql/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
  1382. package/websql/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
  1383. package/websql/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
  1384. package/websql/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
  1385. package/websql/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
  1386. package/websql/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
  1387. package/websql/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
  1388. package/websql/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
  1389. package/websql/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
  1390. package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
  1391. package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
  1392. package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
  1393. package/websql/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
  1394. package/websql/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
  1395. package/websql/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
  1396. package/websql/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
  1397. package/websql/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
  1398. package/websql/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
  1399. package/websql/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
  1400. package/websql/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
  1401. package/websql/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
  1402. package/websql/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
  1403. package/websql/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
  1404. package/websql/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
  1405. package/websql/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
  1406. package/websql/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
  1407. package/websql/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
  1408. package/websql/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
  1409. package/websql/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
  1410. package/websql/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
  1411. package/websql/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
  1412. package/websql/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
  1413. package/websql/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
  1414. package/websql/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
  1415. package/websql/esm2022/lib/typeorm/driver/Query.mjs +0 -13
  1416. package/websql/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
  1417. package/websql/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
  1418. package/websql/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
  1419. package/websql/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
  1420. package/websql/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
  1421. package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
  1422. package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
  1423. package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
  1424. package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
  1425. package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
  1426. package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
  1427. package/websql/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
  1428. package/websql/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
  1429. package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
  1430. package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
  1431. package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
  1432. package/websql/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
  1433. package/websql/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
  1434. package/websql/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
  1435. package/websql/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
  1436. package/websql/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
  1437. package/websql/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
  1438. package/websql/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
  1439. package/websql/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
  1440. package/websql/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
  1441. package/websql/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
  1442. package/websql/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
  1443. package/websql/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
  1444. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
  1445. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
  1446. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
  1447. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
  1448. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
  1449. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
  1450. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
  1451. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
  1452. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
  1453. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
  1454. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
  1455. package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
  1456. package/websql/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
  1457. package/websql/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
  1458. package/websql/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
  1459. package/websql/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
  1460. package/websql/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
  1461. package/websql/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
  1462. package/websql/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
  1463. package/websql/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
  1464. package/websql/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
  1465. package/websql/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
  1466. package/websql/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
  1467. package/websql/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
  1468. package/websql/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
  1469. package/websql/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
  1470. package/websql/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
  1471. package/websql/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
  1472. package/websql/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
  1473. package/websql/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
  1474. package/websql/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
  1475. package/websql/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
  1476. package/websql/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
  1477. package/websql/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
  1478. package/websql/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
  1479. package/websql/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
  1480. package/websql/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
  1481. package/websql/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
  1482. package/websql/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
  1483. package/websql/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
  1484. package/websql/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
  1485. package/websql/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
  1486. package/websql/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
  1487. package/websql/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
  1488. package/websql/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
  1489. package/websql/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
  1490. package/websql/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
  1491. package/websql/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
  1492. package/websql/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
  1493. package/websql/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
  1494. package/websql/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
  1495. package/websql/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
  1496. package/websql/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
  1497. package/websql/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
  1498. package/websql/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
  1499. package/websql/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
  1500. package/websql/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
  1501. package/websql/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
  1502. package/websql/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
  1503. package/websql/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
  1504. package/websql/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
  1505. package/websql/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
  1506. package/websql/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
  1507. package/websql/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
  1508. package/websql/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
  1509. package/websql/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
  1510. package/websql/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
  1511. package/websql/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
  1512. package/websql/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
  1513. package/websql/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
  1514. package/websql/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
  1515. package/websql/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
  1516. package/websql/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
  1517. package/websql/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
  1518. package/websql/esm2022/lib/typeorm/error/index.mjs +0 -63
  1519. package/websql/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
  1520. package/websql/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
  1521. package/websql/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
  1522. package/websql/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
  1523. package/websql/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
  1524. package/websql/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
  1525. package/websql/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
  1526. package/websql/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
  1527. package/websql/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
  1528. package/websql/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
  1529. package/websql/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
  1530. package/websql/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
  1531. package/websql/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
  1532. package/websql/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
  1533. package/websql/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
  1534. package/websql/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
  1535. package/websql/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
  1536. package/websql/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
  1537. package/websql/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
  1538. package/websql/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
  1539. package/websql/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
  1540. package/websql/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
  1541. package/websql/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
  1542. package/websql/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
  1543. package/websql/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
  1544. package/websql/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
  1545. package/websql/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
  1546. package/websql/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
  1547. package/websql/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
  1548. package/websql/esm2022/lib/typeorm/globals.mjs +0 -165
  1549. package/websql/esm2022/lib/typeorm/index.mjs +0 -157
  1550. package/websql/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
  1551. package/websql/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
  1552. package/websql/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
  1553. package/websql/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
  1554. package/websql/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
  1555. package/websql/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
  1556. package/websql/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
  1557. package/websql/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
  1558. package/websql/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
  1559. package/websql/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
  1560. package/websql/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
  1561. package/websql/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
  1562. package/websql/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
  1563. package/websql/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
  1564. package/websql/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
  1565. package/websql/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
  1566. package/websql/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
  1567. package/websql/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
  1568. package/websql/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
  1569. package/websql/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
  1570. package/websql/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
  1571. package/websql/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
  1572. package/websql/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
  1573. package/websql/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
  1574. package/websql/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
  1575. package/websql/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
  1576. package/websql/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
  1577. package/websql/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
  1578. package/websql/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
  1579. package/websql/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
  1580. package/websql/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
  1581. package/websql/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
  1582. package/websql/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
  1583. package/websql/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
  1584. package/websql/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
  1585. package/websql/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
  1586. package/websql/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
  1587. package/websql/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
  1588. package/websql/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
  1589. package/websql/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
  1590. package/websql/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
  1591. package/websql/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
  1592. package/websql/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
  1593. package/websql/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
  1594. package/websql/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
  1595. package/websql/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
  1596. package/websql/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
  1597. package/websql/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
  1598. package/websql/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
  1599. package/websql/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
  1600. package/websql/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
  1601. package/websql/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
  1602. package/websql/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
  1603. package/websql/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
  1604. package/websql/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
  1605. package/websql/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
  1606. package/websql/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
  1607. package/websql/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
  1608. package/websql/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
  1609. package/websql/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
  1610. package/websql/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
  1611. package/websql/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
  1612. package/websql/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
  1613. package/websql/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
  1614. package/websql/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
  1615. package/websql/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
  1616. package/websql/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
  1617. package/websql/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
  1618. package/websql/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
  1619. package/websql/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
  1620. package/websql/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
  1621. package/websql/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
  1622. package/websql/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
  1623. package/websql/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
  1624. package/websql/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
  1625. package/websql/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
  1626. package/websql/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
  1627. package/websql/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -331
  1628. package/websql/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
  1629. package/websql/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
  1630. package/websql/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
  1631. package/websql/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
  1632. package/websql/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
  1633. package/websql/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
  1634. package/websql/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
  1635. package/websql/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
  1636. package/websql/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
  1637. package/websql/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
  1638. package/websql/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
  1639. package/websql/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
  1640. package/websql/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
  1641. package/websql/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
  1642. package/websql/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
  1643. package/websql/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
  1644. package/websql/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
  1645. package/websql/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
  1646. package/websql/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
  1647. package/websql/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
  1648. package/websql/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
  1649. package/websql/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
  1650. package/websql/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
  1651. package/websql/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
  1652. package/websql/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
  1653. package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
  1654. package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
  1655. package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
  1656. package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
  1657. package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
  1658. package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
  1659. package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
  1660. package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
  1661. package/websql/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
  1662. package/websql/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
  1663. package/websql/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
  1664. package/websql/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
  1665. package/websql/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
  1666. package/websql/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
  1667. package/websql/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
  1668. package/websql/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
  1669. package/websql/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
  1670. package/websql/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
  1671. package/websql/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
  1672. package/websql/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
  1673. package/websql/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
  1674. package/websql/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
  1675. package/websql/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
  1676. package/websql/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
  1677. package/websql/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
  1678. package/websql/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
  1679. package/websql/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
  1680. package/websql/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
  1681. package/websql/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
  1682. package/websql/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
  1683. package/websql/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
  1684. package/websql/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
  1685. package/websql/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
  1686. package/websql/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
  1687. package/websql/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
  1688. package/websql/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
  1689. package/websql/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
  1690. package/websql/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
  1691. package/websql/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
  1692. package/websql/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
  1693. package/websql/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
  1694. package/websql/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
  1695. package/websql/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
  1696. package/websql/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
  1697. package/websql/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
  1698. package/websql/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
  1699. package/websql/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
  1700. package/websql/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
  1701. package/websql/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
  1702. package/websql/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
  1703. package/websql/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
  1704. package/websql/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
  1705. package/websql/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
  1706. package/websql/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
  1707. package/websql/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
  1708. package/websql/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
  1709. package/websql/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
  1710. package/websql/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
  1711. package/websql/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
  1712. package/websql/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
  1713. package/websql/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
  1714. package/websql/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
  1715. package/websql/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
  1716. package/websql/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
  1717. package/websql/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
  1718. package/websql/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
  1719. package/websql/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
  1720. package/websql/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
  1721. package/websql/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
  1722. package/websql/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
  1723. package/websql/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
  1724. package/websql/esm2022/public-api.mjs +0 -2
  1725. package/websql/esm2022/taon-typeorm.mjs +0 -5
@@ -1,2278 +0,0 @@
1
- var SelectQueryBuilder_1;
2
- import { __decorate } from "tslib";
3
- import { RawSqlResultsToEntityTransformer } from "./transformer/RawSqlResultsToEntityTransformer";
4
- import { PessimisticLockTransactionRequiredError } from "../error/PessimisticLockTransactionRequiredError";
5
- import { NoVersionOrUpdateDateColumnError } from "../error/NoVersionOrUpdateDateColumnError";
6
- import { OptimisticLockVersionMismatchError } from "../error/OptimisticLockVersionMismatchError";
7
- import { OptimisticLockCanNotBeUsedError } from "../error/OptimisticLockCanNotBeUsedError";
8
- import { JoinAttribute } from "./JoinAttribute";
9
- import { RelationIdAttribute } from "./relation-id/RelationIdAttribute";
10
- import { RelationCountAttribute } from "./relation-count/RelationCountAttribute";
11
- import { RelationIdLoader } from "./relation-id/RelationIdLoader";
12
- import { RelationIdMetadataToAttributeTransformer } from "./relation-id/RelationIdMetadataToAttributeTransformer";
13
- import { RelationCountLoader } from "./relation-count/RelationCountLoader";
14
- import { RelationCountMetadataToAttributeTransformer } from "./relation-count/RelationCountMetadataToAttributeTransformer";
15
- import { QueryBuilder } from "./QueryBuilder";
16
- /* */
17
- /* */
18
- import { LockNotSupportedOnGivenDriverError } from "../error/LockNotSupportedOnGivenDriverError";
19
- import { OffsetWithoutLimitNotSupportedError } from "../error/OffsetWithoutLimitNotSupportedError";
20
- import { ObjectUtils } from "../util/ObjectUtils";
21
- import { DriverUtils } from "../driver/DriverUtils";
22
- import { EntityNotFoundError } from "../error/EntityNotFoundError";
23
- import { TypeORMError } from "../error";
24
- import { FindOptionsUtils } from "../find-options/FindOptionsUtils";
25
- import { ApplyValueTransformers } from "../util/ApplyValueTransformers";
26
- import { OrmUtils } from "../util/OrmUtils";
27
- import { EntityPropertyNotFoundError } from "../error/EntityPropertyNotFoundError";
28
- /* */
29
- /* */
30
- import { InstanceChecker } from "../util/InstanceChecker";
31
- import { CLASS } from "typescript-class-helpers/websql";
32
- /**
33
- * Allows to build complex sql queries in a fashion way and execute those queries.
34
- */
35
- let SelectQueryBuilder = SelectQueryBuilder_1 = class SelectQueryBuilder extends QueryBuilder {
36
- constructor() {
37
- super(...arguments);
38
- this["@instanceof"] = Symbol.for("SelectQueryBuilder");
39
- this.findOptions = {};
40
- this.selects = [];
41
- this.joins = [];
42
- this.conditions = "";
43
- this.orderBys = [];
44
- this.relationMetadatas = [];
45
- }
46
- /**
47
- * Gets generated SQL query without parameters being replaced.
48
- */
49
- getQuery() {
50
- let sql = this.createComment();
51
- sql += this.createCteExpression();
52
- sql += this.createSelectExpression();
53
- sql += this.createJoinExpression();
54
- sql += this.createWhereExpression();
55
- sql += this.createGroupByExpression();
56
- sql += this.createHavingExpression();
57
- sql += this.createOrderByExpression();
58
- sql += this.createLimitOffsetExpression();
59
- sql += this.createLockExpression();
60
- sql = sql.trim();
61
- if (this.expressionMap.subQuery)
62
- sql = "(" + sql + ")";
63
- return sql;
64
- }
65
- setFindOptions(findOptions) {
66
- this.findOptions = findOptions;
67
- this.applyFindOptions();
68
- return this;
69
- }
70
- /**
71
- * Creates a subquery - query that can be used inside other queries.
72
- */
73
- subQuery() {
74
- const qb = this.createQueryBuilder();
75
- qb.expressionMap.subQuery = true;
76
- qb.parentQueryBuilder = this;
77
- return qb;
78
- }
79
- /**
80
- * Creates SELECT query and selects given data.
81
- * Replaces all previous selections if they exist.
82
- */
83
- select(selection, selectionAliasName) {
84
- this.expressionMap.queryType = "select";
85
- if (Array.isArray(selection)) {
86
- this.expressionMap.selects = selection.map((selection) => ({
87
- selection: selection,
88
- }));
89
- }
90
- else if (typeof selection === "function") {
91
- const subQueryBuilder = selection(this.subQuery());
92
- this.setParameters(subQueryBuilder.getParameters());
93
- this.expressionMap.selects.push({
94
- selection: subQueryBuilder.getQuery(),
95
- aliasName: selectionAliasName,
96
- });
97
- }
98
- else if (selection) {
99
- this.expressionMap.selects = [
100
- { selection: selection, aliasName: selectionAliasName },
101
- ];
102
- }
103
- return this;
104
- }
105
- /**
106
- * Adds new selection to the SELECT query.
107
- */
108
- addSelect(selection, selectionAliasName) {
109
- if (!selection)
110
- return this;
111
- if (Array.isArray(selection)) {
112
- this.expressionMap.selects = this.expressionMap.selects.concat(selection.map((selection) => ({ selection: selection })));
113
- }
114
- else if (typeof selection === "function") {
115
- const subQueryBuilder = selection(this.subQuery());
116
- this.setParameters(subQueryBuilder.getParameters());
117
- this.expressionMap.selects.push({
118
- selection: subQueryBuilder.getQuery(),
119
- aliasName: selectionAliasName,
120
- });
121
- }
122
- else if (selection) {
123
- this.expressionMap.selects.push({
124
- selection: selection,
125
- aliasName: selectionAliasName,
126
- });
127
- }
128
- return this;
129
- }
130
- /**
131
- * Set max execution time.
132
- * @param milliseconds
133
- */
134
- maxExecutionTime(milliseconds) {
135
- this.expressionMap.maxExecutionTime = milliseconds;
136
- return this;
137
- }
138
- /**
139
- * Sets whether the selection is DISTINCT.
140
- */
141
- distinct(distinct = true) {
142
- this.expressionMap.selectDistinct = distinct;
143
- return this;
144
- }
145
- /**
146
- * Sets the distinct on clause for Postgres.
147
- */
148
- distinctOn(distinctOn) {
149
- this.expressionMap.selectDistinctOn = distinctOn;
150
- return this;
151
- }
152
- /**
153
- * Specifies FROM which entity's table select/update/delete will be executed.
154
- * Also sets a main string alias of the selection data.
155
- * Removes all previously set from-s.
156
- */
157
- from(entityTarget, aliasName) {
158
- const mainAlias = this.createFromAlias(entityTarget, aliasName);
159
- this.expressionMap.setMainAlias(mainAlias);
160
- return this;
161
- }
162
- /**
163
- * Specifies FROM which entity's table select/update/delete will be executed.
164
- * Also sets a main string alias of the selection data.
165
- */
166
- addFrom(entityTarget, aliasName) {
167
- const alias = this.createFromAlias(entityTarget, aliasName);
168
- if (!this.expressionMap.mainAlias)
169
- this.expressionMap.setMainAlias(alias);
170
- return this;
171
- }
172
- /**
173
- * INNER JOINs (without selection).
174
- * You also need to specify an alias of the joined data.
175
- * Optionally, you can add condition and parameters used in condition.
176
- */
177
- innerJoin(entityOrProperty, alias, condition, parameters) {
178
- this.join("INNER", entityOrProperty, alias, condition, parameters);
179
- return this;
180
- }
181
- /**
182
- * LEFT JOINs (without selection).
183
- * You also need to specify an alias of the joined data.
184
- * Optionally, you can add condition and parameters used in condition.
185
- */
186
- leftJoin(entityOrProperty, alias, condition, parameters) {
187
- this.join("LEFT", entityOrProperty, alias, condition, parameters);
188
- return this;
189
- }
190
- /**
191
- * INNER JOINs and adds all selection properties to SELECT.
192
- * You also need to specify an alias of the joined data.
193
- * Optionally, you can add condition and parameters used in condition.
194
- */
195
- innerJoinAndSelect(entityOrProperty, alias, condition, parameters) {
196
- this.addSelect(alias);
197
- this.innerJoin(entityOrProperty, alias, condition, parameters);
198
- return this;
199
- }
200
- /**
201
- * LEFT JOINs and adds all selection properties to SELECT.
202
- * You also need to specify an alias of the joined data.
203
- * Optionally, you can add condition and parameters used in condition.
204
- */
205
- leftJoinAndSelect(entityOrProperty, alias, condition, parameters) {
206
- this.addSelect(alias);
207
- this.leftJoin(entityOrProperty, alias, condition, parameters);
208
- return this;
209
- }
210
- /**
211
- * INNER JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
212
- * This is extremely useful when you want to select some data and map it to some virtual property.
213
- * It will assume that there are multiple rows of selecting data, and mapped result will be an array.
214
- * You also need to specify an alias of the joined data.
215
- * Optionally, you can add condition and parameters used in condition.
216
- */
217
- innerJoinAndMapMany(mapToProperty, entityOrProperty, alias, condition, parameters) {
218
- this.addSelect(alias);
219
- this.join("INNER", entityOrProperty, alias, condition, parameters, mapToProperty, true);
220
- return this;
221
- }
222
- /**
223
- * INNER JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
224
- * This is extremely useful when you want to select some data and map it to some virtual property.
225
- * It will assume that there is a single row of selecting data, and mapped result will be a single selected value.
226
- * You also need to specify an alias of the joined data.
227
- * Optionally, you can add condition and parameters used in condition.
228
- */
229
- innerJoinAndMapOne(mapToProperty, entityOrProperty, alias, condition, parameters) {
230
- this.addSelect(alias);
231
- this.join("INNER", entityOrProperty, alias, condition, parameters, mapToProperty, false);
232
- return this;
233
- }
234
- /**
235
- * LEFT JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
236
- * This is extremely useful when you want to select some data and map it to some virtual property.
237
- * It will assume that there are multiple rows of selecting data, and mapped result will be an array.
238
- * You also need to specify an alias of the joined data.
239
- * Optionally, you can add condition and parameters used in condition.
240
- */
241
- leftJoinAndMapMany(mapToProperty, entityOrProperty, alias, condition, parameters) {
242
- this.addSelect(alias);
243
- this.join("LEFT", entityOrProperty, alias, condition, parameters, mapToProperty, true);
244
- return this;
245
- }
246
- /**
247
- * LEFT JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
248
- * This is extremely useful when you want to select some data and map it to some virtual property.
249
- * It will assume that there is a single row of selecting data, and mapped result will be a single selected value.
250
- * You also need to specify an alias of the joined data.
251
- * Optionally, you can add condition and parameters used in condition.
252
- */
253
- leftJoinAndMapOne(mapToProperty, entityOrProperty, alias, condition, parameters) {
254
- this.addSelect(alias);
255
- this.join("LEFT", entityOrProperty, alias, condition, parameters, mapToProperty, false);
256
- return this;
257
- }
258
- /**
259
- * LEFT JOINs relation id and maps it into some entity's property.
260
- * Optionally, you can add condition and parameters used in condition.
261
- */
262
- loadRelationIdAndMap(mapToProperty, relationName, aliasNameOrOptions, queryBuilderFactory) {
263
- const relationIdAttribute = new RelationIdAttribute(this.expressionMap);
264
- relationIdAttribute.mapToProperty = mapToProperty;
265
- relationIdAttribute.relationName = relationName;
266
- if (typeof aliasNameOrOptions === "string")
267
- relationIdAttribute.alias = aliasNameOrOptions;
268
- if (typeof aliasNameOrOptions === "object" &&
269
- aliasNameOrOptions.disableMixedMap)
270
- relationIdAttribute.disableMixedMap = true;
271
- relationIdAttribute.queryBuilderFactory = queryBuilderFactory;
272
- this.expressionMap.relationIdAttributes.push(relationIdAttribute);
273
- if (relationIdAttribute.relation.junctionEntityMetadata) {
274
- this.expressionMap.createAlias({
275
- type: "other",
276
- name: relationIdAttribute.junctionAlias,
277
- metadata: relationIdAttribute.relation.junctionEntityMetadata,
278
- });
279
- }
280
- return this;
281
- }
282
- /**
283
- * Counts number of entities of entity's relation and maps the value into some entity's property.
284
- * Optionally, you can add condition and parameters used in condition.
285
- */
286
- loadRelationCountAndMap(mapToProperty, relationName, aliasName, queryBuilderFactory) {
287
- const relationCountAttribute = new RelationCountAttribute(this.expressionMap);
288
- relationCountAttribute.mapToProperty = mapToProperty;
289
- relationCountAttribute.relationName = relationName;
290
- relationCountAttribute.alias = aliasName;
291
- relationCountAttribute.queryBuilderFactory = queryBuilderFactory;
292
- this.expressionMap.relationCountAttributes.push(relationCountAttribute);
293
- this.expressionMap.createAlias({
294
- type: "other",
295
- name: relationCountAttribute.junctionAlias,
296
- });
297
- if (relationCountAttribute.relation.junctionEntityMetadata) {
298
- this.expressionMap.createAlias({
299
- type: "other",
300
- name: relationCountAttribute.junctionAlias,
301
- metadata: relationCountAttribute.relation.junctionEntityMetadata,
302
- });
303
- }
304
- return this;
305
- }
306
- /**
307
- * Loads all relation ids for all relations of the selected entity.
308
- * All relation ids will be mapped to relation property themself.
309
- * If array of strings is given then loads only relation ids of the given properties.
310
- */
311
- loadAllRelationIds(options) {
312
- this.expressionMap.mainAlias.metadata.relations.forEach((relation) => {
313
- if (options !== undefined &&
314
- options.relations !== undefined &&
315
- options.relations.indexOf(relation.propertyPath) === -1)
316
- return;
317
- this.loadRelationIdAndMap(this.expressionMap.mainAlias.name +
318
- "." +
319
- relation.propertyPath, this.expressionMap.mainAlias.name +
320
- "." +
321
- relation.propertyPath, options);
322
- });
323
- return this;
324
- }
325
- /**
326
- * Sets WHERE condition in the query builder.
327
- * If you had previously WHERE expression defined,
328
- * calling this function will override previously set WHERE conditions.
329
- * Additionally you can add parameters used in where expression.
330
- */
331
- where(where, parameters) {
332
- this.expressionMap.wheres = []; // don't move this block below since computeWhereParameter can add where expressions
333
- const condition = this.getWhereCondition(where);
334
- if (condition)
335
- this.expressionMap.wheres = [
336
- { type: "simple", condition: condition },
337
- ];
338
- if (parameters)
339
- this.setParameters(parameters);
340
- return this;
341
- }
342
- /**
343
- * Adds new AND WHERE condition in the query builder.
344
- * Additionally you can add parameters used in where expression.
345
- */
346
- andWhere(where, parameters) {
347
- this.expressionMap.wheres.push({
348
- type: "and",
349
- condition: this.getWhereCondition(where),
350
- });
351
- if (parameters)
352
- this.setParameters(parameters);
353
- return this;
354
- }
355
- /**
356
- * Adds new OR WHERE condition in the query builder.
357
- * Additionally you can add parameters used in where expression.
358
- */
359
- orWhere(where, parameters) {
360
- this.expressionMap.wheres.push({
361
- type: "or",
362
- condition: this.getWhereCondition(where),
363
- });
364
- if (parameters)
365
- this.setParameters(parameters);
366
- return this;
367
- }
368
- /**
369
- * Adds new AND WHERE with conditions for the given ids.
370
- *
371
- * Ids are mixed.
372
- * It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
373
- * If you have multiple primary keys you need to pass object with property names and values specified,
374
- * for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
375
- */
376
- whereInIds(ids) {
377
- return this.where(this.getWhereInIdsCondition(ids));
378
- }
379
- /**
380
- * Adds new AND WHERE with conditions for the given ids.
381
- *
382
- * Ids are mixed.
383
- * It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
384
- * If you have multiple primary keys you need to pass object with property names and values specified,
385
- * for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
386
- */
387
- andWhereInIds(ids) {
388
- return this.andWhere(this.getWhereInIdsCondition(ids));
389
- }
390
- /**
391
- * Adds new OR WHERE with conditions for the given ids.
392
- *
393
- * Ids are mixed.
394
- * It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
395
- * If you have multiple primary keys you need to pass object with property names and values specified,
396
- * for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
397
- */
398
- orWhereInIds(ids) {
399
- return this.orWhere(this.getWhereInIdsCondition(ids));
400
- }
401
- /**
402
- * Sets HAVING condition in the query builder.
403
- * If you had previously HAVING expression defined,
404
- * calling this function will override previously set HAVING conditions.
405
- * Additionally you can add parameters used in where expression.
406
- */
407
- having(having, parameters) {
408
- this.expressionMap.havings.push({ type: "simple", condition: having });
409
- if (parameters)
410
- this.setParameters(parameters);
411
- return this;
412
- }
413
- /**
414
- * Adds new AND HAVING condition in the query builder.
415
- * Additionally you can add parameters used in where expression.
416
- */
417
- andHaving(having, parameters) {
418
- this.expressionMap.havings.push({ type: "and", condition: having });
419
- if (parameters)
420
- this.setParameters(parameters);
421
- return this;
422
- }
423
- /**
424
- * Adds new OR HAVING condition in the query builder.
425
- * Additionally you can add parameters used in where expression.
426
- */
427
- orHaving(having, parameters) {
428
- this.expressionMap.havings.push({ type: "or", condition: having });
429
- if (parameters)
430
- this.setParameters(parameters);
431
- return this;
432
- }
433
- /**
434
- * Sets GROUP BY condition in the query builder.
435
- * If you had previously GROUP BY expression defined,
436
- * calling this function will override previously set GROUP BY conditions.
437
- */
438
- groupBy(groupBy) {
439
- if (groupBy) {
440
- this.expressionMap.groupBys = [groupBy];
441
- }
442
- else {
443
- this.expressionMap.groupBys = [];
444
- }
445
- return this;
446
- }
447
- /**
448
- * Adds GROUP BY condition in the query builder.
449
- */
450
- addGroupBy(groupBy) {
451
- this.expressionMap.groupBys.push(groupBy);
452
- return this;
453
- }
454
- /**
455
- * Sets ORDER BY condition in the query builder.
456
- * If you had previously ORDER BY expression defined,
457
- * calling this function will override previously set ORDER BY conditions.
458
- */
459
- orderBy(sort, order = "ASC", nulls) {
460
- if (order !== undefined && order !== "ASC" && order !== "DESC")
461
- throw new TypeORMError(`SelectQueryBuilder.addOrderBy "order" can accept only "ASC" and "DESC" values.`);
462
- if (nulls !== undefined &&
463
- nulls !== "NULLS FIRST" &&
464
- nulls !== "NULLS LAST")
465
- throw new TypeORMError(`SelectQueryBuilder.addOrderBy "nulls" can accept only "NULLS FIRST" and "NULLS LAST" values.`);
466
- if (sort) {
467
- if (typeof sort === "object") {
468
- this.expressionMap.orderBys = sort;
469
- }
470
- else {
471
- if (nulls) {
472
- this.expressionMap.orderBys = {
473
- [sort]: { order, nulls },
474
- };
475
- }
476
- else {
477
- this.expressionMap.orderBys = { [sort]: order };
478
- }
479
- }
480
- }
481
- else {
482
- this.expressionMap.orderBys = {};
483
- }
484
- return this;
485
- }
486
- /**
487
- * Adds ORDER BY condition in the query builder.
488
- */
489
- addOrderBy(sort, order = "ASC", nulls) {
490
- if (order !== undefined && order !== "ASC" && order !== "DESC")
491
- throw new TypeORMError(`SelectQueryBuilder.addOrderBy "order" can accept only "ASC" and "DESC" values.`);
492
- if (nulls !== undefined &&
493
- nulls !== "NULLS FIRST" &&
494
- nulls !== "NULLS LAST")
495
- throw new TypeORMError(`SelectQueryBuilder.addOrderBy "nulls" can accept only "NULLS FIRST" and "NULLS LAST" values.`);
496
- if (nulls) {
497
- this.expressionMap.orderBys[sort] = { order, nulls };
498
- }
499
- else {
500
- this.expressionMap.orderBys[sort] = order;
501
- }
502
- return this;
503
- }
504
- /**
505
- * Set's LIMIT - maximum number of rows to be selected.
506
- * NOTE that it may not work as you expect if you are using joins.
507
- * If you want to implement pagination, and you are having join in your query,
508
- * then use instead take method instead.
509
- */
510
- limit(limit) {
511
- this.expressionMap.limit = this.normalizeNumber(limit);
512
- if (this.expressionMap.limit !== undefined &&
513
- isNaN(this.expressionMap.limit))
514
- throw new TypeORMError(`Provided "limit" value is not a number. Please provide a numeric value.`);
515
- return this;
516
- }
517
- /**
518
- * Set's OFFSET - selection offset.
519
- * NOTE that it may not work as you expect if you are using joins.
520
- * If you want to implement pagination, and you are having join in your query,
521
- * then use instead skip method instead.
522
- */
523
- offset(offset) {
524
- this.expressionMap.offset = this.normalizeNumber(offset);
525
- if (this.expressionMap.offset !== undefined &&
526
- isNaN(this.expressionMap.offset))
527
- throw new TypeORMError(`Provided "offset" value is not a number. Please provide a numeric value.`);
528
- return this;
529
- }
530
- /**
531
- * Sets maximal number of entities to take.
532
- */
533
- take(take) {
534
- this.expressionMap.take = this.normalizeNumber(take);
535
- if (this.expressionMap.take !== undefined &&
536
- isNaN(this.expressionMap.take))
537
- throw new TypeORMError(`Provided "take" value is not a number. Please provide a numeric value.`);
538
- return this;
539
- }
540
- /**
541
- * Sets number of entities to skip.
542
- */
543
- skip(skip) {
544
- this.expressionMap.skip = this.normalizeNumber(skip);
545
- if (this.expressionMap.skip !== undefined &&
546
- isNaN(this.expressionMap.skip))
547
- throw new TypeORMError(`Provided "skip" value is not a number. Please provide a numeric value.`);
548
- return this;
549
- }
550
- /**
551
- * Set certain index to be used by the query.
552
- *
553
- * @param index Name of index to be used.
554
- */
555
- useIndex(index) {
556
- this.expressionMap.useIndex = index;
557
- return this;
558
- }
559
- /**
560
- * Sets locking mode.
561
- */
562
- setLock(lockMode, lockVersion, lockTables) {
563
- this.expressionMap.lockMode = lockMode;
564
- this.expressionMap.lockVersion = lockVersion;
565
- this.expressionMap.lockTables = lockTables;
566
- return this;
567
- }
568
- /**
569
- * Sets lock handling by adding NO WAIT or SKIP LOCKED.
570
- */
571
- setOnLocked(onLocked) {
572
- this.expressionMap.onLocked = onLocked;
573
- return this;
574
- }
575
- /**
576
- * Disables the global condition of "non-deleted" for the entity with delete date columns.
577
- */
578
- withDeleted() {
579
- this.expressionMap.withDeleted = true;
580
- return this;
581
- }
582
- /**
583
- * Gets first raw result returned by execution of generated query builder sql.
584
- */
585
- async getRawOne() {
586
- return (await this.getRawMany())[0];
587
- }
588
- /**
589
- * Gets all raw results returned by execution of generated query builder sql.
590
- */
591
- async getRawMany() {
592
- if (this.expressionMap.lockMode === "optimistic")
593
- throw new OptimisticLockCanNotBeUsedError();
594
- this.expressionMap.queryEntity = false;
595
- const queryRunner = this.obtainQueryRunner();
596
- let transactionStartedByUs = false;
597
- try {
598
- if (this.expressionMap.useTransaction === true &&
599
- queryRunner.isTransactionActive === false) {
600
- await queryRunner.startTransaction();
601
- transactionStartedByUs = true;
602
- }
603
- const results = await this.loadRawResults(queryRunner);
604
- if (transactionStartedByUs) {
605
- await queryRunner.commitTransaction();
606
- }
607
- return results;
608
- }
609
- catch (error) {
610
- if (transactionStartedByUs) {
611
- try {
612
- await queryRunner.rollbackTransaction();
613
- }
614
- catch (rollbackError) { }
615
- }
616
- throw error;
617
- }
618
- finally {
619
- if (queryRunner !== this.queryRunner) {
620
- await queryRunner.release();
621
- }
622
- }
623
- }
624
- /**
625
- * Executes sql generated by query builder and returns object with raw results and entities created from them.
626
- */
627
- async getRawAndEntities() {
628
- const queryRunner = this.obtainQueryRunner();
629
- let transactionStartedByUs = false;
630
- try {
631
- if (this.expressionMap.useTransaction === true &&
632
- queryRunner.isTransactionActive === false) {
633
- await queryRunner.startTransaction();
634
- transactionStartedByUs = true;
635
- }
636
- this.expressionMap.queryEntity = true;
637
- const results = await this.executeEntitiesAndRawResults(queryRunner);
638
- if (transactionStartedByUs) {
639
- await queryRunner.commitTransaction();
640
- }
641
- return results;
642
- }
643
- catch (error) {
644
- if (transactionStartedByUs) {
645
- try {
646
- await queryRunner.rollbackTransaction();
647
- }
648
- catch (rollbackError) { }
649
- }
650
- throw error;
651
- }
652
- finally {
653
- if (queryRunner !== this.queryRunner)
654
- await queryRunner.release();
655
- }
656
- }
657
- /**
658
- * Gets single entity returned by execution of generated query builder sql.
659
- */
660
- async getOne() {
661
- const results = await this.getRawAndEntities();
662
- const result = results.entities[0];
663
- if (result &&
664
- this.expressionMap.lockMode === "optimistic" &&
665
- this.expressionMap.lockVersion) {
666
- const metadata = this.expressionMap.mainAlias.metadata;
667
- if (this.expressionMap.lockVersion instanceof Date) {
668
- const actualVersion = metadata.updateDateColumn.getEntityValue(result); // what if columns arent set?
669
- if (actualVersion.getTime() !==
670
- this.expressionMap.lockVersion.getTime())
671
- throw new OptimisticLockVersionMismatchError(metadata.name, this.expressionMap.lockVersion, actualVersion);
672
- }
673
- else {
674
- const actualVersion = metadata.versionColumn.getEntityValue(result); // what if columns arent set?
675
- if (actualVersion !== this.expressionMap.lockVersion)
676
- throw new OptimisticLockVersionMismatchError(metadata.name, this.expressionMap.lockVersion, actualVersion);
677
- }
678
- }
679
- if (result === undefined) {
680
- return null;
681
- }
682
- return result;
683
- }
684
- /**
685
- * Gets the first entity returned by execution of generated query builder sql or rejects the returned promise on error.
686
- */
687
- async getOneOrFail() {
688
- const entity = await this.getOne();
689
- if (!entity) {
690
- throw new EntityNotFoundError(this.expressionMap.mainAlias.target, this);
691
- }
692
- return entity;
693
- }
694
- /**
695
- * Gets entities returned by execution of generated query builder sql.
696
- */
697
- async getMany() {
698
- if (this.expressionMap.lockMode === "optimistic")
699
- throw new OptimisticLockCanNotBeUsedError();
700
- const results = await this.getRawAndEntities();
701
- return results.entities;
702
- }
703
- /**
704
- * Gets count - number of entities selected by sql generated by this query builder.
705
- * Count excludes all limitations set by setFirstResult and setMaxResults methods call.
706
- */
707
- async getCount() {
708
- if (this.expressionMap.lockMode === "optimistic")
709
- throw new OptimisticLockCanNotBeUsedError();
710
- const queryRunner = this.obtainQueryRunner();
711
- let transactionStartedByUs = false;
712
- try {
713
- if (this.expressionMap.useTransaction === true &&
714
- queryRunner.isTransactionActive === false) {
715
- await queryRunner.startTransaction();
716
- transactionStartedByUs = true;
717
- }
718
- this.expressionMap.queryEntity = false;
719
- const results = await this.executeCountQuery(queryRunner);
720
- if (transactionStartedByUs) {
721
- await queryRunner.commitTransaction();
722
- }
723
- return results;
724
- }
725
- catch (error) {
726
- if (transactionStartedByUs) {
727
- try {
728
- await queryRunner.rollbackTransaction();
729
- }
730
- catch (rollbackError) { }
731
- }
732
- throw error;
733
- }
734
- finally {
735
- if (queryRunner !== this.queryRunner)
736
- await queryRunner.release();
737
- }
738
- }
739
- /**
740
- * Executes built SQL query and returns entities and overall entities count (without limitation).
741
- * This method is useful to build pagination.
742
- */
743
- async getManyAndCount() {
744
- if (this.expressionMap.lockMode === "optimistic")
745
- throw new OptimisticLockCanNotBeUsedError();
746
- const queryRunner = this.obtainQueryRunner();
747
- let transactionStartedByUs = false;
748
- try {
749
- if (this.expressionMap.useTransaction === true &&
750
- queryRunner.isTransactionActive === false) {
751
- await queryRunner.startTransaction();
752
- transactionStartedByUs = true;
753
- }
754
- this.expressionMap.queryEntity = true;
755
- const entitiesAndRaw = await this.executeEntitiesAndRawResults(queryRunner);
756
- this.expressionMap.queryEntity = false;
757
- const cacheId = this.expressionMap.cacheId;
758
- this.expressionMap.cacheId = cacheId ? `${cacheId}-count` : cacheId;
759
- const count = await this.executeCountQuery(queryRunner);
760
- const results = [entitiesAndRaw.entities, count];
761
- if (transactionStartedByUs) {
762
- await queryRunner.commitTransaction();
763
- }
764
- return results;
765
- }
766
- catch (error) {
767
- if (transactionStartedByUs) {
768
- try {
769
- await queryRunner.rollbackTransaction();
770
- }
771
- catch (rollbackError) { }
772
- }
773
- throw error;
774
- }
775
- finally {
776
- if (queryRunner !== this.queryRunner)
777
- await queryRunner.release();
778
- }
779
- }
780
- /**
781
- * Enables or disables query result caching.
782
- */
783
- cache(enabledOrMillisecondsOrId, maybeMilliseconds) {
784
- if (typeof enabledOrMillisecondsOrId === "boolean") {
785
- this.expressionMap.cache = enabledOrMillisecondsOrId;
786
- }
787
- else if (typeof enabledOrMillisecondsOrId === "number") {
788
- this.expressionMap.cache = true;
789
- this.expressionMap.cacheDuration = enabledOrMillisecondsOrId;
790
- }
791
- else if (typeof enabledOrMillisecondsOrId === "string" ||
792
- typeof enabledOrMillisecondsOrId === "number") {
793
- this.expressionMap.cache = true;
794
- this.expressionMap.cacheId = enabledOrMillisecondsOrId;
795
- }
796
- if (maybeMilliseconds) {
797
- this.expressionMap.cacheDuration = maybeMilliseconds;
798
- }
799
- return this;
800
- }
801
- /**
802
- * Sets extra options that can be used to configure how query builder works.
803
- */
804
- setOption(option) {
805
- this.expressionMap.options.push(option);
806
- return this;
807
- }
808
- join(direction, entityOrProperty, aliasName, condition, parameters, mapToProperty, isMappingMany) {
809
- this.setParameters(parameters || {});
810
- const joinAttribute = new JoinAttribute(this.connection, this.expressionMap);
811
- joinAttribute.direction = direction;
812
- joinAttribute.mapToProperty = mapToProperty;
813
- joinAttribute.isMappingMany = isMappingMany;
814
- joinAttribute.entityOrProperty = entityOrProperty; // relationName
815
- joinAttribute.condition = condition ? condition : undefined; // joinInverseSideCondition
816
- this.expressionMap.joinAttributes.push(joinAttribute);
817
- if (joinAttribute.metadata) {
818
- if (joinAttribute.metadata.deleteDateColumn &&
819
- !this.expressionMap.withDeleted) {
820
- const conditionDeleteColumn = `${aliasName}.${joinAttribute.metadata.deleteDateColumn.propertyName} IS NULL`;
821
- joinAttribute.condition = joinAttribute.condition
822
- ? ` ${joinAttribute.condition} AND ${conditionDeleteColumn}`
823
- : `${conditionDeleteColumn}`;
824
- }
825
- joinAttribute.alias = this.expressionMap.createAlias({
826
- type: "join",
827
- name: aliasName,
828
- metadata: joinAttribute.metadata,
829
- });
830
- if (joinAttribute.relation &&
831
- joinAttribute.relation.junctionEntityMetadata) {
832
- this.expressionMap.createAlias({
833
- type: "join",
834
- name: joinAttribute.junctionAlias,
835
- metadata: joinAttribute.relation.junctionEntityMetadata,
836
- });
837
- }
838
- }
839
- else {
840
- let subQuery = "";
841
- if (typeof entityOrProperty === "function") {
842
- const subQueryBuilder = entityOrProperty(this.subQuery());
843
- this.setParameters(subQueryBuilder.getParameters());
844
- subQuery = subQueryBuilder.getQuery();
845
- }
846
- else {
847
- subQuery = entityOrProperty;
848
- }
849
- const isSubQuery = typeof entityOrProperty === "function" ||
850
- (entityOrProperty.substr(0, 1) === "(" &&
851
- entityOrProperty.substr(-1) === ")");
852
- joinAttribute.alias = this.expressionMap.createAlias({
853
- type: "join",
854
- name: aliasName,
855
- tablePath: isSubQuery === false
856
- ? entityOrProperty
857
- : undefined,
858
- subQuery: isSubQuery === true ? subQuery : undefined,
859
- });
860
- }
861
- }
862
- /**
863
- * Creates "SELECT FROM" part of SQL query.
864
- */
865
- createSelectExpression() {
866
- if (!this.expressionMap.mainAlias)
867
- throw new TypeORMError("Cannot build query because main alias is not set (call qb#from method)");
868
- const allSelects = [];
869
- const excludedSelects = [];
870
- if (this.expressionMap.mainAlias.hasMetadata) {
871
- const metadata = this.expressionMap.mainAlias.metadata;
872
- allSelects.push(...this.buildEscapedEntityColumnSelects(this.expressionMap.mainAlias.name, metadata));
873
- excludedSelects.push(...this.findEntityColumnSelects(this.expressionMap.mainAlias.name, metadata));
874
- }
875
- this.expressionMap.joinAttributes.forEach((join) => {
876
- if (join.metadata) {
877
- allSelects.push(...this.buildEscapedEntityColumnSelects(join.alias.name, join.metadata));
878
- excludedSelects.push(...this.findEntityColumnSelects(join.alias.name, join.metadata));
879
- }
880
- else {
881
- const hasMainAlias = this.expressionMap.selects.some((select) => select.selection === join.alias.name);
882
- if (hasMainAlias) {
883
- allSelects.push({
884
- selection: this.escape(join.alias.name) + ".*",
885
- });
886
- const excludedSelect = this.expressionMap.selects.find((select) => select.selection === join.alias.name);
887
- excludedSelects.push(excludedSelect);
888
- }
889
- }
890
- });
891
- this.expressionMap.selects
892
- .filter((select) => excludedSelects.indexOf(select) === -1)
893
- .forEach((select) => allSelects.push({
894
- selection: this.replacePropertyNames(select.selection),
895
- aliasName: select.aliasName,
896
- }));
897
- if (allSelects.length === 0)
898
- allSelects.push({ selection: "*" });
899
- let useIndex = "";
900
- if (this.expressionMap.useIndex) {
901
- if (DriverUtils.isMySQLFamily(this.connection.driver)) {
902
- useIndex = ` USE INDEX (${this.expressionMap.useIndex})`;
903
- }
904
- }
905
- const froms = this.expressionMap.aliases
906
- .filter((alias) => alias.type === "from" &&
907
- (alias.tablePath || alias.subQuery))
908
- .map((alias) => {
909
- if (alias.subQuery)
910
- return alias.subQuery + " " + this.escape(alias.name);
911
- return (this.getTableName(alias.tablePath) +
912
- " " +
913
- this.escape(alias.name));
914
- });
915
- const select = this.createSelectDistinctExpression();
916
- const selection = allSelects
917
- .map((select) => select.selection +
918
- (select.aliasName
919
- ? " AS " + this.escape(select.aliasName)
920
- : ""))
921
- .join(", ");
922
- return (select +
923
- selection +
924
- " FROM " +
925
- froms.join(", ") +
926
- this.createTableLockExpression() +
927
- useIndex);
928
- }
929
- /**
930
- * Creates select | select distinct part of SQL query.
931
- */
932
- createSelectDistinctExpression() {
933
- const { selectDistinct, selectDistinctOn, maxExecutionTime } = this.expressionMap;
934
- const { driver } = this.connection;
935
- let select = "SELECT ";
936
- if (maxExecutionTime > 0) {
937
- if (DriverUtils.isMySQLFamily(driver)) {
938
- select += `/*+ MAX_EXECUTION_TIME(${this.expressionMap.maxExecutionTime}) */ `;
939
- }
940
- }
941
- if (DriverUtils.isPostgresFamily(driver) &&
942
- selectDistinctOn.length > 0) {
943
- const selectDistinctOnMap = selectDistinctOn
944
- .map((on) => this.replacePropertyNames(on))
945
- .join(", ");
946
- select = `SELECT DISTINCT ON (${selectDistinctOnMap}) `;
947
- }
948
- else if (selectDistinct) {
949
- select = "SELECT DISTINCT ";
950
- }
951
- return select;
952
- }
953
- /**
954
- * Creates "JOIN" part of SQL query.
955
- */
956
- createJoinExpression() {
957
- const joins = this.expressionMap.joinAttributes.map((joinAttr) => {
958
- const relation = joinAttr.relation;
959
- const destinationTableName = joinAttr.tablePath;
960
- const destinationTableAlias = joinAttr.alias.name;
961
- let appendedCondition = joinAttr.condition
962
- ? " AND (" + joinAttr.condition + ")"
963
- : "";
964
- const parentAlias = joinAttr.parentAlias;
965
- if (!parentAlias || !relation) {
966
- const destinationJoin = joinAttr.alias.subQuery
967
- ? joinAttr.alias.subQuery
968
- : this.getTableName(destinationTableName);
969
- return (" " +
970
- joinAttr.direction +
971
- " JOIN " +
972
- destinationJoin +
973
- " " +
974
- this.escape(destinationTableAlias) +
975
- this.createTableLockExpression() +
976
- (joinAttr.condition
977
- ? " ON " + this.replacePropertyNames(joinAttr.condition)
978
- : ""));
979
- }
980
- if (relation.isManyToOne || relation.isOneToOneOwner) {
981
- const condition = relation.joinColumns
982
- .map((joinColumn) => {
983
- return (destinationTableAlias +
984
- "." +
985
- joinColumn.referencedColumn.propertyPath +
986
- "=" +
987
- parentAlias +
988
- "." +
989
- relation.propertyPath +
990
- "." +
991
- joinColumn.referencedColumn.propertyPath);
992
- })
993
- .join(" AND ");
994
- return (" " +
995
- joinAttr.direction +
996
- " JOIN " +
997
- this.getTableName(destinationTableName) +
998
- " " +
999
- this.escape(destinationTableAlias) +
1000
- this.createTableLockExpression() +
1001
- " ON " +
1002
- this.replacePropertyNames(condition + appendedCondition));
1003
- }
1004
- else if (relation.isOneToMany || relation.isOneToOneNotOwner) {
1005
- const condition = relation
1006
- .inverseRelation.joinColumns.map((joinColumn) => {
1007
- if (relation.inverseEntityMetadata.tableType ===
1008
- "entity-child" &&
1009
- relation.inverseEntityMetadata.discriminatorColumn) {
1010
- appendedCondition +=
1011
- " AND " +
1012
- destinationTableAlias +
1013
- "." +
1014
- relation.inverseEntityMetadata
1015
- .discriminatorColumn.databaseName +
1016
- "='" +
1017
- relation.inverseEntityMetadata
1018
- .discriminatorValue +
1019
- "'";
1020
- }
1021
- return (destinationTableAlias +
1022
- "." +
1023
- relation.inverseRelation.propertyPath +
1024
- "." +
1025
- joinColumn.referencedColumn.propertyPath +
1026
- "=" +
1027
- parentAlias +
1028
- "." +
1029
- joinColumn.referencedColumn.propertyPath);
1030
- })
1031
- .join(" AND ");
1032
- return (" " +
1033
- joinAttr.direction +
1034
- " JOIN " +
1035
- this.getTableName(destinationTableName) +
1036
- " " +
1037
- this.escape(destinationTableAlias) +
1038
- this.createTableLockExpression() +
1039
- " ON " +
1040
- this.replacePropertyNames(condition + appendedCondition));
1041
- }
1042
- else {
1043
- const junctionTableName = relation.junctionEntityMetadata.tablePath;
1044
- const junctionAlias = joinAttr.junctionAlias;
1045
- let junctionCondition = "", destinationCondition = "";
1046
- if (relation.isOwning) {
1047
- junctionCondition = relation.joinColumns
1048
- .map((joinColumn) => {
1049
- return (junctionAlias +
1050
- "." +
1051
- joinColumn.propertyPath +
1052
- "=" +
1053
- parentAlias +
1054
- "." +
1055
- joinColumn.referencedColumn.propertyPath);
1056
- })
1057
- .join(" AND ");
1058
- destinationCondition = relation.inverseJoinColumns
1059
- .map((joinColumn) => {
1060
- return (destinationTableAlias +
1061
- "." +
1062
- joinColumn.referencedColumn.propertyPath +
1063
- "=" +
1064
- junctionAlias +
1065
- "." +
1066
- joinColumn.propertyPath);
1067
- })
1068
- .join(" AND ");
1069
- }
1070
- else {
1071
- junctionCondition = relation
1072
- .inverseRelation.inverseJoinColumns.map((joinColumn) => {
1073
- return (junctionAlias +
1074
- "." +
1075
- joinColumn.propertyPath +
1076
- "=" +
1077
- parentAlias +
1078
- "." +
1079
- joinColumn.referencedColumn.propertyPath);
1080
- })
1081
- .join(" AND ");
1082
- destinationCondition = relation
1083
- .inverseRelation.joinColumns.map((joinColumn) => {
1084
- return (destinationTableAlias +
1085
- "." +
1086
- joinColumn.referencedColumn.propertyPath +
1087
- "=" +
1088
- junctionAlias +
1089
- "." +
1090
- joinColumn.propertyPath);
1091
- })
1092
- .join(" AND ");
1093
- }
1094
- return (" " +
1095
- joinAttr.direction +
1096
- " JOIN " +
1097
- this.getTableName(junctionTableName) +
1098
- " " +
1099
- this.escape(junctionAlias) +
1100
- this.createTableLockExpression() +
1101
- " ON " +
1102
- this.replacePropertyNames(junctionCondition) +
1103
- " " +
1104
- joinAttr.direction +
1105
- " JOIN " +
1106
- this.getTableName(destinationTableName) +
1107
- " " +
1108
- this.escape(destinationTableAlias) +
1109
- this.createTableLockExpression() +
1110
- " ON " +
1111
- this.replacePropertyNames(destinationCondition + appendedCondition));
1112
- }
1113
- });
1114
- return joins.join(" ");
1115
- }
1116
- /**
1117
- * Creates "GROUP BY" part of SQL query.
1118
- */
1119
- createGroupByExpression() {
1120
- if (!this.expressionMap.groupBys || !this.expressionMap.groupBys.length)
1121
- return "";
1122
- return (" GROUP BY " +
1123
- this.replacePropertyNames(this.expressionMap.groupBys.join(", ")));
1124
- }
1125
- /**
1126
- * Creates "ORDER BY" part of SQL query.
1127
- */
1128
- createOrderByExpression() {
1129
- const orderBys = this.expressionMap.allOrderBys;
1130
- if (Object.keys(orderBys).length > 0)
1131
- return (" ORDER BY " +
1132
- Object.keys(orderBys)
1133
- .map((columnName) => {
1134
- if (typeof orderBys[columnName] === "string") {
1135
- return (this.replacePropertyNames(columnName) +
1136
- " " +
1137
- orderBys[columnName]);
1138
- }
1139
- else {
1140
- return (this.replacePropertyNames(columnName) +
1141
- " " +
1142
- orderBys[columnName].order +
1143
- " " +
1144
- orderBys[columnName].nulls);
1145
- }
1146
- })
1147
- .join(", "));
1148
- return "";
1149
- }
1150
- /**
1151
- * Creates "LIMIT" and "OFFSET" parts of SQL query.
1152
- */
1153
- createLimitOffsetExpression() {
1154
- let offset = this.expressionMap.offset, limit = this.expressionMap.limit;
1155
- if (!offset &&
1156
- !limit &&
1157
- this.expressionMap.joinAttributes.length === 0) {
1158
- offset = this.expressionMap.skip;
1159
- limit = this.expressionMap.take;
1160
- }
1161
- if (this.connection.driver.options.type === "mssql") {
1162
- let prefix = "";
1163
- if ((limit || offset) &&
1164
- Object.keys(this.expressionMap.allOrderBys).length <= 0) {
1165
- prefix = " ORDER BY (SELECT NULL)";
1166
- }
1167
- if (limit && offset)
1168
- return (prefix +
1169
- " OFFSET " +
1170
- offset +
1171
- " ROWS FETCH NEXT " +
1172
- limit +
1173
- " ROWS ONLY");
1174
- if (limit)
1175
- return (prefix + " OFFSET 0 ROWS FETCH NEXT " + limit + " ROWS ONLY");
1176
- if (offset)
1177
- return prefix + " OFFSET " + offset + " ROWS";
1178
- }
1179
- else if (DriverUtils.isMySQLFamily(this.connection.driver) ||
1180
- this.connection.driver.options.type === "aurora-mysql" ||
1181
- this.connection.driver.options.type === "sap" ||
1182
- this.connection.driver.options.type === "spanner") {
1183
- if (limit && offset)
1184
- return " LIMIT " + limit + " OFFSET " + offset;
1185
- if (limit)
1186
- return " LIMIT " + limit;
1187
- if (offset)
1188
- throw new OffsetWithoutLimitNotSupportedError();
1189
- }
1190
- else if (DriverUtils.isSQLiteFamily(this.connection.driver)) {
1191
- if (limit && offset)
1192
- return " LIMIT " + limit + " OFFSET " + offset;
1193
- if (limit)
1194
- return " LIMIT " + limit;
1195
- if (offset)
1196
- return " LIMIT -1 OFFSET " + offset;
1197
- }
1198
- else if (this.connection.driver.options.type === "oracle") {
1199
- if (limit && offset)
1200
- return (" OFFSET " +
1201
- offset +
1202
- " ROWS FETCH NEXT " +
1203
- limit +
1204
- " ROWS ONLY");
1205
- if (limit)
1206
- return " FETCH NEXT " + limit + " ROWS ONLY";
1207
- if (offset)
1208
- return " OFFSET " + offset + " ROWS";
1209
- }
1210
- else {
1211
- if (limit && offset)
1212
- return " LIMIT " + limit + " OFFSET " + offset;
1213
- if (limit)
1214
- return " LIMIT " + limit;
1215
- if (offset)
1216
- return " OFFSET " + offset;
1217
- }
1218
- return "";
1219
- }
1220
- /**
1221
- * Creates "LOCK" part of SELECT Query after table Clause
1222
- * ex.
1223
- * SELECT 1
1224
- * FROM USER U WITH (NOLOCK)
1225
- * JOIN ORDER O WITH (NOLOCK)
1226
- * ON U.ID=O.OrderID
1227
- */
1228
- createTableLockExpression() {
1229
- if (this.connection.driver.options.type === "mssql") {
1230
- switch (this.expressionMap.lockMode) {
1231
- case "pessimistic_read":
1232
- return " WITH (HOLDLOCK, ROWLOCK)";
1233
- case "pessimistic_write":
1234
- return " WITH (UPDLOCK, ROWLOCK)";
1235
- case "dirty_read":
1236
- return " WITH (NOLOCK)";
1237
- }
1238
- }
1239
- return "";
1240
- }
1241
- /**
1242
- * Creates "LOCK" part of SQL query.
1243
- */
1244
- createLockExpression() {
1245
- const driver = this.connection.driver;
1246
- let lockTablesClause = "";
1247
- if (this.expressionMap.lockTables) {
1248
- if (!(DriverUtils.isPostgresFamily(driver) ||
1249
- driver.options.type === "cockroachdb")) {
1250
- throw new TypeORMError("Lock tables not supported in selected driver");
1251
- }
1252
- if (this.expressionMap.lockTables.length < 1) {
1253
- throw new TypeORMError("lockTables cannot be an empty array");
1254
- }
1255
- lockTablesClause = " OF " + this.expressionMap.lockTables.join(", ");
1256
- }
1257
- let onLockExpression = "";
1258
- if (this.expressionMap.onLocked === "nowait") {
1259
- onLockExpression = " NOWAIT";
1260
- }
1261
- else if (this.expressionMap.onLocked === "skip_locked") {
1262
- onLockExpression = " SKIP LOCKED";
1263
- }
1264
- switch (this.expressionMap.lockMode) {
1265
- case "pessimistic_read":
1266
- if (driver.options.type === "mysql" ||
1267
- driver.options.type === "aurora-mysql") {
1268
- if (DriverUtils.isReleaseVersionOrGreater(driver, "8.0.0")) {
1269
- return (" FOR SHARE" + lockTablesClause + onLockExpression);
1270
- }
1271
- else {
1272
- return " LOCK IN SHARE MODE";
1273
- }
1274
- }
1275
- else if (driver.options.type === "mariadb") {
1276
- return " LOCK IN SHARE MODE";
1277
- }
1278
- else if (DriverUtils.isPostgresFamily(driver)) {
1279
- return " FOR SHARE" + lockTablesClause + onLockExpression;
1280
- }
1281
- else if (driver.options.type === "oracle") {
1282
- return " FOR UPDATE";
1283
- }
1284
- else if (driver.options.type === "mssql") {
1285
- return "";
1286
- }
1287
- else {
1288
- throw new LockNotSupportedOnGivenDriverError();
1289
- }
1290
- case "pessimistic_write":
1291
- if (DriverUtils.isMySQLFamily(driver) ||
1292
- driver.options.type === "aurora-mysql" ||
1293
- driver.options.type === "oracle") {
1294
- return " FOR UPDATE" + onLockExpression;
1295
- }
1296
- else if (DriverUtils.isPostgresFamily(driver) ||
1297
- driver.options.type === "cockroachdb") {
1298
- return " FOR UPDATE" + lockTablesClause + onLockExpression;
1299
- }
1300
- else if (driver.options.type === "mssql") {
1301
- return "";
1302
- }
1303
- else {
1304
- throw new LockNotSupportedOnGivenDriverError();
1305
- }
1306
- case "pessimistic_partial_write":
1307
- if (DriverUtils.isPostgresFamily(driver)) {
1308
- return " FOR UPDATE" + lockTablesClause + " SKIP LOCKED";
1309
- }
1310
- else if (DriverUtils.isMySQLFamily(driver)) {
1311
- return " FOR UPDATE SKIP LOCKED";
1312
- }
1313
- else {
1314
- throw new LockNotSupportedOnGivenDriverError();
1315
- }
1316
- case "pessimistic_write_or_fail":
1317
- if (DriverUtils.isPostgresFamily(driver) ||
1318
- driver.options.type === "cockroachdb") {
1319
- return " FOR UPDATE" + lockTablesClause + " NOWAIT";
1320
- }
1321
- else if (DriverUtils.isMySQLFamily(driver)) {
1322
- return " FOR UPDATE NOWAIT";
1323
- }
1324
- else {
1325
- throw new LockNotSupportedOnGivenDriverError();
1326
- }
1327
- case "for_no_key_update":
1328
- if (DriverUtils.isPostgresFamily(driver) ||
1329
- driver.options.type === "cockroachdb") {
1330
- return (" FOR NO KEY UPDATE" +
1331
- lockTablesClause +
1332
- onLockExpression);
1333
- }
1334
- else {
1335
- throw new LockNotSupportedOnGivenDriverError();
1336
- }
1337
- case "for_key_share":
1338
- if (DriverUtils.isPostgresFamily(driver)) {
1339
- return (" FOR KEY SHARE" + lockTablesClause + onLockExpression);
1340
- }
1341
- else {
1342
- throw new LockNotSupportedOnGivenDriverError();
1343
- }
1344
- default:
1345
- return "";
1346
- }
1347
- }
1348
- /**
1349
- * Creates "HAVING" part of SQL query.
1350
- */
1351
- createHavingExpression() {
1352
- if (!this.expressionMap.havings || !this.expressionMap.havings.length)
1353
- return "";
1354
- const conditions = this.expressionMap.havings
1355
- .map((having, index) => {
1356
- switch (having.type) {
1357
- case "and":
1358
- return ((index > 0 ? "AND " : "") +
1359
- this.replacePropertyNames(having.condition));
1360
- case "or":
1361
- return ((index > 0 ? "OR " : "") +
1362
- this.replacePropertyNames(having.condition));
1363
- default:
1364
- return this.replacePropertyNames(having.condition);
1365
- }
1366
- })
1367
- .join(" ");
1368
- if (!conditions.length)
1369
- return "";
1370
- return " HAVING " + conditions;
1371
- }
1372
- buildEscapedEntityColumnSelects(aliasName, metadata) {
1373
- const hasMainAlias = this.expressionMap.selects.some((select) => select.selection === aliasName);
1374
- const columns = [];
1375
- if (hasMainAlias) {
1376
- columns.push(...metadata.columns.filter((column) => column.isSelect === true));
1377
- }
1378
- columns.push(...metadata.columns.filter((column) => {
1379
- return this.expressionMap.selects.some((select) => select.selection ===
1380
- aliasName + "." + column.propertyPath);
1381
- }));
1382
- if (columns.length === 0)
1383
- return [];
1384
- const nonSelectedPrimaryColumns = this.expressionMap.queryEntity
1385
- ? metadata.primaryColumns.filter((primaryColumn) => columns.indexOf(primaryColumn) === -1)
1386
- : [];
1387
- const allColumns = [...columns, ...nonSelectedPrimaryColumns];
1388
- const finalSelects = [];
1389
- const escapedAliasName = this.escape(aliasName);
1390
- allColumns.forEach((column) => {
1391
- let selectionPath = escapedAliasName + "." + this.escape(column.databaseName);
1392
- if (column.isVirtualProperty && column.query) {
1393
- selectionPath = `(${column.query(escapedAliasName)})`;
1394
- }
1395
- if (this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
1396
- /* */
1397
- /* */
1398
- /* */
1399
- /* */
1400
- /* */
1401
- /* */
1402
- /* */
1403
- /* */
1404
- /* */
1405
- /* */
1406
- /* */
1407
- /* */
1408
- /* */
1409
- /* */
1410
- /* */
1411
- /* */
1412
- /* */
1413
- /* */
1414
- /* */
1415
- /* */
1416
- /* */
1417
- /* */
1418
- /* */
1419
- }
1420
- const selections = this.expressionMap.selects.filter((select) => select.selection === aliasName + "." + column.propertyPath);
1421
- if (selections.length) {
1422
- selections.forEach((selection) => {
1423
- finalSelects.push({
1424
- selection: selectionPath,
1425
- aliasName: selection.aliasName
1426
- ? selection.aliasName
1427
- : DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName),
1428
- virtual: selection.virtual,
1429
- });
1430
- });
1431
- }
1432
- else {
1433
- finalSelects.push({
1434
- selection: selectionPath,
1435
- aliasName: DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName),
1436
- virtual: hasMainAlias,
1437
- });
1438
- }
1439
- });
1440
- return finalSelects;
1441
- }
1442
- findEntityColumnSelects(aliasName, metadata) {
1443
- const mainSelect = this.expressionMap.selects.find((select) => select.selection === aliasName);
1444
- if (mainSelect)
1445
- return [mainSelect];
1446
- return this.expressionMap.selects.filter((select) => {
1447
- return metadata.columns.some((column) => select.selection === aliasName + "." + column.propertyPath);
1448
- });
1449
- }
1450
- computeCountExpression() {
1451
- const mainAlias = this.expressionMap.mainAlias.name; // todo: will this work with "fromTableName"?
1452
- const metadata = this.expressionMap.mainAlias.metadata;
1453
- const primaryColumns = metadata.primaryColumns;
1454
- const distinctAlias = this.escape(mainAlias);
1455
- if (this.expressionMap.joinAttributes.length === 0 &&
1456
- this.expressionMap.relationIdAttributes.length === 0 &&
1457
- this.expressionMap.relationCountAttributes.length === 0) {
1458
- return "COUNT(1)";
1459
- }
1460
- if (this.connection.driver.options.type === "cockroachdb" ||
1461
- DriverUtils.isPostgresFamily(this.connection.driver)) {
1462
- return ("COUNT(DISTINCT(" +
1463
- primaryColumns
1464
- .map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
1465
- .join(", ") +
1466
- "))");
1467
- }
1468
- if (DriverUtils.isMySQLFamily(this.connection.driver)) {
1469
- return ("COUNT(DISTINCT " +
1470
- primaryColumns
1471
- .map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
1472
- .join(", ") +
1473
- ")");
1474
- }
1475
- if (this.connection.driver.options.type === "mssql") {
1476
- const columnsExpression = primaryColumns
1477
- .map((primaryColumn) => `${distinctAlias}.${this.escape(primaryColumn.databaseName)}`)
1478
- .join(", '|;|', ");
1479
- if (primaryColumns.length === 1) {
1480
- return `COUNT(DISTINCT(${columnsExpression}))`;
1481
- }
1482
- return `COUNT(DISTINCT(CONCAT(${columnsExpression})))`;
1483
- }
1484
- if (this.connection.driver.options.type === "spanner") {
1485
- if (primaryColumns.length === 1) {
1486
- return `COUNT(DISTINCT(${distinctAlias}.${this.escape(primaryColumns[0].databaseName)}))`;
1487
- }
1488
- const columnsExpression = primaryColumns
1489
- .map((primaryColumn) => `CAST(${distinctAlias}.${this.escape(primaryColumn.databaseName)} AS STRING)`)
1490
- .join(", '|;|', ");
1491
- return `COUNT(DISTINCT(CONCAT(${columnsExpression})))`;
1492
- }
1493
- return (`COUNT(DISTINCT(` +
1494
- primaryColumns
1495
- .map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
1496
- .join(" || '|;|' || ") +
1497
- "))");
1498
- }
1499
- async executeCountQuery(queryRunner) {
1500
- const countSql = this.computeCountExpression();
1501
- const results = await this.clone()
1502
- .orderBy()
1503
- .groupBy()
1504
- .offset(undefined)
1505
- .limit(undefined)
1506
- .skip(undefined)
1507
- .take(undefined)
1508
- .select(countSql, "cnt")
1509
- .setOption("disable-global-order")
1510
- .loadRawResults(queryRunner);
1511
- if (!results || !results[0] || !results[0]["cnt"])
1512
- return 0;
1513
- return parseInt(results[0]["cnt"]);
1514
- }
1515
- applyFindOptions() {
1516
- if (this.expressionMap.mainAlias.metadata) {
1517
- if (this.findOptions.relationLoadStrategy) {
1518
- this.expressionMap.relationLoadStrategy =
1519
- this.findOptions.relationLoadStrategy;
1520
- }
1521
- if (this.findOptions.comment) {
1522
- this.comment(this.findOptions.comment);
1523
- }
1524
- if (this.findOptions.withDeleted) {
1525
- this.withDeleted();
1526
- }
1527
- if (this.findOptions.select) {
1528
- const select = Array.isArray(this.findOptions.select)
1529
- ? OrmUtils.propertyPathsToTruthyObject(this.findOptions.select)
1530
- : this.findOptions.select;
1531
- this.buildSelect(select, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
1532
- }
1533
- if (this.selects.length) {
1534
- this.select(this.selects);
1535
- }
1536
- this.selects = [];
1537
- if (this.findOptions.relations) {
1538
- const relations = Array.isArray(this.findOptions.relations)
1539
- ? OrmUtils.propertyPathsToTruthyObject(this.findOptions.relations)
1540
- : this.findOptions.relations;
1541
- this.buildRelations(relations, typeof this.findOptions.select === "object"
1542
- ? this.findOptions.select
1543
- : undefined, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
1544
- if (this.findOptions.loadEagerRelations !== false &&
1545
- this.expressionMap.relationLoadStrategy === "join") {
1546
- this.buildEagerRelations(relations, typeof this.findOptions.select === "object"
1547
- ? this.findOptions
1548
- .select
1549
- : undefined, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
1550
- }
1551
- }
1552
- if (this.selects.length) {
1553
- this.addSelect(this.selects);
1554
- }
1555
- if (this.findOptions.where) {
1556
- this.conditions = this.buildWhere(this.findOptions.where, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
1557
- if (this.conditions.length)
1558
- this.andWhere(this.conditions.substr(0, 1) !== "("
1559
- ? "(" + this.conditions + ")"
1560
- : this.conditions); // temporary and where and braces
1561
- }
1562
- if (this.findOptions.order) {
1563
- this.buildOrder(this.findOptions.order, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
1564
- }
1565
- if (this.joins.length) {
1566
- this.joins.forEach((join) => {
1567
- if (join.select && !join.selection) {
1568
- //
1569
- if (join.type === "inner") {
1570
- this.innerJoinAndSelect(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
1571
- }
1572
- else {
1573
- this.leftJoinAndSelect(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
1574
- }
1575
- }
1576
- else {
1577
- if (join.type === "inner") {
1578
- this.innerJoin(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
1579
- }
1580
- else {
1581
- this.leftJoin(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
1582
- }
1583
- }
1584
- });
1585
- }
1586
- if (this.findOptions.skip !== undefined) {
1587
- this.skip(this.findOptions.skip);
1588
- }
1589
- if (this.findOptions.take !== undefined) {
1590
- this.take(this.findOptions.take);
1591
- }
1592
- if (typeof this.findOptions.cache === "number") {
1593
- this.cache(this.findOptions.cache);
1594
- }
1595
- else if (typeof this.findOptions.cache === "boolean") {
1596
- this.cache(this.findOptions.cache);
1597
- }
1598
- else if (typeof this.findOptions.cache === "object") {
1599
- this.cache(this.findOptions.cache.id, this.findOptions.cache.milliseconds);
1600
- }
1601
- if (this.findOptions.join) {
1602
- if (this.findOptions.join.leftJoin)
1603
- Object.keys(this.findOptions.join.leftJoin).forEach((key) => {
1604
- this.leftJoin(this.findOptions.join.leftJoin[key], key);
1605
- });
1606
- if (this.findOptions.join.innerJoin)
1607
- Object.keys(this.findOptions.join.innerJoin).forEach((key) => {
1608
- this.innerJoin(this.findOptions.join.innerJoin[key], key);
1609
- });
1610
- if (this.findOptions.join.leftJoinAndSelect)
1611
- Object.keys(this.findOptions.join.leftJoinAndSelect).forEach((key) => {
1612
- this.leftJoinAndSelect(this.findOptions.join.leftJoinAndSelect[key], key);
1613
- });
1614
- if (this.findOptions.join.innerJoinAndSelect)
1615
- Object.keys(this.findOptions.join.innerJoinAndSelect).forEach((key) => {
1616
- this.innerJoinAndSelect(this.findOptions.join.innerJoinAndSelect[key], key);
1617
- });
1618
- }
1619
- if (this.findOptions.lock) {
1620
- if (this.findOptions.lock.mode === "optimistic") {
1621
- this.setLock(this.findOptions.lock.mode, this.findOptions.lock.version);
1622
- }
1623
- else if (this.findOptions.lock.mode === "pessimistic_read" ||
1624
- this.findOptions.lock.mode === "pessimistic_write" ||
1625
- this.findOptions.lock.mode === "dirty_read" ||
1626
- this.findOptions.lock.mode ===
1627
- "pessimistic_partial_write" ||
1628
- this.findOptions.lock.mode ===
1629
- "pessimistic_write_or_fail" ||
1630
- this.findOptions.lock.mode === "for_no_key_update" ||
1631
- this.findOptions.lock.mode === "for_key_share") {
1632
- const tableNames = this.findOptions.lock.tables
1633
- ? this.findOptions.lock.tables.map((table) => {
1634
- const tableAlias = this.expressionMap.aliases.find((alias) => {
1635
- return (alias.metadata
1636
- .tableNameWithoutPrefix === table);
1637
- });
1638
- if (!tableAlias) {
1639
- throw new TypeORMError(`"${table}" is not part of this query`);
1640
- }
1641
- return this.escape(tableAlias.name);
1642
- })
1643
- : undefined;
1644
- this.setLock(this.findOptions.lock.mode, undefined, tableNames);
1645
- if (this.findOptions.lock.onLocked) {
1646
- this.setOnLocked(this.findOptions.lock.onLocked);
1647
- }
1648
- }
1649
- }
1650
- if (this.findOptions.loadRelationIds === true) {
1651
- this.loadAllRelationIds();
1652
- }
1653
- else if (typeof this.findOptions.loadRelationIds === "object") {
1654
- this.loadAllRelationIds(this.findOptions.loadRelationIds);
1655
- }
1656
- if (this.findOptions.loadEagerRelations !== false) {
1657
- FindOptionsUtils.joinEagerRelations(this, this.expressionMap.mainAlias.name, this.expressionMap.mainAlias.metadata);
1658
- }
1659
- if (this.findOptions.transaction === true) {
1660
- this.expressionMap.useTransaction = true;
1661
- }
1662
- }
1663
- }
1664
- /**
1665
- * Executes sql generated by query builder and returns object with raw results and entities created from them.
1666
- */
1667
- async executeEntitiesAndRawResults(queryRunner) {
1668
- if (!this.expressionMap.mainAlias)
1669
- throw new TypeORMError(`Alias is not set. Use "from" method to set an alias.`);
1670
- if ((this.expressionMap.lockMode === "pessimistic_read" ||
1671
- this.expressionMap.lockMode === "pessimistic_write" ||
1672
- this.expressionMap.lockMode === "pessimistic_partial_write" ||
1673
- this.expressionMap.lockMode === "pessimistic_write_or_fail" ||
1674
- this.expressionMap.lockMode === "for_no_key_update" ||
1675
- this.expressionMap.lockMode === "for_key_share") &&
1676
- !queryRunner.isTransactionActive)
1677
- throw new PessimisticLockTransactionRequiredError();
1678
- if (this.expressionMap.lockMode === "optimistic") {
1679
- const metadata = this.expressionMap.mainAlias.metadata;
1680
- if (!metadata.versionColumn && !metadata.updateDateColumn)
1681
- throw new NoVersionOrUpdateDateColumnError(metadata.name);
1682
- }
1683
- const relationIdLoader = new RelationIdLoader(this.connection, queryRunner, this.expressionMap.relationIdAttributes);
1684
- const relationCountLoader = new RelationCountLoader(this.connection, queryRunner, this.expressionMap.relationCountAttributes);
1685
- const relationIdMetadataTransformer = new RelationIdMetadataToAttributeTransformer(this.expressionMap);
1686
- relationIdMetadataTransformer.transform();
1687
- const relationCountMetadataTransformer = new RelationCountMetadataToAttributeTransformer(this.expressionMap);
1688
- relationCountMetadataTransformer.transform();
1689
- let rawResults = [], entities = [];
1690
- if ((this.expressionMap.skip || this.expressionMap.take) &&
1691
- this.expressionMap.joinAttributes.length > 0) {
1692
- const [selects, orderBys] = this.createOrderByCombinedWithSelectExpression("distinctAlias");
1693
- const metadata = this.expressionMap.mainAlias.metadata;
1694
- const mainAliasName = this.expressionMap.mainAlias.name;
1695
- const querySelects = metadata.primaryColumns.map((primaryColumn) => {
1696
- const distinctAlias = this.escape("distinctAlias");
1697
- const columnAlias = this.escape(DriverUtils.buildAlias(this.connection.driver, mainAliasName, primaryColumn.databaseName));
1698
- if (!orderBys[columnAlias])
1699
- orderBys[columnAlias] = "ASC";
1700
- const alias = DriverUtils.buildAlias(this.connection.driver, "ids_" + mainAliasName, primaryColumn.databaseName);
1701
- return `${distinctAlias}.${columnAlias} AS ${this.escape(alias)}`;
1702
- });
1703
- rawResults = await new SelectQueryBuilder_1(this.connection, queryRunner)
1704
- .select(`DISTINCT ${querySelects.join(", ")}`)
1705
- .addSelect(selects)
1706
- .from(`(${this.clone().orderBy().getQuery()})`, "distinctAlias")
1707
- .offset(this.expressionMap.skip)
1708
- .limit(this.expressionMap.take)
1709
- .orderBy(orderBys)
1710
- .cache(this.expressionMap.cache
1711
- ? this.expressionMap.cache
1712
- : this.expressionMap.cacheId, this.expressionMap.cacheDuration)
1713
- .setParameters(this.getParameters())
1714
- .setNativeParameters(this.expressionMap.nativeParameters)
1715
- .getRawMany();
1716
- if (rawResults.length > 0) {
1717
- let condition = "";
1718
- const parameters = {};
1719
- if (metadata.hasMultiplePrimaryKeys) {
1720
- condition = rawResults
1721
- .map((result, index) => {
1722
- return metadata.primaryColumns
1723
- .map((primaryColumn) => {
1724
- const paramKey = `orm_distinct_ids_${index}_${primaryColumn.databaseName}`;
1725
- parameters[paramKey] =
1726
- result[`ids_${mainAliasName}_${primaryColumn.databaseName}`];
1727
- return `${mainAliasName}.${primaryColumn.propertyPath}=:${paramKey}`;
1728
- })
1729
- .join(" AND ");
1730
- })
1731
- .join(" OR ");
1732
- }
1733
- else {
1734
- const alias = DriverUtils.buildAlias(this.connection.driver, "ids_" + mainAliasName, metadata.primaryColumns[0].databaseName);
1735
- const ids = rawResults.map((result) => result[alias]);
1736
- const areAllNumbers = ids.every((id) => typeof id === "number");
1737
- if (areAllNumbers) {
1738
- condition = `${mainAliasName}.${metadata.primaryColumns[0].propertyPath} IN (${ids.join(", ")})`;
1739
- }
1740
- else {
1741
- parameters["orm_distinct_ids"] = ids;
1742
- condition =
1743
- mainAliasName +
1744
- "." +
1745
- metadata.primaryColumns[0].propertyPath +
1746
- " IN (:...orm_distinct_ids)";
1747
- }
1748
- }
1749
- rawResults = await this.clone()
1750
- .mergeExpressionMap({
1751
- extraAppendedAndWhereCondition: condition,
1752
- })
1753
- .setParameters(parameters)
1754
- .loadRawResults(queryRunner);
1755
- }
1756
- }
1757
- else {
1758
- rawResults = await this.loadRawResults(queryRunner);
1759
- }
1760
- if (rawResults.length > 0) {
1761
- const rawRelationIdResults = await relationIdLoader.load(rawResults);
1762
- const rawRelationCountResults = await relationCountLoader.load(rawResults);
1763
- const transformer = new RawSqlResultsToEntityTransformer(this.expressionMap, this.connection.driver, rawRelationIdResults, rawRelationCountResults, this.queryRunner);
1764
- entities = transformer.transform(rawResults, this.expressionMap.mainAlias);
1765
- if (this.expressionMap.callListeners === true &&
1766
- this.expressionMap.mainAlias.hasMetadata) {
1767
- await queryRunner.broadcaster.broadcast("Load", this.expressionMap.mainAlias.metadata, entities);
1768
- }
1769
- }
1770
- if (this.expressionMap.relationLoadStrategy === "query") {
1771
- await Promise.all(this.relationMetadatas.map(async (relation) => {
1772
- const relationTarget = relation.inverseEntityMetadata.target;
1773
- const relationAlias = relation.inverseEntityMetadata.targetName;
1774
- const select = Array.isArray(this.findOptions.select)
1775
- ? OrmUtils.propertyPathsToTruthyObject(this.findOptions.select)
1776
- : this.findOptions.select;
1777
- const relations = Array.isArray(this.findOptions.relations)
1778
- ? OrmUtils.propertyPathsToTruthyObject(this.findOptions.relations)
1779
- : this.findOptions.relations;
1780
- const queryBuilder = this.createQueryBuilder()
1781
- .select(relationAlias)
1782
- .from(relationTarget, relationAlias)
1783
- .setFindOptions({
1784
- select: select
1785
- ? OrmUtils.deepValue(select, relation.propertyPath)
1786
- : undefined,
1787
- order: this.findOptions.order
1788
- ? OrmUtils.deepValue(this.findOptions.order, relation.propertyPath)
1789
- : undefined,
1790
- relations: relations
1791
- ? OrmUtils.deepValue(relations, relation.propertyPath)
1792
- : undefined,
1793
- withDeleted: this.findOptions.withDeleted,
1794
- relationLoadStrategy: this.findOptions.relationLoadStrategy,
1795
- });
1796
- if (entities.length > 0) {
1797
- const relatedEntityGroups = await this.connection.relationIdLoader.loadManyToManyRelationIdsAndGroup(relation, entities, undefined, queryBuilder);
1798
- entities.forEach((entity) => {
1799
- const relatedEntityGroup = relatedEntityGroups.find((group) => group.entity === entity);
1800
- if (relatedEntityGroup) {
1801
- const value = relatedEntityGroup.related === undefined
1802
- ? null
1803
- : relatedEntityGroup.related;
1804
- relation.setEntityValue(entity, value);
1805
- }
1806
- });
1807
- }
1808
- }));
1809
- }
1810
- return {
1811
- raw: rawResults,
1812
- entities: entities,
1813
- };
1814
- }
1815
- createOrderByCombinedWithSelectExpression(parentAlias) {
1816
- const orderBys = this.expressionMap.allOrderBys;
1817
- const selectString = Object.keys(orderBys)
1818
- .map((orderCriteria) => {
1819
- if (orderCriteria.indexOf(".") !== -1) {
1820
- const criteriaParts = orderCriteria.split(".");
1821
- const aliasName = criteriaParts[0];
1822
- const propertyPath = criteriaParts.slice(1).join(".");
1823
- const alias = this.expressionMap.findAliasByName(aliasName);
1824
- const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
1825
- return (this.escape(parentAlias) +
1826
- "." +
1827
- this.escape(DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName)));
1828
- }
1829
- else {
1830
- if (this.expressionMap.selects.find((select) => select.selection === orderCriteria ||
1831
- select.aliasName === orderCriteria))
1832
- return this.escape(parentAlias) + "." + orderCriteria;
1833
- return "";
1834
- }
1835
- })
1836
- .join(", ");
1837
- const orderByObject = {};
1838
- Object.keys(orderBys).forEach((orderCriteria) => {
1839
- if (orderCriteria.indexOf(".") !== -1) {
1840
- const criteriaParts = orderCriteria.split(".");
1841
- const aliasName = criteriaParts[0];
1842
- const propertyPath = criteriaParts.slice(1).join(".");
1843
- const alias = this.expressionMap.findAliasByName(aliasName);
1844
- const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
1845
- orderByObject[this.escape(parentAlias) +
1846
- "." +
1847
- this.escape(DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName))] = orderBys[orderCriteria];
1848
- }
1849
- else {
1850
- if (this.expressionMap.selects.find((select) => select.selection === orderCriteria ||
1851
- select.aliasName === orderCriteria)) {
1852
- orderByObject[this.escape(parentAlias) + "." + orderCriteria] = orderBys[orderCriteria];
1853
- }
1854
- else {
1855
- orderByObject[orderCriteria] = orderBys[orderCriteria];
1856
- }
1857
- }
1858
- });
1859
- return [selectString, orderByObject];
1860
- }
1861
- /**
1862
- * Loads raw results from the database.
1863
- */
1864
- async loadRawResults(queryRunner) {
1865
- const [sql, parameters] = this.getQueryAndParameters();
1866
- const queryId = sql + " -- PARAMETERS: " + JSON.stringify(parameters);
1867
- const cacheOptions = typeof this.connection.options.cache === "object"
1868
- ? this.connection.options.cache
1869
- : {};
1870
- let savedQueryResultCacheOptions = undefined;
1871
- let cacheError = false;
1872
- if (this.connection.queryResultCache &&
1873
- (this.expressionMap.cache || cacheOptions.alwaysEnabled)) {
1874
- try {
1875
- savedQueryResultCacheOptions =
1876
- await this.connection.queryResultCache.getFromCache({
1877
- identifier: this.expressionMap.cacheId,
1878
- query: queryId,
1879
- duration: this.expressionMap.cacheDuration ||
1880
- cacheOptions.duration ||
1881
- 1000,
1882
- }, queryRunner);
1883
- if (savedQueryResultCacheOptions &&
1884
- !this.connection.queryResultCache.isExpired(savedQueryResultCacheOptions)) {
1885
- return JSON.parse(savedQueryResultCacheOptions.result);
1886
- }
1887
- }
1888
- catch (error) {
1889
- if (!cacheOptions.ignoreErrors) {
1890
- throw error;
1891
- }
1892
- cacheError = true;
1893
- }
1894
- }
1895
- const results = await queryRunner.query(sql, parameters, true);
1896
- if (!cacheError &&
1897
- this.connection.queryResultCache &&
1898
- (this.expressionMap.cache || cacheOptions.alwaysEnabled)) {
1899
- try {
1900
- await this.connection.queryResultCache.storeInCache({
1901
- identifier: this.expressionMap.cacheId,
1902
- query: queryId,
1903
- time: new Date().getTime(),
1904
- duration: this.expressionMap.cacheDuration ||
1905
- cacheOptions.duration ||
1906
- 1000,
1907
- result: JSON.stringify(results.records),
1908
- }, savedQueryResultCacheOptions, queryRunner);
1909
- }
1910
- catch (error) {
1911
- if (!cacheOptions.ignoreErrors) {
1912
- throw error;
1913
- }
1914
- }
1915
- }
1916
- return results.records;
1917
- }
1918
- /**
1919
- * Merges into expression map given expression map properties.
1920
- */
1921
- mergeExpressionMap(expressionMap) {
1922
- ObjectUtils.assign(this.expressionMap, expressionMap);
1923
- return this;
1924
- }
1925
- /**
1926
- * Normalizes a give number - converts to int if possible.
1927
- */
1928
- normalizeNumber(num) {
1929
- if (typeof num === "number" || num === undefined || num === null)
1930
- return num;
1931
- return Number(num);
1932
- }
1933
- /**
1934
- * Creates a query builder used to execute sql queries inside this query builder.
1935
- */
1936
- obtainQueryRunner() {
1937
- return this.queryRunner || this.connection.createQueryRunner("slave");
1938
- }
1939
- buildSelect(select, metadata, alias, embedPrefix) {
1940
- for (let key in select) {
1941
- if (select[key] === undefined || select[key] === false)
1942
- continue;
1943
- const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
1944
- const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
1945
- const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
1946
- const relation = metadata.findRelationWithPropertyPath(propertyPath);
1947
- if (!embed && !column && !relation)
1948
- throw new EntityPropertyNotFoundError(propertyPath, metadata);
1949
- if (column) {
1950
- this.selects.push(alias + "." + propertyPath);
1951
- }
1952
- else if (embed) {
1953
- this.buildSelect(// @ts-ignore
1954
- select[key], metadata, alias, propertyPath);
1955
- }
1956
- }
1957
- }
1958
- buildRelations(relations, selection, metadata, alias, embedPrefix) {
1959
- if (!relations)
1960
- return;
1961
- Object.keys(relations).forEach((relationName) => {
1962
- const relationValue = relations[relationName];
1963
- const propertyPath = embedPrefix
1964
- ? embedPrefix + "." + relationName
1965
- : relationName;
1966
- const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
1967
- const relation = metadata.findRelationWithPropertyPath(propertyPath);
1968
- if (!embed && !relation)
1969
- throw new EntityPropertyNotFoundError(propertyPath, metadata);
1970
- if (embed) {
1971
- this.buildRelations(relationValue, typeof selection === "object"
1972
- ? OrmUtils.deepValue(selection, embed.propertyPath)
1973
- : undefined, metadata, alias, propertyPath);
1974
- }
1975
- else if (relation) {
1976
- let joinAlias = alias + "_" + propertyPath.replace(".", "_");
1977
- joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
1978
- if (relationValue === true ||
1979
- typeof relationValue === "object") {
1980
- if (this.expressionMap.relationLoadStrategy === "query") {
1981
- this.relationMetadatas.push(relation);
1982
- }
1983
- else {
1984
- this.joins.push({
1985
- type: "left",
1986
- select: true,
1987
- selection: selection &&
1988
- typeof selection[relationName] === "object" // @ts-ignore
1989
- ? selection[relationName]
1990
- : undefined,
1991
- alias: joinAlias,
1992
- parentAlias: alias,
1993
- relationMetadata: relation,
1994
- });
1995
- if (selection &&
1996
- typeof selection[relationName] === "object") {
1997
- this.buildSelect(// @ts-ignore
1998
- selection[relationName], relation.inverseEntityMetadata, joinAlias);
1999
- }
2000
- }
2001
- }
2002
- if (typeof relationValue === "object" &&
2003
- this.expressionMap.relationLoadStrategy === "join") {
2004
- this.buildRelations(relationValue, typeof selection === "object"
2005
- ? OrmUtils.deepValue(selection, relation.propertyPath)
2006
- : undefined, relation.inverseEntityMetadata, joinAlias, undefined);
2007
- }
2008
- }
2009
- });
2010
- }
2011
- buildEagerRelations(relations, selection, metadata, alias, embedPrefix) {
2012
- if (!relations)
2013
- return;
2014
- Object.keys(relations).forEach((relationName) => {
2015
- const relationValue = relations[relationName];
2016
- const propertyPath = embedPrefix
2017
- ? embedPrefix + "." + relationName
2018
- : relationName;
2019
- const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
2020
- const relation = metadata.findRelationWithPropertyPath(propertyPath);
2021
- if (!embed && !relation)
2022
- throw new EntityPropertyNotFoundError(propertyPath, metadata);
2023
- if (embed) {
2024
- this.buildEagerRelations(relationValue, typeof selection === "object"
2025
- ? OrmUtils.deepValue(selection, embed.propertyPath)
2026
- : undefined, metadata, alias, propertyPath);
2027
- }
2028
- else if (relation) {
2029
- let joinAlias = alias + "_" + propertyPath.replace(".", "_");
2030
- joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
2031
- if (relationValue === true ||
2032
- typeof relationValue === "object") {
2033
- relation.inverseEntityMetadata.eagerRelations.forEach((eagerRelation) => {
2034
- let eagerRelationJoinAlias = joinAlias +
2035
- "_" +
2036
- eagerRelation.propertyPath.replace(".", "_");
2037
- eagerRelationJoinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, joinAlias, eagerRelationJoinAlias);
2038
- const existJoin = this.joins.find((join) => join.alias === eagerRelationJoinAlias);
2039
- if (!existJoin) {
2040
- this.joins.push({
2041
- type: "left",
2042
- select: true,
2043
- alias: eagerRelationJoinAlias,
2044
- parentAlias: joinAlias,
2045
- selection: undefined,
2046
- relationMetadata: eagerRelation,
2047
- });
2048
- }
2049
- if (selection &&
2050
- typeof selection[relationName] === "object") {
2051
- this.buildSelect(// @ts-ignore
2052
- selection[relationName], relation.inverseEntityMetadata, joinAlias);
2053
- }
2054
- });
2055
- }
2056
- if (typeof relationValue === "object") {
2057
- this.buildEagerRelations(relationValue, typeof selection === "object"
2058
- ? OrmUtils.deepValue(selection, relation.propertyPath)
2059
- : undefined, relation.inverseEntityMetadata, joinAlias, undefined);
2060
- }
2061
- }
2062
- });
2063
- }
2064
- buildOrder(order, metadata, alias, embedPrefix) {
2065
- for (let key in order) {
2066
- if (order[key] === undefined)
2067
- continue;
2068
- const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
2069
- const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
2070
- const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
2071
- const relation = metadata.findRelationWithPropertyPath(propertyPath);
2072
- if (!embed && !column && !relation)
2073
- throw new EntityPropertyNotFoundError(propertyPath, metadata);
2074
- if (column) {
2075
- let direction = typeof order[key] === "object"
2076
- ? order[key].direction
2077
- : order[key];
2078
- direction =
2079
- direction === "DESC" ||
2080
- direction === "desc" ||
2081
- direction === -1
2082
- ? "DESC"
2083
- : "ASC";
2084
- let nulls = typeof order[key] === "object"
2085
- ? order[key].nulls
2086
- : undefined;
2087
- nulls =
2088
- nulls?.toLowerCase() === "first"
2089
- ? "NULLS FIRST"
2090
- : nulls?.toLowerCase() === "last"
2091
- ? "NULLS LAST"
2092
- : undefined;
2093
- let aliasPath = `${alias}.${propertyPath}`;
2094
- if (column.isVirtualProperty && column.query) {
2095
- const selection = this.expressionMap.selects.find((s) => s.selection === aliasPath);
2096
- if (selection) {
2097
- aliasPath = DriverUtils.buildAlias(this.connection.driver, alias, column.databaseName);
2098
- selection.aliasName = aliasPath;
2099
- }
2100
- else {
2101
- aliasPath = `(${column.query(alias)})`;
2102
- }
2103
- }
2104
- this.addOrderBy(aliasPath, direction, nulls);
2105
- }
2106
- else if (embed) {
2107
- this.buildOrder(order[key], metadata, alias, propertyPath);
2108
- }
2109
- else if (relation) {
2110
- let joinAlias = alias + "_" + propertyPath.replace(".", "_");
2111
- joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
2112
- const existJoin = this.joins.find((join) => join.alias === joinAlias);
2113
- if (!existJoin) {
2114
- this.joins.push({
2115
- type: "left",
2116
- select: false,
2117
- alias: joinAlias,
2118
- parentAlias: alias,
2119
- selection: undefined,
2120
- relationMetadata: relation,
2121
- });
2122
- }
2123
- this.buildOrder(order[key], relation.inverseEntityMetadata, joinAlias);
2124
- }
2125
- }
2126
- }
2127
- buildWhere(where, metadata, alias, embedPrefix) {
2128
- let condition = "";
2129
- if (Array.isArray(where)) {
2130
- condition =
2131
- "(" +
2132
- where
2133
- .map((whereItem) => {
2134
- return this.buildWhere(whereItem, metadata, alias, embedPrefix);
2135
- })
2136
- .filter((condition) => !!condition)
2137
- .map((condition) => "(" + condition + ")")
2138
- .join(" OR ") +
2139
- ")";
2140
- }
2141
- else {
2142
- let andConditions = [];
2143
- for (let key in where) {
2144
- if (where[key] === undefined || where[key] === null)
2145
- continue;
2146
- const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
2147
- const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
2148
- const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
2149
- const relation = metadata.findRelationWithPropertyPath(propertyPath);
2150
- if (!embed && !column && !relation)
2151
- throw new EntityPropertyNotFoundError(propertyPath, metadata);
2152
- if (column) {
2153
- let aliasPath = `${alias}.${propertyPath}`;
2154
- if (column.isVirtualProperty && column.query) {
2155
- aliasPath = `(${column.query(alias)})`;
2156
- }
2157
- let parameterValue = where[key];
2158
- if (InstanceChecker.isEqualOperator(where[key])) {
2159
- parameterValue = where[key].value;
2160
- }
2161
- if (column.transformer) {
2162
- parameterValue = ApplyValueTransformers.transformTo(column.transformer, parameterValue);
2163
- }
2164
- //
2165
- //
2166
- andConditions.push(this.createWhereConditionExpression(this.getWherePredicateCondition(aliasPath, parameterValue)));
2167
- }
2168
- else if (embed) {
2169
- const condition = this.buildWhere(where[key], metadata, alias, propertyPath);
2170
- if (condition)
2171
- andConditions.push(condition);
2172
- }
2173
- else if (relation) {
2174
- if (typeof where[key] === "object") {
2175
- const allAllUndefined = Object.keys(where[key]).every((k) => where[key][k] === undefined);
2176
- if (allAllUndefined) {
2177
- continue;
2178
- }
2179
- }
2180
- if (InstanceChecker.isFindOperator(where[key])) {
2181
- if (where[key].type === "moreThan" ||
2182
- where[key].type === "lessThan") {
2183
- const sqlOperator = where[key].type === "moreThan" ? ">" : "<";
2184
- const qb = this.subQuery();
2185
- if (relation.isManyToManyOwner) {
2186
- qb.select("COUNT(*)")
2187
- .from(relation.joinTableName, relation.joinTableName)
2188
- .where(relation.joinColumns
2189
- .map((column) => {
2190
- return `${relation.joinTableName}.${column.propertyName} = ${alias}.${column.referencedColumn
2191
- .propertyName}`;
2192
- })
2193
- .join(" AND "));
2194
- }
2195
- else if (relation.isManyToManyNotOwner) {
2196
- qb.select("COUNT(*)")
2197
- .from(relation.inverseRelation.joinTableName, relation.inverseRelation.joinTableName)
2198
- .where(relation
2199
- .inverseRelation.inverseJoinColumns.map((column) => {
2200
- return `${relation.inverseRelation
2201
- .joinTableName}.${column.propertyName} = ${alias}.${column.referencedColumn
2202
- .propertyName}`;
2203
- })
2204
- .join(" AND "));
2205
- }
2206
- else if (relation.isOneToMany) {
2207
- qb.select("COUNT(*)")
2208
- .from(relation.inverseEntityMetadata.target, relation.inverseEntityMetadata
2209
- .tableName)
2210
- .where(relation
2211
- .inverseRelation.joinColumns.map((column) => {
2212
- return `${relation
2213
- .inverseEntityMetadata
2214
- .tableName}.${column.propertyName} = ${alias}.${column.referencedColumn
2215
- .propertyName}`;
2216
- })
2217
- .join(" AND "));
2218
- }
2219
- else {
2220
- throw new Error(`This relation isn't supported by given find operator`);
2221
- }
2222
- this.andWhere(qb.getSql() +
2223
- " " +
2224
- sqlOperator +
2225
- " " +
2226
- parseInt(where[key].value));
2227
- }
2228
- else {
2229
- if (relation.isManyToOne ||
2230
- (relation.isOneToOne &&
2231
- relation.isOneToOneOwner)) {
2232
- const aliasPath = `${alias}.${propertyPath}`;
2233
- andConditions.push(this.createWhereConditionExpression(this.getWherePredicateCondition(aliasPath, where[key])));
2234
- }
2235
- else {
2236
- throw new Error(`This relation isn't supported by given find operator`);
2237
- }
2238
- }
2239
- }
2240
- else {
2241
- let joinAlias = alias +
2242
- "_" +
2243
- relation.propertyPath.replace(".", "_");
2244
- joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
2245
- const existJoin = this.joins.find((join) => join.alias === joinAlias);
2246
- if (!existJoin) {
2247
- this.joins.push({
2248
- type: "inner",
2249
- select: false,
2250
- selection: undefined,
2251
- alias: joinAlias,
2252
- parentAlias: alias,
2253
- relationMetadata: relation,
2254
- });
2255
- }
2256
- else {
2257
- if (existJoin.type === "left")
2258
- existJoin.type = "inner";
2259
- }
2260
- const condition = this.buildWhere(where[key], relation.inverseEntityMetadata, joinAlias);
2261
- if (condition) {
2262
- andConditions.push(condition);
2263
- }
2264
- }
2265
- }
2266
- }
2267
- condition = andConditions.join(" AND ");
2268
- }
2269
- return condition;
2270
- }
2271
- };
2272
- SelectQueryBuilder = SelectQueryBuilder_1 = __decorate([
2273
- CLASS.NAME('SelectQueryBuilder')
2274
- ], SelectQueryBuilder);
2275
- export { SelectQueryBuilder };
2276
- ;
2277
- ({}); // @--end-of-file-for-module=taon-typeorm lib/typeorm/query-builder/SelectQueryBuilder.ts
2278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0UXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3Qtd2Vic3FsL3Rhb24tdHlwZW9ybS9wcm9qZWN0cy90YW9uLXR5cGVvcm0vc3JjL2xpYi90eXBlb3JtL3F1ZXJ5LWJ1aWxkZXIvU2VsZWN0UXVlcnlCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sZ0RBQWdELENBQUE7QUFFakcsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0sa0RBQWtELENBQUE7QUFDMUcsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sMkNBQTJDLENBQUE7QUFDNUYsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sNkNBQTZDLENBQUE7QUFDaEcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sMENBQTBDLENBQUE7QUFDMUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ2pFLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHdEQUF3RCxDQUFBO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQzFFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxNQUFNLDhEQUE4RCxDQUFBO0FBQzFILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM3QyxLQUFLO0FBQ0wsS0FBSztBQUVMLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDZDQUE2QyxDQUFBO0FBY2hHLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDhDQUE4QyxDQUFBO0FBRWxHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQU12QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUVuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0MsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDbEYsS0FBSztBQUNMLEtBQUs7QUFFTCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBRXZEOztHQUVHO0FBRUksSUFBTSxrQkFBa0IsMEJBQXhCLE1BQU0sa0JBQ1QsU0FBUSxZQUFvQjtJQUR6Qjs7UUFJTSxtQkFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtRQUUvQyxnQkFBVyxHQUFvQixFQUFFLENBQUE7UUFDakMsWUFBTyxHQUFhLEVBQUUsQ0FBQTtRQUN0QixVQUFLLEdBT1QsRUFBRSxDQUFBO1FBQ0UsZUFBVSxHQUFXLEVBQUUsQ0FBQTtRQUN2QixhQUFRLEdBSVosRUFBRSxDQUFBO1FBQ0Usc0JBQWlCLEdBQXVCLEVBQUUsQ0FBQTtJQXdvSXhELENBQUM7SUFsb0lHOztPQUVHO0lBQ0gsUUFBUTtRQUNKLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUM5QixHQUFHLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDakMsR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBQ3BDLEdBQUcsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUNsQyxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDbkMsR0FBRyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQ3JDLEdBQUcsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUNwQyxHQUFHLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFDckMsR0FBRyxJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBQ3pDLEdBQUcsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUNsQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRO1lBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ3RELE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztJQU1ELGNBQWMsQ0FBQyxXQUFvQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUN2QixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDSixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUNwQyxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFDaEMsRUFBRSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtRQUM1QixPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUE2QkQ7OztPQUdHO0lBQ0gsTUFBTSxDQUNGLFNBR2dFLEVBQ2hFLGtCQUEyQjtRQUUzQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUE7UUFDdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkQsU0FBUyxFQUFFLFNBQVM7YUFDdkIsQ0FBQyxDQUFDLENBQUE7UUFDUCxDQUFDO2FBQU0sSUFBSSxPQUFPLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtZQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzVCLFNBQVMsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxTQUFTLEVBQUUsa0JBQWtCO2FBQ2hDLENBQUMsQ0FBQTtRQUNOLENBQUM7YUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHO2dCQUN6QixFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFO2FBQzFELENBQUE7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBb0JEOztPQUVHO0lBQ0gsU0FBUyxDQUNMLFNBR2dFLEVBQ2hFLGtCQUEyQjtRQUUzQixJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRTNCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDMUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQzNELENBQUE7UUFDTCxDQUFDO2FBQU0sSUFBSSxPQUFPLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtZQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzVCLFNBQVMsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxTQUFTLEVBQUUsa0JBQWtCO2FBQ2hDLENBQUMsQ0FBQTtRQUNOLENBQUM7YUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDNUIsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFNBQVMsRUFBRSxrQkFBa0I7YUFDaEMsQ0FBQyxDQUFBO1FBQ04sQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLFlBQW9CO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFBO1FBQ2xELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxDQUFDLFdBQW9CLElBQUk7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFBO1FBQzVDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLFVBQW9CO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFBO1FBQ2hELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQXNCRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUNBLFlBRWdFLEVBQ2hFLFNBQWlCO1FBRWpCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzFDLE9BQU8sSUFBb0MsQ0FBQTtJQUMvQyxDQUFDO0lBb0JEOzs7T0FHRztJQUNILE9BQU8sQ0FDSCxZQUVnRSxFQUNoRSxTQUFpQjtRQUVqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTFDLE9BQU8sSUFBb0MsQ0FBQTtJQUMvQyxDQUFDO0lBcUREOzs7O09BSUc7SUFDSCxTQUFTLENBQ0wsZ0JBR2dFLEVBQ2hFLEtBQWEsRUFDYixTQUFrQixFQUNsQixVQUEwQjtRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ2xFLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQXFERDs7OztPQUlHO0lBQ0gsUUFBUSxDQUNKLGdCQUdnRSxFQUNoRSxLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUNqRSxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFxREQ7Ozs7T0FJRztJQUNILGtCQUFrQixDQUNkLGdCQUdnRSxFQUNoRSxLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDOUQsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBcUREOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FDYixnQkFHZ0UsRUFDaEUsS0FBYSxFQUNiLFNBQWtCLEVBQ2xCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQzdELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQWtFRDs7Ozs7O09BTUc7SUFDSCxtQkFBbUIsQ0FDZixhQUFxQixFQUNyQixnQkFHZ0UsRUFDaEUsS0FBYSxFQUNiLFNBQWtCLEVBQ2xCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsRUFDYixJQUFJLENBQ1AsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQWtFRDs7Ozs7O09BTUc7SUFDSCxrQkFBa0IsQ0FDZCxhQUFxQixFQUNyQixnQkFHZ0UsRUFDaEUsS0FBYSxFQUNiLFNBQWtCLEVBQ2xCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsRUFDYixLQUFLLENBQ1IsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQWtFRDs7Ozs7O09BTUc7SUFDSCxrQkFBa0IsQ0FDZCxhQUFxQixFQUNyQixnQkFHZ0UsRUFDaEUsS0FBYSxFQUNiLFNBQWtCLEVBQ2xCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FDTCxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsRUFDYixJQUFJLENBQ1AsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQWtFRDs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsQ0FDYixhQUFxQixFQUNyQixnQkFHZ0UsRUFDaEUsS0FBYSxFQUNiLFNBQWtCLEVBQ2xCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FDTCxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsRUFDYixLQUFLLENBQ1IsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQWdERDs7O09BR0c7SUFDSCxvQkFBb0IsQ0FDaEIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsa0JBQTJELEVBQzNELG1CQUU0QjtRQUU1QixNQUFNLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ3ZFLG1CQUFtQixDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDakQsbUJBQW1CLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUMvQyxJQUFJLE9BQU8sa0JBQWtCLEtBQUssUUFBUTtZQUN0QyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUE7UUFDbEQsSUFDSSxPQUFPLGtCQUFrQixLQUFLLFFBQVE7WUFDckMsa0JBQTBCLENBQUMsZUFBZTtZQUUzQyxtQkFBbUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1FBRTlDLG1CQUFtQixDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFBO1FBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFFakUsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztnQkFDM0IsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLG1CQUFtQixDQUFDLGFBQWE7Z0JBQ3ZDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsc0JBQXNCO2FBQ2hFLENBQUMsQ0FBQTtRQUNOLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUIsQ0FDbkIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsU0FBa0IsRUFDbEIsbUJBRTRCO1FBRTVCLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxzQkFBc0IsQ0FDckQsSUFBSSxDQUFDLGFBQWEsQ0FDckIsQ0FBQTtRQUNELHNCQUFzQixDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDcEQsc0JBQXNCLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNsRCxzQkFBc0IsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFBO1FBQ3hDLHNCQUFzQixDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFBO1FBQ2hFLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUE7UUFFdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDM0IsSUFBSSxFQUFFLE9BQU87WUFDYixJQUFJLEVBQUUsc0JBQXNCLENBQUMsYUFBYTtTQUM3QyxDQUFDLENBQUE7UUFDRixJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO2dCQUMzQixJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsc0JBQXNCLENBQUMsYUFBYTtnQkFDMUMsUUFBUSxFQUNKLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxzQkFBc0I7YUFDN0QsQ0FBQyxDQUFBO1FBQ04sQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxPQUdsQjtRQUVHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbEUsSUFDSSxPQUFPLEtBQUssU0FBUztnQkFDckIsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO2dCQUMvQixPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUV2RCxPQUFNO1lBRVYsSUFBSSxDQUFDLG9CQUFvQixDQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxJQUFJO2dCQUM5QixHQUFHO2dCQUNILFFBQVEsQ0FBQyxZQUFZLEVBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLElBQUk7Z0JBQzlCLEdBQUc7Z0JBQ0gsUUFBUSxDQUFDLFlBQVksRUFDekIsT0FBTyxDQUNWLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUNELEtBS3FCLEVBQ3JCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQSxDQUFDLG9GQUFvRjtRQUNuSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0MsSUFBSSxTQUFTO1lBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUc7Z0JBQ3hCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO2FBQzNDLENBQUE7UUFDTCxJQUFJLFVBQVU7WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FDSixLQUtxQixFQUNyQixVQUEwQjtRQUUxQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDM0IsSUFBSSxFQUFFLEtBQUs7WUFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDLENBQUE7UUFDRixJQUFJLFVBQVU7WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FDSCxLQUtxQixFQUNyQixVQUEwQjtRQUUxQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDM0IsSUFBSSxFQUFFLElBQUk7WUFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDLENBQUE7UUFDRixJQUFJLFVBQVU7WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxVQUFVLENBQUMsR0FBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsYUFBYSxDQUFDLEdBQWdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksQ0FBQyxHQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQWMsRUFBRSxVQUEwQjtRQUM3QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ3RFLElBQUksVUFBVTtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLE1BQWMsRUFBRSxVQUEwQjtRQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ25FLElBQUksVUFBVTtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLE1BQWMsRUFBRSxVQUEwQjtRQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2xFLElBQUksVUFBVTtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBZ0JEOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsT0FBZ0I7UUFDcEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUE7UUFDcEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLE9BQWU7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3pDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQTZCRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUNILElBQWdDLEVBQ2hDLFFBQXdCLEtBQUssRUFDN0IsS0FBb0M7UUFFcEMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLE1BQU07WUFDMUQsTUFBTSxJQUFJLFlBQVksQ0FDbEIsZ0ZBQWdGLENBQ25GLENBQUE7UUFDTCxJQUNJLEtBQUssS0FBSyxTQUFTO1lBQ25CLEtBQUssS0FBSyxhQUFhO1lBQ3ZCLEtBQUssS0FBSyxZQUFZO1lBRXRCLE1BQU0sSUFBSSxZQUFZLENBQ2xCLDhGQUE4RixDQUNqRyxDQUFBO1FBRUwsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQXdCLENBQUE7WUFDMUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUc7d0JBQzFCLENBQUMsSUFBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO3FCQUNyQyxDQUFBO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUE7Z0JBQzdELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUE7UUFDcEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUNOLElBQVksRUFDWixRQUF3QixLQUFLLEVBQzdCLEtBQW9DO1FBRXBDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFNO1lBQzFELE1BQU0sSUFBSSxZQUFZLENBQ2xCLGdGQUFnRixDQUNuRixDQUFBO1FBQ0wsSUFDSSxLQUFLLEtBQUssU0FBUztZQUNuQixLQUFLLEtBQUssYUFBYTtZQUN2QixLQUFLLEtBQUssWUFBWTtZQUV0QixNQUFNLElBQUksWUFBWSxDQUNsQiw4RkFBOEYsQ0FDakcsQ0FBQTtRQUVMLElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQTtRQUN4RCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsS0FBYztRQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RELElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUztZQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFFL0IsTUFBTSxJQUFJLFlBQVksQ0FDbEIseUVBQXlFLENBQzVFLENBQUE7UUFFTCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxNQUFlO1FBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEQsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUVoQyxNQUFNLElBQUksWUFBWSxDQUNsQiwwRUFBMEUsQ0FDN0UsQ0FBQTtRQUVMLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLElBQWE7UUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3BELElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFFOUIsTUFBTSxJQUFJLFlBQVksQ0FDbEIsd0VBQXdFLENBQzNFLENBQUE7UUFFTCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNwRCxJQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFDckMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBRTlCLE1BQU0sSUFBSSxZQUFZLENBQ2xCLHdFQUF3RSxDQUMzRSxDQUFBO1FBRUwsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQTtRQUVuQyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUE2QkQ7O09BRUc7SUFDSCxPQUFPLENBQ0gsUUFjcUIsRUFDckIsV0FBMkIsRUFDM0IsVUFBcUI7UUFFckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDMUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsUUFBa0M7UUFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQ3RDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNQLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtRQUNyQyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTO1FBQ1gsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDWixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFlBQVk7WUFDNUMsTUFBTSxJQUFJLCtCQUErQixFQUFFLENBQUE7UUFFL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQzVDLElBQUksc0JBQXNCLEdBQVksS0FBSyxDQUFBO1FBQzNDLElBQUksQ0FBQztZQUVELElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEtBQUssSUFBSTtnQkFDMUMsV0FBVyxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFDM0MsQ0FBQztnQkFDQyxNQUFNLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO2dCQUNwQyxzQkFBc0IsR0FBRyxJQUFJLENBQUE7WUFDakMsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUd0RCxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDekMsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFBO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBRWIsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUM7b0JBQ0QsTUFBTSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtnQkFDM0MsQ0FBQztnQkFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDLENBQUEsQ0FBQztZQUM5QixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUE7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDUCxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBRW5DLE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQy9CLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQjtRQUluQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUM1QyxJQUFJLHNCQUFzQixHQUFZLEtBQUssQ0FBQTtRQUMzQyxJQUFJLENBQUM7WUFFRCxJQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxLQUFLLElBQUk7Z0JBQzFDLFdBQVcsQ0FBQyxtQkFBbUIsS0FBSyxLQUFLLEVBQzNDLENBQUM7Z0JBQ0MsTUFBTSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtnQkFDcEMsc0JBQXNCLEdBQUcsSUFBSSxDQUFBO1lBQ2pDLENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7WUFDckMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLENBQUE7WUFHcEUsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixNQUFNLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQ3pDLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQTtRQUNsQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUViLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNELE1BQU0sV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUE7Z0JBQzNDLENBQUM7Z0JBQUMsT0FBTyxhQUFhLEVBQUUsQ0FBQyxDQUFBLENBQUM7WUFDOUIsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFBO1FBQ2YsQ0FBQztnQkFBUyxDQUFDO1lBQ1AsSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDLFdBQVc7Z0JBRWhDLE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ25DLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTTtRQUNSLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDOUMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQVEsQ0FBQTtRQUV6QyxJQUNJLE1BQU07WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxZQUFZO1lBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUNoQyxDQUFDO1lBQ0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxDQUFBO1lBRXZELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLFlBQVksSUFBSSxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sYUFBYSxHQUNmLFFBQVEsQ0FBQyxnQkFBaUIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyw2QkFBNkI7Z0JBQ25GLElBQ0ksYUFBYSxDQUFDLE9BQU8sRUFBRTtvQkFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFO29CQUV4QyxNQUFNLElBQUksa0NBQWtDLENBQ3hDLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQzlCLGFBQWEsQ0FDaEIsQ0FBQTtZQUNULENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLGFBQWEsR0FDZixRQUFRLENBQUMsYUFBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLDZCQUE2QjtnQkFDaEYsSUFBSSxhQUFhLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXO29CQUNoRCxNQUFNLElBQUksa0NBQWtDLENBQ3hDLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQzlCLGFBQWEsQ0FDaEIsQ0FBQTtZQUNULENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUE7UUFDZixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVk7UUFDZCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUVsQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksbUJBQW1CLENBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLE1BQU0sRUFDcEMsSUFBSSxDQUNQLENBQUE7UUFDTCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFlBQVk7WUFDNUMsTUFBTSxJQUFJLCtCQUErQixFQUFFLENBQUE7UUFFL0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUM5QyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUE7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1YsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxZQUFZO1lBQzVDLE1BQU0sSUFBSSwrQkFBK0IsRUFBRSxDQUFBO1FBRS9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQzVDLElBQUksc0JBQXNCLEdBQVksS0FBSyxDQUFBO1FBQzNDLElBQUksQ0FBQztZQUVELElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEtBQUssSUFBSTtnQkFDMUMsV0FBVyxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFDM0MsQ0FBQztnQkFDQyxNQUFNLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO2dCQUNwQyxzQkFBc0IsR0FBRyxJQUFJLENBQUE7WUFDakMsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtZQUN0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUd6RCxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDekMsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFBO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBRWIsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUM7b0JBQ0QsTUFBTSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtnQkFDM0MsQ0FBQztnQkFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDLENBQUEsQ0FBQztZQUM5QixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUE7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDUCxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsV0FBVztnQkFFaEMsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZUFBZTtRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFlBQVk7WUFDNUMsTUFBTSxJQUFJLCtCQUErQixFQUFFLENBQUE7UUFFL0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDNUMsSUFBSSxzQkFBc0IsR0FBWSxLQUFLLENBQUE7UUFDM0MsSUFBSSxDQUFDO1lBRUQsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsS0FBSyxJQUFJO2dCQUMxQyxXQUFXLENBQUMsbUJBQW1CLEtBQUssS0FBSyxFQUMzQyxDQUFDO2dCQUNDLE1BQU0sV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUE7Z0JBQ3BDLHNCQUFzQixHQUFHLElBQUksQ0FBQTtZQUNqQyxDQUFDO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1lBQ3JDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUMxRCxXQUFXLENBQ2QsQ0FBQTtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtZQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQTtZQUcxQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtZQUNuRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN2RCxNQUFNLE9BQU8sR0FBdUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBR3BFLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtZQUN6QyxDQUFDO1lBRUQsT0FBTyxPQUFPLENBQUE7UUFDbEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFFYixJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQztvQkFDRCxNQUFNLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO2dCQUMzQyxDQUFDO2dCQUFDLE9BQU8sYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDO1lBQzlCLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQTtRQUNmLENBQUM7Z0JBQVMsQ0FBQztZQUNQLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxXQUFXO2dCQUVoQyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQW9FRDs7T0FFRztJQUNILEtBQUssQ0FDRCx5QkFBb0QsRUFDcEQsaUJBQTBCO1FBRTFCLElBQUksT0FBTyx5QkFBeUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyx5QkFBeUIsQ0FBQTtRQUN4RCxDQUFDO2FBQU0sSUFBSSxPQUFPLHlCQUF5QixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyx5QkFBeUIsQ0FBQTtRQUNoRSxDQUFDO2FBQU0sSUFDSCxPQUFPLHlCQUF5QixLQUFLLFFBQVE7WUFDN0MsT0FBTyx5QkFBeUIsS0FBSyxRQUFRLEVBQy9DLENBQUM7WUFDQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7WUFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcseUJBQXlCLENBQUE7UUFDMUQsQ0FBQztRQUVELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQTtRQUN4RCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsTUFBZ0M7UUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3ZDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQU1TLElBQUksQ0FDVixTQUEyQixFQUMzQixnQkFHZ0UsRUFDaEUsU0FBaUIsRUFDakIsU0FBa0IsRUFDbEIsVUFBMEIsRUFDMUIsYUFBc0IsRUFDdEIsYUFBdUI7UUFFdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUE7UUFFcEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQ25DLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FDckIsQ0FBQTtRQUNELGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQ25DLGFBQWEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQzNDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQSxDQUFDLGVBQWU7UUFDakUsYUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBLENBQUMsMkJBQTJCO1FBRXZGLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVyRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QixJQUNJLGFBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO2dCQUN2QyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUNqQyxDQUFDO2dCQUNDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxTQUFTLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLFVBQVUsQ0FBQTtnQkFDNUcsYUFBYSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUztvQkFDN0MsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFNBQVMsUUFBUSxxQkFBcUIsRUFBRTtvQkFDNUQsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLEVBQUUsQ0FBQTtZQUNwQyxDQUFDO1lBRUQsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztnQkFDakQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2FBQ25DLENBQUMsQ0FBQTtZQUNGLElBQ0ksYUFBYSxDQUFDLFFBQVE7Z0JBQ3RCLGFBQWEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQy9DLENBQUM7Z0JBQ0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7b0JBQzNCLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxhQUFhLENBQUMsYUFBYTtvQkFDakMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCO2lCQUMxRCxDQUFDLENBQUE7WUFDTixDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLFFBQVEsR0FBVyxFQUFFLENBQUE7WUFDekIsSUFBSSxPQUFPLGdCQUFnQixLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLGVBQWUsR0FDakIsZ0JBQ0gsQ0FBRSxJQUF1QyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7Z0JBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7Z0JBQ25ELFFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUE7WUFDekMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQTtZQUMvQixDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQ1osT0FBTyxnQkFBZ0IsS0FBSyxVQUFVO2dCQUN0QyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRztvQkFDbEMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUE7WUFDNUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztnQkFDakQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsU0FBUyxFQUNMLFVBQVUsS0FBSyxLQUFLO29CQUNoQixDQUFDLENBQUUsZ0JBQTJCO29CQUM5QixDQUFDLENBQUMsU0FBUztnQkFDbkIsUUFBUSxFQUFFLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUN2RCxDQUFDLENBQUE7UUFDTixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVM7WUFDN0IsTUFBTSxJQUFJLFlBQVksQ0FDbEIsd0VBQXdFLENBQzNFLENBQUE7UUFJTCxNQUFNLFVBQVUsR0FBa0IsRUFBRSxDQUFBO1FBQ3BDLE1BQU0sZUFBZSxHQUFrQixFQUFFLENBQUE7UUFFekMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUE7WUFDdEQsVUFBVSxDQUFDLElBQUksQ0FDWCxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUNqQyxRQUFRLENBQ1gsQ0FDSixDQUFBO1lBQ0QsZUFBZSxDQUFDLElBQUksQ0FDaEIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksRUFDakMsUUFBUSxDQUNYLENBQ0osQ0FBQTtRQUNMLENBQUM7UUFHRCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMvQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEIsVUFBVSxDQUFDLElBQUksQ0FDWCxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFLLEVBQ2hCLElBQUksQ0FBQyxRQUFRLENBQ2hCLENBQ0osQ0FBQTtnQkFDRCxlQUFlLENBQUMsSUFBSSxDQUNoQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFLLEVBQ2hCLElBQUksQ0FBQyxRQUFRLENBQ2hCLENBQ0osQ0FBQTtZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2hELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNuRCxDQUFBO2dCQUNELElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2YsVUFBVSxDQUFDLElBQUksQ0FBQzt3QkFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUssQ0FBQyxHQUFHLElBQUk7cUJBQ2xELENBQUMsQ0FBQTtvQkFDRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2xELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNuRCxDQUFBO29CQUNELGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBZSxDQUFDLENBQUE7Z0JBQ3pDLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7UUFHRixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87YUFDckIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQzFELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2hCLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDdEQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQzlCLENBQUMsQ0FDTCxDQUFBO1FBR0wsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFHaEUsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFBO1FBQ3pCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxRQUFRLEdBQUcsZUFBZSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxDQUFBO1lBQzVELENBQUM7UUFDTCxDQUFDO1FBR0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO2FBQ25DLE1BQU0sQ0FDSCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ04sS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNO1lBQ3JCLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQzFDO2FBQ0EsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWCxJQUFJLEtBQUssQ0FBQyxRQUFRO2dCQUNkLE9BQU8sS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFekQsT0FBTyxDQUNILElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVUsQ0FBQztnQkFDbkMsR0FBRztnQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDMUIsQ0FBQTtRQUNMLENBQUMsQ0FBQyxDQUFBO1FBRU4sTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUE7UUFDcEQsTUFBTSxTQUFTLEdBQUcsVUFBVTthQUN2QixHQUFHLENBQ0EsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNQLE1BQU0sQ0FBQyxTQUFTO1lBQ2hCLENBQUMsTUFBTSxDQUFDLFNBQVM7Z0JBQ2IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDaEI7YUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFZixPQUFPLENBQ0gsTUFBTTtZQUNOLFNBQVM7WUFDVCxRQUFRO1lBQ1IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ2hDLFFBQVEsQ0FDWCxDQUFBO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sOEJBQThCO1FBQ3BDLE1BQU0sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsR0FDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQTtRQUN0QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtRQUVsQyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUE7UUFFdEIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLDBCQUEwQixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixPQUFPLENBQUE7WUFDbEYsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUNJLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7WUFDcEMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDN0IsQ0FBQztZQUNDLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCO2lCQUN2QyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRWYsTUFBTSxHQUFHLHVCQUF1QixtQkFBbUIsSUFBSSxDQUFBO1FBQzNELENBQUM7YUFBTSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQTtRQUMvQixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ08sb0JBQW9CO1FBUzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzdELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUE7WUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFBO1lBQy9DLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUE7WUFDakQsSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsU0FBUztnQkFDdEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUc7Z0JBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDUixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFBO1lBSXhDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRO29CQUMzQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRO29CQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO2dCQUM3QyxPQUFPLENBQ0gsR0FBRztvQkFDSCxRQUFRLENBQUMsU0FBUztvQkFDbEIsUUFBUTtvQkFDUixlQUFlO29CQUNmLEdBQUc7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNoQyxDQUFDLFFBQVEsQ0FBQyxTQUFTO3dCQUNmLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7d0JBQ3hELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDWixDQUFBO1lBQ0wsQ0FBQztZQUdELElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRW5ELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXO3FCQUNqQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxDQUNILHFCQUFxQjt3QkFDckIsR0FBRzt3QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWTt3QkFDekMsR0FBRzt3QkFDSCxXQUFXO3dCQUNYLEdBQUc7d0JBQ0gsUUFBUSxDQUFDLFlBQVk7d0JBQ3JCLEdBQUc7d0JBQ0gsVUFBVSxDQUFDLGdCQUFpQixDQUFDLFlBQVksQ0FDNUMsQ0FBQTtnQkFDTCxDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUVsQixPQUFPLENBQ0gsR0FBRztvQkFDSCxRQUFRLENBQUMsU0FBUztvQkFDbEIsUUFBUTtvQkFDUixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDO29CQUN2QyxHQUFHO29CQUNILElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7b0JBQ2xDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtvQkFDaEMsTUFBTTtvQkFDTixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLENBQzNELENBQUE7WUFDTCxDQUFDO2lCQUFNLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFFN0QsTUFBTSxTQUFTLEdBQUcsUUFBUTtxQkFDckIsZUFBZ0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQzdDLElBQ0ksUUFBUSxDQUFDLHFCQUFxQixDQUFDLFNBQVM7d0JBQ3BDLGNBQWM7d0JBQ2xCLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsRUFDcEQsQ0FBQzt3QkFDQyxpQkFBaUI7NEJBQ2IsT0FBTztnQ0FDUCxxQkFBcUI7Z0NBQ3JCLEdBQUc7Z0NBQ0gsUUFBUSxDQUFDLHFCQUFxQjtxQ0FDekIsbUJBQW1CLENBQUMsWUFBWTtnQ0FDckMsSUFBSTtnQ0FDSixRQUFRLENBQUMscUJBQXFCO3FDQUN6QixrQkFBa0I7Z0NBQ3ZCLEdBQUcsQ0FBQTtvQkFDWCxDQUFDO29CQUVELE9BQU8sQ0FDSCxxQkFBcUI7d0JBQ3JCLEdBQUc7d0JBQ0gsUUFBUSxDQUFDLGVBQWdCLENBQUMsWUFBWTt3QkFDdEMsR0FBRzt3QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWTt3QkFDekMsR0FBRzt3QkFDSCxXQUFXO3dCQUNYLEdBQUc7d0JBQ0gsVUFBVSxDQUFDLGdCQUFpQixDQUFDLFlBQVksQ0FDNUMsQ0FBQTtnQkFDTCxDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUVsQixPQUFPLENBQ0gsR0FBRztvQkFDSCxRQUFRLENBQUMsU0FBUztvQkFDbEIsUUFBUTtvQkFDUixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDO29CQUN2QyxHQUFHO29CQUNILElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7b0JBQ2xDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtvQkFDaEMsTUFBTTtvQkFDTixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLENBQzNELENBQUE7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBRUosTUFBTSxpQkFBaUIsR0FDbkIsUUFBUSxDQUFDLHNCQUF1QixDQUFDLFNBQVMsQ0FBQTtnQkFFOUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQTtnQkFDNUMsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLEVBQ3RCLG9CQUFvQixHQUFHLEVBQUUsQ0FBQTtnQkFFN0IsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxXQUFXO3lCQUNuQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFFaEIsT0FBTyxDQUNILGFBQWE7NEJBQ2IsR0FBRzs0QkFDSCxVQUFVLENBQUMsWUFBWTs0QkFDdkIsR0FBRzs0QkFDSCxXQUFXOzRCQUNYLEdBQUc7NEJBQ0gsVUFBVSxDQUFDLGdCQUFpQixDQUFDLFlBQVksQ0FDNUMsQ0FBQTtvQkFDTCxDQUFDLENBQUM7eUJBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUVsQixvQkFBb0IsR0FBRyxRQUFRLENBQUMsa0JBQWtCO3lCQUM3QyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFFaEIsT0FBTyxDQUNILHFCQUFxQjs0QkFDckIsR0FBRzs0QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWTs0QkFDekMsR0FBRzs0QkFDSCxhQUFhOzRCQUNiLEdBQUc7NEJBQ0gsVUFBVSxDQUFDLFlBQVksQ0FDMUIsQ0FBQTtvQkFDTCxDQUFDLENBQUM7eUJBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUN0QixDQUFDO3FCQUFNLENBQUM7b0JBQ0osaUJBQWlCLEdBQUcsUUFBUTt5QkFDdkIsZUFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3BDLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBRVgsT0FBTyxDQUNILGFBQWE7NEJBQ2IsR0FBRzs0QkFDSCxVQUFVLENBQUMsWUFBWTs0QkFDdkIsR0FBRzs0QkFDSCxXQUFXOzRCQUNYLEdBQUc7NEJBQ0gsVUFBVSxDQUFDLGdCQUFpQixDQUFDLFlBQVksQ0FDNUMsQ0FBQTtvQkFDTCxDQUFDLENBQ0o7eUJBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUVsQixvQkFBb0IsR0FBRyxRQUFRO3lCQUMxQixlQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFFN0MsT0FBTyxDQUNILHFCQUFxQjs0QkFDckIsR0FBRzs0QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWTs0QkFDekMsR0FBRzs0QkFDSCxhQUFhOzRCQUNiLEdBQUc7NEJBQ0gsVUFBVSxDQUFDLFlBQVksQ0FDMUIsQ0FBQTtvQkFDTCxDQUFDLENBQUM7eUJBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUN0QixDQUFDO2dCQUVELE9BQU8sQ0FDSCxHQUFHO29CQUNILFFBQVEsQ0FBQyxTQUFTO29CQUNsQixRQUFRO29CQUNSLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUM7b0JBQ3BDLEdBQUc7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7b0JBQzFCLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtvQkFDaEMsTUFBTTtvQkFDTixJQUFJLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUM7b0JBQzVDLEdBQUc7b0JBQ0gsUUFBUSxDQUFDLFNBQVM7b0JBQ2xCLFFBQVE7b0JBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQztvQkFDdkMsR0FBRztvQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO29CQUNsQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ2hDLE1BQU07b0JBQ04sSUFBSSxDQUFDLG9CQUFvQixDQUNyQixvQkFBb0IsR0FBRyxpQkFBaUIsQ0FDM0MsQ0FDSixDQUFBO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNPLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQ25FLE9BQU8sRUFBRSxDQUFBO1FBQ2IsT0FBTyxDQUNILFlBQVk7WUFDWixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3BFLENBQUE7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyx1QkFBdUI7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUE7UUFDL0MsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2hDLE9BQU8sQ0FDSCxZQUFZO2dCQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3FCQUNoQixHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDaEIsSUFBSSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDM0MsT0FBTyxDQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7NEJBQ3JDLEdBQUc7NEJBQ0gsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUN2QixDQUFBO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixPQUFPLENBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQzs0QkFDckMsR0FBRzs0QkFDRixRQUFRLENBQUMsVUFBVSxDQUFTLENBQUMsS0FBSzs0QkFDbkMsR0FBRzs0QkFDRixRQUFRLENBQUMsVUFBVSxDQUFTLENBQUMsS0FBSyxDQUN0QyxDQUFBO29CQUNMLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQTtRQUVMLE9BQU8sRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ08sMkJBQTJCO1FBR2pDLElBQUksTUFBTSxHQUF1QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFDdEQsS0FBSyxHQUF1QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQTtRQUN4RCxJQUNJLENBQUMsTUFBTTtZQUNQLENBQUMsS0FBSztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ2hELENBQUM7WUFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUE7WUFDaEMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFBO1FBQ25DLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFNbEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFBO1lBQ2YsSUFDSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUN6RCxDQUFDO2dCQUNDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQTtZQUN0QyxDQUFDO1lBRUQsSUFBSSxLQUFLLElBQUksTUFBTTtnQkFDZixPQUFPLENBQ0gsTUFBTTtvQkFDTixVQUFVO29CQUNWLE1BQU07b0JBQ04sbUJBQW1CO29CQUNuQixLQUFLO29CQUNMLFlBQVksQ0FDZixDQUFBO1lBQ0wsSUFBSSxLQUFLO2dCQUNMLE9BQU8sQ0FDSCxNQUFNLEdBQUcsNEJBQTRCLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FDL0QsQ0FBQTtZQUNMLElBQUksTUFBTTtnQkFBRSxPQUFPLE1BQU0sR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQTtRQUM3RCxDQUFDO2FBQU0sSUFDSCxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBYztZQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUs7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQ25ELENBQUM7WUFDQyxJQUFJLEtBQUssSUFBSSxNQUFNO2dCQUFFLE9BQU8sU0FBUyxHQUFHLEtBQUssR0FBRyxVQUFVLEdBQUcsTUFBTSxDQUFBO1lBQ25FLElBQUksS0FBSztnQkFBRSxPQUFPLFNBQVMsR0FBRyxLQUFLLENBQUE7WUFDbkMsSUFBSSxNQUFNO2dCQUFFLE1BQU0sSUFBSSxtQ0FBbUMsRUFBRSxDQUFBO1FBQy9ELENBQUM7YUFBTSxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVELElBQUksS0FBSyxJQUFJLE1BQU07Z0JBQUUsT0FBTyxTQUFTLEdBQUcsS0FBSyxHQUFHLFVBQVUsR0FBRyxNQUFNLENBQUE7WUFDbkUsSUFBSSxLQUFLO2dCQUFFLE9BQU8sU0FBUyxHQUFHLEtBQUssQ0FBQTtZQUNuQyxJQUFJLE1BQU07Z0JBQUUsT0FBTyxtQkFBbUIsR0FBRyxNQUFNLENBQUE7UUFDbkQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxRCxJQUFJLEtBQUssSUFBSSxNQUFNO2dCQUNmLE9BQU8sQ0FDSCxVQUFVO29CQUNWLE1BQU07b0JBQ04sbUJBQW1CO29CQUNuQixLQUFLO29CQUNMLFlBQVksQ0FDZixDQUFBO1lBQ0wsSUFBSSxLQUFLO2dCQUFFLE9BQU8sY0FBYyxHQUFHLEtBQUssR0FBRyxZQUFZLENBQUE7WUFDdkQsSUFBSSxNQUFNO2dCQUFFLE9BQU8sVUFBVSxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUE7UUFDcEQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLEtBQUssSUFBSSxNQUFNO2dCQUFFLE9BQU8sU0FBUyxHQUFHLEtBQUssR0FBRyxVQUFVLEdBQUcsTUFBTSxDQUFBO1lBQ25FLElBQUksS0FBSztnQkFBRSxPQUFPLFNBQVMsR0FBRyxLQUFLLENBQUE7WUFDbkMsSUFBSSxNQUFNO2dCQUFFLE9BQU8sVUFBVSxHQUFHLE1BQU0sQ0FBQTtRQUMxQyxDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLHlCQUF5QjtRQUM3QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDbEQsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQyxLQUFLLGtCQUFrQjtvQkFDbkIsT0FBTywyQkFBMkIsQ0FBQTtnQkFDdEMsS0FBSyxtQkFBbUI7b0JBQ3BCLE9BQU8sMEJBQTBCLENBQUE7Z0JBQ3JDLEtBQUssWUFBWTtvQkFDYixPQUFPLGdCQUFnQixDQUFBO1lBQy9CLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUE7SUFDYixDQUFDO0lBRUQ7O09BRUc7SUFDTyxvQkFBb0I7UUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUE7UUFFckMsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFFekIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQ0ksQ0FBQyxDQUNHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FDeEMsRUFDSCxDQUFDO2dCQUNDLE1BQU0sSUFBSSxZQUFZLENBQ2xCLDhDQUE4QyxDQUNqRCxDQUFBO1lBQ0wsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLElBQUksWUFBWSxDQUFDLHFDQUFxQyxDQUFDLENBQUE7WUFDakUsQ0FBQztZQUNELGdCQUFnQixHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDeEUsQ0FBQztRQUVELElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO1FBQ3pCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0MsZ0JBQWdCLEdBQUcsU0FBUyxDQUFBO1FBQ2hDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ3ZELGdCQUFnQixHQUFHLGNBQWMsQ0FBQTtRQUNyQyxDQUFDO1FBQ0QsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLEtBQUssa0JBQWtCO2dCQUNuQixJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU87b0JBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFDeEMsQ0FBQztvQkFDQyxJQUNJLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQ3hELENBQUM7d0JBQ0MsT0FBTyxDQUNILFlBQVksR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FDckQsQ0FBQTtvQkFDTCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osT0FBTyxxQkFBcUIsQ0FBQTtvQkFDaEMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzNDLE9BQU8scUJBQXFCLENBQUE7Z0JBQ2hDLENBQUM7cUJBQU0sSUFBSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDOUMsT0FBTyxZQUFZLEdBQUcsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUE7Z0JBQzdELENBQUM7cUJBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDMUMsT0FBTyxhQUFhLENBQUE7Z0JBQ3hCLENBQUM7cUJBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDekMsT0FBTyxFQUFFLENBQUE7Z0JBQ2IsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sSUFBSSxrQ0FBa0MsRUFBRSxDQUFBO2dCQUNsRCxDQUFDO1lBQ0wsS0FBSyxtQkFBbUI7Z0JBQ3BCLElBQ0ksV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7b0JBQ2pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQWM7b0JBQ3RDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFDbEMsQ0FBQztvQkFDQyxPQUFPLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQTtnQkFDM0MsQ0FBQztxQkFBTSxJQUNILFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFDdkMsQ0FBQztvQkFDQyxPQUFPLGFBQWEsR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQTtnQkFDOUQsQ0FBQztxQkFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUN6QyxPQUFPLEVBQUUsQ0FBQTtnQkFDYixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLGtDQUFrQyxFQUFFLENBQUE7Z0JBQ2xELENBQUM7WUFDTCxLQUFLLDJCQUEyQjtnQkFDNUIsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDdkMsT0FBTyxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsY0FBYyxDQUFBO2dCQUM1RCxDQUFDO3FCQUFNLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUMzQyxPQUFPLHlCQUF5QixDQUFBO2dCQUNwQyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLGtDQUFrQyxFQUFFLENBQUE7Z0JBQ2xELENBQUM7WUFDTCxLQUFLLDJCQUEyQjtnQkFDNUIsSUFDSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO29CQUNwQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxhQUFhLEVBQ3ZDLENBQUM7b0JBQ0MsT0FBTyxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsU0FBUyxDQUFBO2dCQUN2RCxDQUFDO3FCQUFNLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUMzQyxPQUFPLG9CQUFvQixDQUFBO2dCQUMvQixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLGtDQUFrQyxFQUFFLENBQUE7Z0JBQ2xELENBQUM7WUFDTCxLQUFLLG1CQUFtQjtnQkFDcEIsSUFDSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO29CQUNwQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxhQUFhLEVBQ3ZDLENBQUM7b0JBQ0MsT0FBTyxDQUNILG9CQUFvQjt3QkFDcEIsZ0JBQWdCO3dCQUNoQixnQkFBZ0IsQ0FDbkIsQ0FBQTtnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLGtDQUFrQyxFQUFFLENBQUE7Z0JBQ2xELENBQUM7WUFDTCxLQUFLLGVBQWU7Z0JBQ2hCLElBQUksV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLE9BQU8sQ0FDSCxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FDekQsQ0FBQTtnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLGtDQUFrQyxFQUFFLENBQUE7Z0JBQ2xELENBQUM7WUFDTDtnQkFDSSxPQUFPLEVBQUUsQ0FBQTtRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDakUsT0FBTyxFQUFFLENBQUE7UUFDYixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87YUFDeEMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ25CLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQixLQUFLLEtBQUs7b0JBQ04sT0FBTyxDQUNILENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQzlDLENBQUE7Z0JBQ0wsS0FBSyxJQUFJO29CQUNMLE9BQU8sQ0FDSCxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUN4QixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUM5QyxDQUFBO2dCQUNMO29CQUNJLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1FBQ0wsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUE7UUFDakMsT0FBTyxVQUFVLEdBQUcsVUFBVSxDQUFBO0lBQ2xDLENBQUM7SUFFUywrQkFBK0IsQ0FDckMsU0FBaUIsRUFDakIsUUFBd0I7UUFFeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNoRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQzdDLENBQUE7UUFFRCxNQUFNLE9BQU8sR0FBcUIsRUFBRSxDQUFBO1FBQ3BDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsSUFBSSxDQUNSLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3RCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksQ0FDdkMsQ0FDSixDQUFBO1FBQ0wsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQ1IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNsQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1AsTUFBTSxDQUFDLFNBQVM7Z0JBQ2hCLFNBQVMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FDNUMsQ0FBQTtRQUNMLENBQUMsQ0FBQyxDQUNMLENBQUE7UUFLRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUVwQixPQUFPLEVBQUUsQ0FBQTtRQUViLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXO1lBQzVELENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDMUIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzNEO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNSLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsR0FBRyx5QkFBeUIsQ0FBQyxDQUFBO1FBQzdELE1BQU0sWUFBWSxHQUFrQixFQUFFLENBQUE7UUFFdEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxQixJQUFJLGFBQWEsR0FDYixnQkFBZ0IsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7WUFFN0QsSUFBSSxNQUFNLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMzQyxhQUFhLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQTtZQUN6RCxDQUFDO1lBRUQsSUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDakUsQ0FBQztnQkFDZixLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUdMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7WUFFTyxDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNoRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1AsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQ2pFLENBQUE7WUFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUM3QixZQUFZLENBQUMsSUFBSSxDQUFDO3dCQUNkLFNBQVMsRUFBRSxhQUFhO3dCQUN4QixTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7NEJBQzFCLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUzs0QkFDckIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixTQUFTLEVBQ1QsTUFBTSxDQUFDLFlBQVksQ0FDdEI7d0JBRVAsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO3FCQUM3QixDQUFDLENBQUE7Z0JBQ04sQ0FBQyxDQUFDLENBQUE7WUFDTixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDZCxTQUFTLEVBQUUsYUFBYTtvQkFDeEIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixTQUFTLEVBQ1QsTUFBTSxDQUFDLFlBQVksQ0FDdEI7b0JBRUQsT0FBTyxFQUFFLFlBQVk7aUJBQ3hCLENBQUMsQ0FBQTtZQUNOLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sWUFBWSxDQUFBO0lBQ3ZCLENBQUM7SUFFUyx1QkFBdUIsQ0FDN0IsU0FBaUIsRUFDakIsUUFBd0I7UUFFeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM5QyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQzdDLENBQUE7UUFDRCxJQUFJLFVBQVU7WUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFbkMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNoRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN4QixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1AsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQ2pFLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFTyxzQkFBc0I7UUFDMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsSUFBSSxDQUFBLENBQUMsNkNBQTZDO1FBQ2xHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLFFBQVEsQ0FBQTtRQUV2RCxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFBO1FBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFJNUMsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDekQsQ0FBQztZQUNDLE9BQU8sVUFBVSxDQUFBO1FBQ3JCLENBQUM7UUFJRCxJQUNJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYTtZQUNyRCxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFDdEQsQ0FBQztZQUdDLE9BQU8sQ0FDSCxpQkFBaUI7Z0JBQ2pCLGNBQWM7cUJBQ1QsR0FBRyxDQUNBLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDRixHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUN4RDtxQkFDQSxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNmLElBQUksQ0FDUCxDQUFBO1FBQ0wsQ0FBQztRQUVELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFHcEQsT0FBTyxDQUNILGlCQUFpQjtnQkFDakIsY0FBYztxQkFDVCxHQUFHLENBQ0EsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNGLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQ3hEO3FCQUNBLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2YsR0FBRyxDQUNOLENBQUE7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBTWxELE1BQU0saUJBQWlCLEdBQUcsY0FBYztpQkFDbkMsR0FBRyxDQUNBLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FDZCxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUMzQixhQUFhLENBQUMsWUFBWSxDQUM3QixFQUFFLENBQ1Y7aUJBQ0EsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBRXRCLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxrQkFBa0IsaUJBQWlCLElBQUksQ0FBQTtZQUNsRCxDQUFDO1lBRUQsT0FBTyx5QkFBeUIsaUJBQWlCLEtBQUssQ0FBQTtRQUMxRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBSXBELElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxrQkFBa0IsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQ2pELGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQ2pDLElBQUksQ0FBQTtZQUNULENBQUM7WUFFRCxNQUFNLGlCQUFpQixHQUFHLGNBQWM7aUJBQ25DLEdBQUcsQ0FDQSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQ2QsUUFBUSxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FDaEMsYUFBYSxDQUFDLFlBQVksQ0FDN0IsYUFBYSxDQUNyQjtpQkFDQSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDdEIsT0FBTyx5QkFBeUIsaUJBQWlCLEtBQUssQ0FBQTtRQUMxRCxDQUFDO1FBU0QsT0FBTyxDQUNILGlCQUFpQjtZQUNqQixjQUFjO2lCQUNULEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztpQkFDN0QsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUMxQixJQUFJLENBQ1AsQ0FBQTtJQUNMLENBQUM7SUFFUyxLQUFLLENBQUMsaUJBQWlCLENBQzdCLFdBQXdCO1FBRXhCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBRTlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRTthQUM3QixPQUFPLEVBQUU7YUFDVCxPQUFPLEVBQUU7YUFDVCxNQUFNLENBQUMsU0FBUyxDQUFDO2FBQ2pCLEtBQUssQ0FBQyxTQUFTLENBQUM7YUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUNmLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDZixNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQzthQUN2QixTQUFTLENBQUMsc0JBQXNCLENBQUM7YUFDakMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRWhDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUE7UUFFM0QsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVTLGdCQUFnQjtRQUl0QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQjtvQkFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQTtZQUM3QyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDMUMsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBQ3RCLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7b0JBQ2pELENBQUMsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBa0IsQ0FDdEM7b0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFBO2dCQUU3QixJQUFJLENBQUMsV0FBVyxDQUNaLE1BQU0sRUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxRQUFRLEVBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLElBQUksQ0FDckMsQ0FBQTtZQUNMLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzdCLENBQUM7WUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtZQUNqQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7b0JBQ3ZELENBQUMsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUM3QjtvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUE7Z0JBRWhDLElBQUksQ0FBQyxjQUFjLENBQ2YsU0FBUyxFQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssUUFBUTtvQkFDdkMsQ0FBQyxDQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBaUM7b0JBQ3JELENBQUMsQ0FBQyxTQUFTLEVBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxFQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxJQUFJLENBQ3JDLENBQUE7Z0JBQ0QsSUFDSSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixLQUFLLEtBQUs7b0JBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEtBQUssTUFBTSxFQUNwRCxDQUFDO29CQUNDLElBQUksQ0FBQyxtQkFBbUIsQ0FDcEIsU0FBUyxFQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssUUFBUTt3QkFDdkMsQ0FBQyxDQUFFLElBQUksQ0FBQyxXQUFXOzZCQUNaLE1BQWlDO3dCQUN4QyxDQUFDLENBQUMsU0FBUyxFQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLFFBQVEsRUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsSUFBSSxDQUNyQyxDQUFBO2dCQUNMLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNoQyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxRQUFRLEVBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLElBQUksQ0FDckMsQ0FBQTtnQkFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtvQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FDVCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRzt3QkFDaEMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUc7d0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUN4QixDQUFBLENBQUMsaUNBQWlDO1lBQzNDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLFFBQVEsRUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsSUFBSSxDQUNyQyxDQUFBO1lBQ0wsQ0FBQztZQUdELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUVqQyxFQUFFO3dCQUVGLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQzs0QkFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUNuQixHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxFQUMzRCxJQUFJLENBQUMsS0FBSyxDQUNiLENBQUE7d0JBQ0wsQ0FBQzs2QkFBTSxDQUFDOzRCQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEIsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsRUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FDYixDQUFBO3dCQUNMLENBQUM7b0JBRUwsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQzs0QkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FDVixHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxFQUMzRCxJQUFJLENBQUMsS0FBSyxDQUNiLENBQUE7d0JBQ0wsQ0FBQzs2QkFBTSxDQUFDOzRCQUNKLElBQUksQ0FBQyxRQUFRLENBQ1QsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsRUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FDYixDQUFBO3dCQUNMLENBQUM7b0JBQ0wsQ0FBQztnQkFXTCxDQUFDLENBQUMsQ0FBQTtZQUNOLENBQUM7WUFPRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUl0QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFcEMsQ0FBQztZQUdELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBSXRDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVwQyxDQUFDO1lBR0QsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDdEMsQ0FBQztpQkFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN0QyxDQUFDO2lCQUFNLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLEtBQUssQ0FDTixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FDdEMsQ0FBQTtZQUNMLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUTtvQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQy9DLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ0osSUFBSSxDQUFDLFFBQVEsQ0FDVCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUssQ0FBQyxRQUFTLENBQUMsR0FBRyxDQUFDLEVBQ3JDLEdBQUcsQ0FDTixDQUFBO29CQUNMLENBQUMsQ0FDSixDQUFBO2dCQUVMLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUztvQkFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQ2hELENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ0osSUFBSSxDQUFDLFNBQVMsQ0FDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUssQ0FBQyxTQUFVLENBQUMsR0FBRyxDQUFDLEVBQ3RDLEdBQUcsQ0FDTixDQUFBO29CQUNMLENBQUMsQ0FDSixDQUFBO2dCQUVMLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCO29CQUN2QyxNQUFNLENBQUMsSUFBSSxDQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUMxQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFLLENBQUMsaUJBQWtCLENBQUMsR0FBRyxDQUFDLEVBQzlDLEdBQUcsQ0FDTixDQUFBO29CQUNMLENBQUMsQ0FBQyxDQUFBO2dCQUVOLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCO29CQUN4QyxNQUFNLENBQUMsSUFBSSxDQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUMzQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFLLENBQUMsa0JBQW1CLENBQUMsR0FBRyxDQUFDLEVBQy9DLEdBQUcsQ0FDTixDQUFBO29CQUNMLENBQUMsQ0FBQyxDQUFBO1lBQ1YsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQzlDLElBQUksQ0FBQyxPQUFPLENBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ2hDLENBQUE7Z0JBQ0wsQ0FBQztxQkFBTSxJQUNILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxrQkFBa0I7b0JBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxtQkFBbUI7b0JBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZO29CQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJO3dCQUN0QiwyQkFBMkI7b0JBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUk7d0JBQ3RCLDJCQUEyQjtvQkFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLG1CQUFtQjtvQkFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGVBQWUsRUFDaEQsQ0FBQztvQkFDQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNO3dCQUMzQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFOzRCQUN2QyxNQUFNLFVBQVUsR0FDWixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQ0FDdEMsT0FBTyxDQUNILEtBQUssQ0FBQyxRQUFRO3FDQUNULHNCQUFzQixLQUFLLEtBQUssQ0FDeEMsQ0FBQTs0QkFDTCxDQUFDLENBQUMsQ0FBQTs0QkFDTixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0NBQ2QsTUFBTSxJQUFJLFlBQVksQ0FDbEIsSUFBSSxLQUFLLDZCQUE2QixDQUN6QyxDQUFBOzRCQUNMLENBQUM7NEJBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDdkMsQ0FBQyxDQUFDO3dCQUNKLENBQUMsQ0FBQyxTQUFTLENBQUE7b0JBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FDUixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQzFCLFNBQVMsRUFDVCxVQUFVLENBQ2IsQ0FBQTtvQkFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUNwRCxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7WUFDN0IsQ0FBQztpQkFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQXNCLENBQUMsQ0FBQTtZQUNwRSxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNoRCxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FDL0IsSUFBSSxFQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLElBQUksRUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxDQUN6QyxDQUFBO1lBQ0wsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQTtZQUM1QyxDQUFDO1FBaUJMLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsNEJBQTRCLENBQ3hDLFdBQXdCO1FBRXhCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVM7WUFDN0IsTUFBTSxJQUFJLFlBQVksQ0FDbEIsc0RBQXNELENBQ3pELENBQUE7UUFFTCxJQUNJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssa0JBQWtCO1lBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLG1CQUFtQjtZQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSywyQkFBMkI7WUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssMkJBQTJCO1lBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLG1CQUFtQjtZQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxlQUFlLENBQUM7WUFDcEQsQ0FBQyxXQUFXLENBQUMsbUJBQW1CO1lBRWhDLE1BQU0sSUFBSSx1Q0FBdUMsRUFBRSxDQUFBO1FBRXZELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFBO1lBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQjtnQkFDckQsTUFBTSxJQUFJLGdDQUFnQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUN6QyxJQUFJLENBQUMsVUFBVSxFQUNmLFdBQVcsRUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUMxQyxDQUFBO1FBQ0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLG1CQUFtQixDQUMvQyxJQUFJLENBQUMsVUFBVSxFQUNmLFdBQVcsRUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUM3QyxDQUFBO1FBQ0QsTUFBTSw2QkFBNkIsR0FDL0IsSUFBSSx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDcEUsNkJBQTZCLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDekMsTUFBTSxnQ0FBZ0MsR0FDbEMsSUFBSSwyQ0FBMkMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDdkUsZ0NBQWdDLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFNUMsSUFBSSxVQUFVLEdBQVUsRUFBRSxFQUN0QixRQUFRLEdBQVUsRUFBRSxDQUFBO1FBTXhCLElBQ0ksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM5QyxDQUFDO1lBR0MsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FDckIsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQTtZQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUE7WUFFdkQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQzVDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQ2QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtnQkFDbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FDM0IsV0FBVyxDQUFDLFVBQVUsQ0FDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLGFBQWEsRUFDYixhQUFhLENBQUMsWUFBWSxDQUM3QixDQUNKLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7b0JBRXRCLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUE7Z0JBRWpDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixNQUFNLEdBQUcsYUFBYSxFQUN0QixhQUFhLENBQUMsWUFBWSxDQUM3QixDQUFBO2dCQUVELE9BQU8sR0FBRyxhQUFhLElBQUksV0FBVyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQ3BELEtBQUssQ0FDUixFQUFFLENBQUE7WUFDUCxDQUFDLENBQ0osQ0FBQTtZQUVELFVBQVUsR0FBRyxNQUFNLElBQUksb0JBQWtCLENBQ3JDLElBQUksQ0FBQyxVQUFVLEVBQ2YsV0FBVyxDQUNkO2lCQUNJLE1BQU0sQ0FBQyxZQUFZLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztpQkFDN0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztpQkFDbEIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDO2lCQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7aUJBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztpQkFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBQztpQkFDakIsS0FBSyxDQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztnQkFDcEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztnQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FDbkM7aUJBQ0EsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDbkMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDeEQsVUFBVSxFQUFFLENBQUE7WUFFakIsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUE7Z0JBQ2xCLE1BQU0sVUFBVSxHQUFrQixFQUFFLENBQUE7Z0JBQ3BDLElBQUksUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQ2xDLFNBQVMsR0FBRyxVQUFVO3lCQUNqQixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7d0JBQ25CLE9BQU8sUUFBUSxDQUFDLGNBQWM7NkJBQ3pCLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFOzRCQUNuQixNQUFNLFFBQVEsR0FBRyxvQkFBb0IsS0FBSyxJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQTs0QkFDMUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQ0FDaEIsTUFBTSxDQUNGLE9BQU8sYUFBYSxJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FDdkQsQ0FBQTs0QkFDTCxPQUFPLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUE7d0JBQ3hFLENBQUMsQ0FBQzs2QkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQ3RCLENBQUMsQ0FBQzt5QkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ3JCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsVUFBVSxDQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsTUFBTSxHQUFHLGFBQWEsRUFDdEIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQzFDLENBQUE7b0JBRUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7b0JBQ3JELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQzNCLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQ3RDLENBQUE7b0JBQ0QsSUFBSSxhQUFhLEVBQUUsQ0FBQzt3QkFFaEIsU0FBUyxHQUFHLEdBQUcsYUFBYSxJQUN4QixRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQy9CLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO29CQUM3QixDQUFDO3lCQUFNLENBQUM7d0JBQ0osVUFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxDQUFBO3dCQUNwQyxTQUFTOzRCQUNMLGFBQWE7Z0NBQ2IsR0FBRztnQ0FDSCxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVk7Z0NBQ3ZDLDRCQUE0QixDQUFBO29CQUNwQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRTtxQkFDMUIsa0JBQWtCLENBQUM7b0JBQ2hCLDhCQUE4QixFQUFFLFNBQVM7aUJBQzVDLENBQUM7cUJBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQztxQkFDekIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3BDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDdkQsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUV4QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3BFLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLENBQzFELFVBQVUsQ0FDYixDQUFBO1lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FDcEQsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLG9CQUFvQixFQUNwQix1QkFBdUIsRUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FDbkIsQ0FBQTtZQUNELFFBQVEsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUM1QixVQUFVLEVBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQ2hDLENBQUE7WUFHRCxJQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxLQUFLLElBQUk7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFDMUMsQ0FBQztnQkFDQyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUNuQyxNQUFNLEVBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUNyQyxRQUFRLENBQ1gsQ0FBQTtZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3RELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQTtnQkFDNUQsTUFBTSxhQUFhLEdBQ2YsUUFBUSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQTtnQkFFN0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztvQkFDakQsQ0FBQyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFrQixDQUN0QztvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUE7Z0JBQzdCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7b0JBQ3ZELENBQUMsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUM3QjtvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUE7Z0JBRWhDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtxQkFDekMsTUFBTSxDQUFDLGFBQWEsQ0FBQztxQkFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUM7cUJBQ25DLGNBQWMsQ0FBQztvQkFDWixNQUFNLEVBQUUsTUFBTTt3QkFDVixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FDZCxNQUFNLEVBQ04sUUFBUSxDQUFDLFlBQVksQ0FDeEI7d0JBQ0gsQ0FBQyxDQUFDLFNBQVM7b0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSzt3QkFDekIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQ3RCLFFBQVEsQ0FBQyxZQUFZLENBQ3hCO3dCQUNILENBQUMsQ0FBQyxTQUFTO29CQUNmLFNBQVMsRUFBRSxTQUFTO3dCQUNoQixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FDZCxTQUFTLEVBQ1QsUUFBUSxDQUFDLFlBQVksQ0FDeEI7d0JBQ0gsQ0FBQyxDQUFDLFNBQVM7b0JBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVztvQkFDekMsb0JBQW9CLEVBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CO2lCQUM1QyxDQUFDLENBQUE7Z0JBQ04sSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0QixNQUFNLG1CQUFtQixHQUNyQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsaUNBQWlDLENBQ3BFLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULFlBQVksQ0FDZixDQUFBO29CQUNMLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDeEIsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQy9DLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FDckMsQ0FBQTt3QkFDRCxJQUFJLGtCQUFrQixFQUFFLENBQUM7NEJBQ3JCLE1BQU0sS0FBSyxHQUNQLGtCQUFrQixDQUFDLE9BQU8sS0FBSyxTQUFTO2dDQUNwQyxDQUFDLENBQUMsSUFBSTtnQ0FDTixDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFBOzRCQUNwQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTt3QkFDMUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQTtnQkFDTixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQTtRQUNMLENBQUM7UUFFRCxPQUFPO1lBQ0gsR0FBRyxFQUFFLFVBQVU7WUFDZixRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFBO0lBQ0wsQ0FBQztJQUVTLHlDQUF5QyxDQUMvQyxXQUFtQjtRQUduQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQTtRQUMvQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNyQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUNuQixJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDOUMsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNsQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQzNELE1BQU0sTUFBTSxHQUNSLEtBQUssQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQzNELE9BQU8sQ0FDSCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztvQkFDeEIsR0FBRztvQkFDSCxJQUFJLENBQUMsTUFBTSxDQUNQLFdBQVcsQ0FBQyxVQUFVLENBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixTQUFTLEVBQ1QsTUFBTyxDQUFDLFlBQVksQ0FDdkIsQ0FDSixDQUNKLENBQUE7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzNCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDUCxNQUFNLENBQUMsU0FBUyxLQUFLLGFBQWE7b0JBQ2xDLE1BQU0sQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUN6QztvQkFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQTtnQkFFekQsT0FBTyxFQUFFLENBQUE7WUFDYixDQUFDO1FBQ0wsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRWYsTUFBTSxhQUFhLEdBQXFCLEVBQUUsQ0FBQTtRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQzVDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUM5QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ2xDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDM0QsTUFBTSxNQUFNLEdBQ1IsS0FBSyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDM0QsYUFBYSxDQUNULElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO29CQUNwQixHQUFHO29CQUNILElBQUksQ0FBQyxNQUFNLENBQ1AsV0FBVyxDQUFDLFVBQVUsQ0FDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLFNBQVMsRUFDVCxNQUFPLENBQUMsWUFBWSxDQUN2QixDQUNKLENBQ1IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUMzQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1AsTUFBTSxDQUFDLFNBQVMsS0FBSyxhQUFhO29CQUNsQyxNQUFNLENBQUMsU0FBUyxLQUFLLGFBQWEsQ0FDekMsRUFDSCxDQUFDO29CQUNDLGFBQWEsQ0FDVCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxhQUFhLENBQ2pELEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUMvQixDQUFDO3FCQUFNLENBQUM7b0JBQ0osYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtnQkFDMUQsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUF3QjtRQUNuRCxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBQ3RELE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sWUFBWSxHQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDL0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNaLElBQUksNEJBQTRCLEdBQzVCLFNBQVMsQ0FBQTtRQUNiLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQTtRQUN0QixJQUNJLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCO1lBQ2hDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUMxRCxDQUFDO1lBQ0MsSUFBSSxDQUFDO2dCQUNELDRCQUE0QjtvQkFDeEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FDL0M7d0JBQ0ksVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTzt3QkFDdEMsS0FBSyxFQUFFLE9BQU87d0JBQ2QsUUFBUSxFQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYTs0QkFDaEMsWUFBWSxDQUFDLFFBQVE7NEJBQ3JCLElBQUk7cUJBQ1gsRUFDRCxXQUFXLENBQ2QsQ0FBQTtnQkFDTCxJQUNJLDRCQUE0QjtvQkFDNUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FDdkMsNEJBQTRCLENBQy9CLEVBQ0gsQ0FBQztvQkFDQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQzFELENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUM3QixNQUFNLEtBQUssQ0FBQTtnQkFDZixDQUFDO2dCQUNELFVBQVUsR0FBRyxJQUFJLENBQUE7WUFDckIsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUU5RCxJQUNJLENBQUMsVUFBVTtZQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCO1lBQ2hDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUMxRCxDQUFDO1lBQ0MsSUFBSSxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQy9DO29CQUNJLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87b0JBQ3RDLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTtvQkFDMUIsUUFBUSxFQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYTt3QkFDaEMsWUFBWSxDQUFDLFFBQVE7d0JBQ3JCLElBQUk7b0JBQ1IsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztpQkFDMUMsRUFDRCw0QkFBNEIsRUFDNUIsV0FBVyxDQUNkLENBQUE7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUM3QixNQUFNLEtBQUssQ0FBQTtnQkFDZixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUE7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCLENBQ3hCLGFBQTBDO1FBRTFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUNyRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNPLGVBQWUsQ0FBQyxHQUFRO1FBQzlCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUk7WUFDNUQsT0FBTyxHQUFHLENBQUE7UUFFZCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDTyxpQkFBaUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekUsQ0FBQztJQUVTLFdBQVcsQ0FDakIsTUFBOEIsRUFDOUIsUUFBd0IsRUFDeEIsS0FBYSxFQUNiLFdBQW9CO1FBRXBCLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDckIsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLO2dCQUFFLFNBQVE7WUFFaEUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO1lBQ2hFLE1BQU0sTUFBTSxHQUNSLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMzRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDakUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBRXBFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRO2dCQUM5QixNQUFNLElBQUksMkJBQTJCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBRWpFLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQTtZQUVqRCxDQUFDO2lCQUFNLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBRSxhQUFhO2dCQUMzQixNQUFNLENBQUMsR0FBRyxDQUEyQixFQUNyQyxRQUFRLEVBQ1IsS0FBSyxFQUNMLFlBQVksQ0FDZixDQUFBO1lBZUwsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRVMsY0FBYyxDQUNwQixTQUFvQyxFQUNwQyxTQUE2QyxFQUM3QyxRQUF3QixFQUN4QixLQUFhLEVBQ2IsV0FBb0I7UUFFcEIsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFNO1FBRXRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDNUMsTUFBTSxhQUFhLEdBQUksU0FBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUN0RCxNQUFNLFlBQVksR0FBRyxXQUFXO2dCQUM1QixDQUFDLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxZQUFZO2dCQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFBO1lBQ2xCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDcEUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVE7Z0JBQ25CLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFFakUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLENBQUMsY0FBYyxDQUNmLGFBQWEsRUFDYixPQUFPLFNBQVMsS0FBSyxRQUFRO29CQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQztvQkFDbkQsQ0FBQyxDQUFDLFNBQVMsRUFDZixRQUFRLEVBQ1IsS0FBSyxFQUNMLFlBQVksQ0FDZixDQUFBO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLFNBQVMsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUM1RCxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUNoQixLQUFLLEVBQ0wsU0FBUyxDQUNaLENBQUE7Z0JBQ0QsSUFDSSxhQUFhLEtBQUssSUFBSTtvQkFDdEIsT0FBTyxhQUFhLEtBQUssUUFBUSxFQUNuQyxDQUFDO29CQUNDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsS0FBSyxPQUFPLEVBQUUsQ0FBQzt3QkFDdEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFDekMsQ0FBQzt5QkFBTSxDQUFDO3dCQUVKLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDOzRCQUNaLElBQUksRUFBRSxNQUFNOzRCQUNaLE1BQU0sRUFBRSxJQUFJOzRCQUNaLFNBQVMsRUFDTCxTQUFTO2dDQUNULE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxhQUFhO2dDQUNyRCxDQUFDLENBQUUsU0FBUyxDQUNOLFlBQVksQ0FDWTtnQ0FDOUIsQ0FBQyxDQUFDLFNBQVM7NEJBQ25CLEtBQUssRUFBRSxTQUFTOzRCQUNoQixXQUFXLEVBQUUsS0FBSzs0QkFDbEIsZ0JBQWdCLEVBQUUsUUFBUTt5QkFDN0IsQ0FBQyxDQUFBO3dCQUVGLElBQ0ksU0FBUzs0QkFDVCxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxRQUFRLEVBQzdDLENBQUM7NEJBQ0MsSUFBSSxDQUFDLFdBQVcsQ0FBRSxhQUFhOzRCQUMzQixTQUFTLENBQ0wsWUFBWSxDQUNXLEVBQzNCLFFBQVEsQ0FBQyxxQkFBcUIsRUFDOUIsU0FBUyxDQUNaLENBQUE7d0JBQ0wsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsSUFDSSxPQUFPLGFBQWEsS0FBSyxRQUFRO29CQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixLQUFLLE1BQU0sRUFDcEQsQ0FBQztvQkFDQyxJQUFJLENBQUMsY0FBYyxDQUNmLGFBQWEsRUFDYixPQUFPLFNBQVMsS0FBSyxRQUFRO3dCQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FDZCxTQUFTLEVBQ1QsUUFBUSxDQUFDLFlBQVksQ0FDeEI7d0JBQ0gsQ0FBQyxDQUFDLFNBQVMsRUFDZixRQUFRLENBQUMscUJBQXFCLEVBQzlCLFNBQVMsRUFDVCxTQUFTLENBQ1osQ0FBQTtnQkFDTCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVTLG1CQUFtQixDQUN6QixTQUFvQyxFQUNwQyxTQUE2QyxFQUM3QyxRQUF3QixFQUN4QixLQUFhLEVBQ2IsV0FBb0I7UUFFcEIsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFNO1FBRXRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDNUMsTUFBTSxhQUFhLEdBQUksU0FBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUN0RCxNQUFNLFlBQVksR0FBRyxXQUFXO2dCQUM1QixDQUFDLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxZQUFZO2dCQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFBO1lBQ2xCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDcEUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVE7Z0JBQ25CLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFFakUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLENBQUMsbUJBQW1CLENBQ3BCLGFBQWEsRUFDYixPQUFPLFNBQVMsS0FBSyxRQUFRO29CQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQztvQkFDbkQsQ0FBQyxDQUFDLFNBQVMsRUFDZixRQUFRLEVBQ1IsS0FBSyxFQUNMLFlBQVksQ0FDZixDQUFBO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLFNBQVMsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUM1RCxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUNoQixLQUFLLEVBQ0wsU0FBUyxDQUNaLENBQUE7Z0JBRUQsSUFDSSxhQUFhLEtBQUssSUFBSTtvQkFDdEIsT0FBTyxhQUFhLEtBQUssUUFBUSxFQUNuQyxDQUFDO29CQUNDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUNqRCxDQUFDLGFBQWEsRUFBRSxFQUFFO3dCQUNkLElBQUksc0JBQXNCLEdBQ3RCLFNBQVM7NEJBQ1QsR0FBRzs0QkFDSCxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQ2hELHNCQUFzQixHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDaEIsU0FBUyxFQUNULHNCQUFzQixDQUN6QixDQUFBO3dCQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUM3QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxzQkFBc0IsQ0FDbEQsQ0FBQTt3QkFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0NBQ1osSUFBSSxFQUFFLE1BQU07Z0NBQ1osTUFBTSxFQUFFLElBQUk7Z0NBQ1osS0FBSyxFQUFFLHNCQUFzQjtnQ0FDN0IsV0FBVyxFQUFFLFNBQVM7Z0NBQ3RCLFNBQVMsRUFBRSxTQUFTO2dDQUNwQixnQkFBZ0IsRUFBRSxhQUFhOzZCQUNsQyxDQUFDLENBQUE7d0JBQ04sQ0FBQzt3QkFFRCxJQUNJLFNBQVM7NEJBQ1QsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssUUFBUSxFQUM3QyxDQUFDOzRCQUNDLElBQUksQ0FBQyxXQUFXLENBQUUsYUFBYTs0QkFDM0IsU0FBUyxDQUNMLFlBQVksQ0FDVyxFQUMzQixRQUFRLENBQUMscUJBQXFCLEVBQzlCLFNBQVMsQ0FDWixDQUFBO3dCQUNMLENBQUM7b0JBQ0wsQ0FBQyxDQUNKLENBQUE7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNwQyxJQUFJLENBQUMsbUJBQW1CLENBQ3BCLGFBQWEsRUFDYixPQUFPLFNBQVMsS0FBSyxRQUFRO3dCQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FDZCxTQUFTLEVBQ1QsUUFBUSxDQUFDLFlBQVksQ0FDeEI7d0JBQ0gsQ0FBQyxDQUFDLFNBQVMsRUFDZixRQUFRLENBQUMscUJBQXFCLEVBQzlCLFNBQVMsRUFDVCxTQUFTLENBQ1osQ0FBQTtnQkFDTCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVTLFVBQVUsQ0FDaEIsS0FBNEIsRUFDNUIsUUFBd0IsRUFDeEIsS0FBYSxFQUNiLFdBQW9CO1FBRXBCLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDcEIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztnQkFBRSxTQUFRO1lBRXRDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQTtZQUNoRSxNQUFNLE1BQU0sR0FDUixRQUFRLENBQUMsZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDM0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2pFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVwRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUTtnQkFDOUIsTUFBTSxJQUFJLDJCQUEyQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUVqRSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksU0FBUyxHQUNULE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVE7b0JBQzFCLENBQUMsQ0FBRSxLQUFLLENBQUMsR0FBRyxDQUFTLENBQUMsU0FBUztvQkFDL0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDcEIsU0FBUztvQkFDTCxTQUFTLEtBQUssTUFBTTt3QkFDcEIsU0FBUyxLQUFLLE1BQU07d0JBQ3BCLFNBQVMsS0FBSyxDQUFDLENBQUM7d0JBQ1osQ0FBQyxDQUFDLE1BQU07d0JBQ1IsQ0FBQyxDQUFDLEtBQUssQ0FBQTtnQkFDZixJQUFJLEtBQUssR0FDTCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRO29CQUMxQixDQUFDLENBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBUyxDQUFDLEtBQUs7b0JBQzNCLENBQUMsQ0FBQyxTQUFTLENBQUE7Z0JBQ25CLEtBQUs7b0JBQ0QsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLE9BQU87d0JBQzVCLENBQUMsQ0FBQyxhQUFhO3dCQUNmLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssTUFBTTs0QkFDakMsQ0FBQyxDQUFDLFlBQVk7NEJBQ2QsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtnQkFFbkIsSUFBSSxTQUFTLEdBQUcsR0FBRyxLQUFLLElBQUksWUFBWSxFQUFFLENBQUE7Z0JBQzFDLElBQUksTUFBTSxDQUFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM3QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQ25DLENBQUE7b0JBQ0QsSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFFWixTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLEtBQUssRUFDTCxNQUFNLENBQUMsWUFBWSxDQUN0QixDQUFBO3dCQUNELFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO29CQUNuQyxDQUFDO3lCQUFNLENBQUM7d0JBQ0osU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFBO29CQUMxQyxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBRWhELENBQUM7aUJBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsVUFBVSxDQUNYLEtBQUssQ0FBQyxHQUFHLENBQTBCLEVBQ25DLFFBQVEsRUFDUixLQUFLLEVBQ0wsWUFBWSxDQUNmLENBQUE7WUFDTCxDQUFDO2lCQUFNLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0JBQzVELFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQ2hCLEtBQUssRUFDTCxTQUFTLENBQ1osQ0FBQTtnQkFLRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDN0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUNyQyxDQUFBO2dCQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzt3QkFDWixJQUFJLEVBQUUsTUFBTTt3QkFDWixNQUFNLEVBQUUsS0FBSzt3QkFDYixLQUFLLEVBQUUsU0FBUzt3QkFDaEIsV0FBVyxFQUFFLEtBQUs7d0JBQ2xCLFNBQVMsRUFBRSxTQUFTO3dCQUNwQixnQkFBZ0IsRUFBRSxRQUFRO3FCQUM3QixDQUFDLENBQUE7Z0JBQ04sQ0FBQztnQkFDRCxJQUFJLENBQUMsVUFBVSxDQUNYLEtBQUssQ0FBQyxHQUFHLENBQTBCLEVBQ25DLFFBQVEsQ0FBQyxxQkFBcUIsRUFDOUIsU0FBUyxDQUNaLENBQUE7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFUyxVQUFVLENBQ2hCLEtBQTRCLEVBQzVCLFFBQXdCLEVBQ3hCLEtBQWEsRUFDYixXQUFvQjtRQUVwQixJQUFJLFNBQVMsR0FBVyxFQUFFLENBQUE7UUFFMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsU0FBUztnQkFDTCxHQUFHO29CQUNILEtBQUs7eUJBQ0EsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7d0JBQ2YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNsQixTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssRUFDTCxXQUFXLENBQ2QsQ0FBQTtvQkFDTCxDQUFDLENBQUM7eUJBQ0QsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO3lCQUNsQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO3lCQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNqQixHQUFHLENBQUE7UUFDWCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksYUFBYSxHQUFhLEVBQUUsQ0FBQTtZQUNoQyxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNwQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUk7b0JBQUUsU0FBUTtnQkFFN0QsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO2dCQUNoRSxNQUFNLE1BQU0sR0FDUixRQUFRLENBQUMsZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQzNELE1BQU0sS0FBSyxHQUNQLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDdkQsTUFBTSxRQUFRLEdBQ1YsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUV2RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUTtvQkFDOUIsTUFBTSxJQUFJLDJCQUEyQixDQUNqQyxZQUFZLEVBQ1osUUFBUSxDQUNYLENBQUE7Z0JBRUwsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDVCxJQUFJLFNBQVMsR0FBRyxHQUFHLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQTtvQkFDMUMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUMzQyxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUE7b0JBQzFDLENBQUM7b0JBSUQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUMvQixJQUFJLGVBQWUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDOUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUE7b0JBQ3JDLENBQUM7b0JBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3JCLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQyxXQUFXLENBQy9DLE1BQU0sQ0FBQyxXQUFXLEVBQ2xCLGNBQWMsQ0FDakIsQ0FBQTtvQkFDTCxDQUFDO29CQUlELEVBQUU7b0JBc0JGLEVBQUU7b0JBUUYsYUFBYSxDQUFDLElBQUksQ0FDZCxJQUFJLENBQUMsOEJBQThCLENBQy9CLElBQUksQ0FBQywwQkFBMEIsQ0FDM0IsU0FBUyxFQUNULGNBQWMsQ0FDakIsQ0FDSixDQUVKLENBQUE7Z0JBSUwsQ0FBQztxQkFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQzdCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLFlBQVksQ0FDZixDQUFBO29CQUNELElBQUksU0FBUzt3QkFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUNoRCxDQUFDO3FCQUFNLElBQUksUUFBUSxFQUFFLENBQUM7b0JBR2xCLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ2pDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FDckMsQ0FBQTt3QkFDRCxJQUFJLGVBQWUsRUFBRSxDQUFDOzRCQUNsQixTQUFRO3dCQUNaLENBQUM7b0JBQ0wsQ0FBQztvQkFFRCxJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDN0MsSUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVU7NEJBQzlCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUNoQyxDQUFDOzRCQUNDLE1BQU0sV0FBVyxHQUNiLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQTs0QkFFOUMsTUFBTSxFQUFFLEdBQXNCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTs0QkFDN0MsSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQ0FDN0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7cUNBQ2hCLElBQUksQ0FDRCxRQUFRLENBQUMsYUFBYSxFQUN0QixRQUFRLENBQUMsYUFBYSxDQUN6QjtxQ0FDQSxLQUFLLENBQ0YsUUFBUSxDQUFDLFdBQVc7cUNBQ2YsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0NBQ1osT0FBTyxHQUNILFFBQVEsQ0FBQyxhQUNiLElBQ0ksTUFBTSxDQUFDLFlBQ1gsTUFBTSxLQUFLLElBQ1AsTUFBTSxDQUFDLGdCQUFpQjt5Q0FDbkIsWUFDVCxFQUFFLENBQUE7Z0NBQ04sQ0FBQyxDQUFDO3FDQUNELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDckIsQ0FBQTs0QkFDVCxDQUFDO2lDQUFNLElBQUksUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0NBQ3ZDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO3FDQUNoQixJQUFJLENBQ0QsUUFBUSxDQUFDLGVBQWdCLENBQUMsYUFBYSxFQUN2QyxRQUFRLENBQUMsZUFBZ0IsQ0FBQyxhQUFhLENBQzFDO3FDQUNBLEtBQUssQ0FDRixRQUFRO3FDQUNILGVBQWdCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUNwQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29DQUNQLE9BQU8sR0FDSCxRQUFRLENBQUMsZUFBZ0I7eUNBQ3BCLGFBQ1QsSUFDSSxNQUFNLENBQUMsWUFDWCxNQUFNLEtBQUssSUFDUCxNQUFNLENBQUMsZ0JBQWlCO3lDQUNuQixZQUNULEVBQUUsQ0FBQTtnQ0FDTixDQUFDLENBQ0o7cUNBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNyQixDQUFBOzRCQUNULENBQUM7aUNBQU0sSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Z0NBQzlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO3FDQUNoQixJQUFJLENBQ0QsUUFBUSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFDckMsUUFBUSxDQUFDLHFCQUFxQjtxQ0FDekIsU0FBUyxDQUNqQjtxQ0FDQSxLQUFLLENBQ0YsUUFBUTtxQ0FDSCxlQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQzdCLENBQUMsTUFBTSxFQUFFLEVBQUU7b0NBQ1AsT0FBTyxHQUNILFFBQVE7eUNBQ0gscUJBQXFCO3lDQUNyQixTQUNULElBQ0ksTUFBTSxDQUFDLFlBQ1gsTUFBTSxLQUFLLElBQ1AsTUFBTSxDQUFDLGdCQUFpQjt5Q0FDbkIsWUFDVCxFQUFFLENBQUE7Z0NBQ04sQ0FBQyxDQUNKO3FDQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDckIsQ0FBQTs0QkFDVCxDQUFDO2lDQUFNLENBQUM7Z0NBQ0osTUFBTSxJQUFJLEtBQUssQ0FDWCxzREFBc0QsQ0FDekQsQ0FBQTs0QkFDTCxDQUFDOzRCQUlELElBQUksQ0FBQyxRQUFRLENBQ1QsRUFBRSxDQUFDLE1BQU0sRUFBRTtnQ0FDUCxHQUFHO2dDQUNILFdBQVc7Z0NBQ1gsR0FBRztnQ0FDSCxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUNqQyxDQUFBO3dCQUNMLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixJQUNJLFFBQVEsQ0FBQyxXQUFXO2dDQUNwQixDQUFDLFFBQVEsQ0FBQyxVQUFVO29DQUNoQixRQUFRLENBQUMsZUFBZSxDQUFDLEVBQy9CLENBQUM7Z0NBQ0MsTUFBTSxTQUFTLEdBQUcsR0FBRyxLQUFLLElBQUksWUFBWSxFQUFFLENBQUE7Z0NBRTVDLGFBQWEsQ0FBQyxJQUFJLENBQ2QsSUFBSSxDQUFDLDhCQUE4QixDQUMvQixJQUFJLENBQUMsMEJBQTBCLENBQzNCLFNBQVMsRUFDVCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQ2IsQ0FDSixDQUNKLENBQUE7NEJBQ0wsQ0FBQztpQ0FBTSxDQUFDO2dDQUNKLE1BQU0sSUFBSSxLQUFLLENBQ1gsc0RBQXNELENBQ3pELENBQUE7NEJBQ0wsQ0FBQzt3QkFDTCxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFFSixJQUFJLFNBQVMsR0FDVCxLQUFLOzRCQUNMLEdBQUc7NEJBQ0gsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO3dCQUMzQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUNoQixLQUFLLEVBQ0wsU0FBUyxDQUNaLENBQUE7d0JBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzdCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FDckMsQ0FBQTt3QkFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0NBQ1osSUFBSSxFQUFFLE9BQU87Z0NBQ2IsTUFBTSxFQUFFLEtBQUs7Z0NBQ2IsU0FBUyxFQUFFLFNBQVM7Z0NBQ3BCLEtBQUssRUFBRSxTQUFTO2dDQUNoQixXQUFXLEVBQUUsS0FBSztnQ0FDbEIsZ0JBQWdCLEVBQUUsUUFBUTs2QkFDN0IsQ0FBQyxDQUFBO3dCQUNOLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTTtnQ0FDekIsU0FBUyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUE7d0JBQ2hDLENBQUM7d0JBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUNWLFFBQVEsQ0FBQyxxQkFBcUIsRUFDOUIsU0FBUyxDQUNaLENBQUE7d0JBQ0QsSUFBSSxTQUFTLEVBQUUsQ0FBQzs0QkFDWixhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO3dCQUVqQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7WUFDRCxTQUFTLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzQyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDcEIsQ0FBQztDQUNKLENBQUE7QUE5cElZLGtCQUFrQjtJQUQ5QixLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0dBQ3BCLGtCQUFrQixDQThwSTlCOztBQUVBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMseUZBQXlGIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4vdHJhbnNmb3JtZXIvUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXJcIlxuaW1wb3J0IHsgT2JqZWN0TGl0ZXJhbCB9IGZyb20gXCIuLi9jb21tb24vT2JqZWN0TGl0ZXJhbFwiXG5pbXBvcnQgeyBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yXCJcbmltcG9ydCB7IE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL05vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yXCJcbmltcG9ydCB7IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvclwiXG5pbXBvcnQgeyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL09wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3JcIlxuaW1wb3J0IHsgSm9pbkF0dHJpYnV0ZSB9IGZyb20gXCIuL0pvaW5BdHRyaWJ1dGVcIlxuaW1wb3J0IHsgUmVsYXRpb25JZEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWlkL1JlbGF0aW9uSWRBdHRyaWJ1dGVcIlxuaW1wb3J0IHsgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRBdHRyaWJ1dGVcIlxuaW1wb3J0IHsgUmVsYXRpb25JZExvYWRlciB9IGZyb20gXCIuL3JlbGF0aW9uLWlkL1JlbGF0aW9uSWRMb2FkZXJcIlxuaW1wb3J0IHsgUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lciB9IGZyb20gXCIuL3JlbGF0aW9uLWlkL1JlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXJcIlxuaW1wb3J0IHsgUmVsYXRpb25Db3VudExvYWRlciB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRMb2FkZXJcIlxuaW1wb3J0IHsgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lciB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXJcIlxuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCJcbi8qICovXG4vKiAqL1xuICBcbmltcG9ydCB7IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvclwiXG4vKiAqL1xuLyogKi9cbiAgXG5pbXBvcnQgeyBTZWxlY3RRdWVyeSB9IGZyb20gXCIuL1NlbGVjdFF1ZXJ5XCJcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCJcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0NvbHVtbk1ldGFkYXRhXCJcbmltcG9ydCB7IE9yZGVyQnlDb25kaXRpb24gfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL09yZGVyQnlDb25kaXRpb25cIlxuaW1wb3J0IHsgUXVlcnlFeHByZXNzaW9uTWFwIH0gZnJvbSBcIi4vUXVlcnlFeHByZXNzaW9uTWFwXCJcbmltcG9ydCB7IEVudGl0eVRhcmdldCB9IGZyb20gXCIuLi9jb21tb24vRW50aXR5VGFyZ2V0XCJcbmltcG9ydCB7IFF1ZXJ5UnVubmVyIH0gZnJvbSBcIi4uL3F1ZXJ5LXJ1bm5lci9RdWVyeVJ1bm5lclwiXG5pbXBvcnQgeyBXaGVyZUV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSBcIi4vV2hlcmVFeHByZXNzaW9uQnVpbGRlclwiXG5pbXBvcnQgeyBCcmFja2V0cyB9IGZyb20gXCIuL0JyYWNrZXRzXCJcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zIH0gZnJvbSBcIi4uL2NhY2hlL1F1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zXCJcbmltcG9ydCB7IE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL09mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yXCJcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlck9wdGlvbiB9IGZyb20gXCIuL1NlbGVjdFF1ZXJ5QnVpbGRlck9wdGlvblwiXG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuLi91dGlsL09iamVjdFV0aWxzXCJcbmltcG9ydCB7IERyaXZlclV0aWxzIH0gZnJvbSBcIi4uL2RyaXZlci9Ecml2ZXJVdGlsc1wiXG5pbXBvcnQgeyBFbnRpdHlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0VudGl0eU5vdEZvdW5kRXJyb3JcIlxuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCJcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucyB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE1hbnlPcHRpb25zXCJcbmltcG9ydCB7IEZpbmRPcHRpb25zU2VsZWN0IH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1NlbGVjdFwiXG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uTWV0YWRhdGFcIlxuaW1wb3J0IHsgRmluZE9wdGlvbnNPcmRlciB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiXG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1doZXJlXCJcbmltcG9ydCB7IEZpbmRPcHRpb25zVXRpbHMgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zVXRpbHNcIlxuaW1wb3J0IHsgRmluZE9wdGlvbnNSZWxhdGlvbnMgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zUmVsYXRpb25zXCJcbmltcG9ydCB7IEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMgfSBmcm9tIFwiLi4vdXRpbC9BcHBseVZhbHVlVHJhbnNmb3JtZXJzXCJcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIlxuaW1wb3J0IHsgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0VudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvclwiXG4vKiAqL1xuLyogKi9cbiAgXG5pbXBvcnQgeyBJbnN0YW5jZUNoZWNrZXIgfSBmcm9tIFwiLi4vdXRpbC9JbnN0YW5jZUNoZWNrZXJcIlxuaW1wb3J0IHsgQ0xBU1MgfSBmcm9tIFwidHlwZXNjcmlwdC1jbGFzcy1oZWxwZXJzL3dlYnNxbFwiXG5cbi8qKlxuICogQWxsb3dzIHRvIGJ1aWxkIGNvbXBsZXggc3FsIHF1ZXJpZXMgaW4gYSBmYXNoaW9uIHdheSBhbmQgZXhlY3V0ZSB0aG9zZSBxdWVyaWVzLlxuICovXG5AQ0xBU1MuTkFNRSgnU2VsZWN0UXVlcnlCdWlsZGVyJylcbmV4cG9ydCBjbGFzcyBTZWxlY3RRdWVyeUJ1aWxkZXI8RW50aXR5IGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD5cbiAgICBleHRlbmRzIFF1ZXJ5QnVpbGRlcjxFbnRpdHk+XG4gICAgaW1wbGVtZW50cyBXaGVyZUV4cHJlc3Npb25CdWlsZGVyXG57XG4gICAgcmVhZG9ubHkgXCJAaW5zdGFuY2VvZlwiID0gU3ltYm9sLmZvcihcIlNlbGVjdFF1ZXJ5QnVpbGRlclwiKVxuXG4gICAgcHJvdGVjdGVkIGZpbmRPcHRpb25zOiBGaW5kTWFueU9wdGlvbnMgPSB7fVxuICAgIHByb3RlY3RlZCBzZWxlY3RzOiBzdHJpbmdbXSA9IFtdXG4gICAgcHJvdGVjdGVkIGpvaW5zOiB7XG4gICAgICAgIHR5cGU6IFwiaW5uZXJcIiB8IFwibGVmdFwiXG4gICAgICAgIGFsaWFzOiBzdHJpbmdcbiAgICAgICAgcGFyZW50QWxpYXM6IHN0cmluZ1xuICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiBSZWxhdGlvbk1ldGFkYXRhXG4gICAgICAgIHNlbGVjdDogYm9vbGVhblxuICAgICAgICBzZWxlY3Rpb246IEZpbmRPcHRpb25zU2VsZWN0PGFueT4gfCB1bmRlZmluZWRcbiAgICB9W10gPSBbXVxuICAgIHByb3RlY3RlZCBjb25kaXRpb25zOiBzdHJpbmcgPSBcIlwiXG4gICAgcHJvdGVjdGVkIG9yZGVyQnlzOiB7XG4gICAgICAgIGFsaWFzOiBzdHJpbmdcbiAgICAgICAgZGlyZWN0aW9uOiBcIkFTQ1wiIHwgXCJERVNDXCJcbiAgICAgICAgbnVsbHM/OiBcIk5VTExTIEZJUlNUXCIgfCBcIk5VTExTIExBU1RcIlxuICAgIH1bXSA9IFtdXG4gICAgcHJvdGVjdGVkIHJlbGF0aW9uTWV0YWRhdGFzOiBSZWxhdGlvbk1ldGFkYXRhW10gPSBbXVxuXG5cblxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGdlbmVyYXRlZCBTUUwgcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJzIGJlaW5nIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzcWwgPSB0aGlzLmNyZWF0ZUNvbW1lbnQoKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVDdGVFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlU2VsZWN0RXhwcmVzc2lvbigpXG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUpvaW5FeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlV2hlcmVFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVIYXZpbmdFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlT3JkZXJCeUV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMaW1pdE9mZnNldEV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMb2NrRXhwcmVzc2lvbigpXG4gICAgICAgIHNxbCA9IHNxbC50cmltKClcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5zdWJRdWVyeSkgc3FsID0gXCIoXCIgKyBzcWwgKyBcIilcIlxuICAgICAgICByZXR1cm4gc3FsXG4gICAgfVxuXG5cblxuXG5cbiAgICBzZXRGaW5kT3B0aW9ucyhmaW5kT3B0aW9uczogRmluZE1hbnlPcHRpb25zPEVudGl0eT4pIHtcbiAgICAgICAgdGhpcy5maW5kT3B0aW9ucyA9IGZpbmRPcHRpb25zXG4gICAgICAgIHRoaXMuYXBwbHlGaW5kT3B0aW9ucygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN1YnF1ZXJ5IC0gcXVlcnkgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgb3RoZXIgcXVlcmllcy5cbiAgICAgKi9cbiAgICBzdWJRdWVyeSgpOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiB7XG4gICAgICAgIGNvbnN0IHFiID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICBxYi5leHByZXNzaW9uTWFwLnN1YlF1ZXJ5ID0gdHJ1ZVxuICAgICAgICBxYi5wYXJlbnRRdWVyeUJ1aWxkZXIgPSB0aGlzXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgU0VMRUNUIHF1ZXJ5LlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgc2VsZWN0KCk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgU0VMRUNUIHF1ZXJ5LlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgc2VsZWN0KFxuICAgICAgICBzZWxlY3Rpb246IChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBzZWxlY3Rpb25BbGlhc05hbWU/OiBzdHJpbmcsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChzZWxlY3Rpb246IHN0cmluZywgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChzZWxlY3Rpb246IHN0cmluZ1tdKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChcbiAgICAgICAgc2VsZWN0aW9uPzpcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIHNlbGVjdGlvbkFsaWFzTmFtZT86IHN0cmluZyxcbiAgICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8RW50aXR5PiB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInNlbGVjdFwiXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gc2VsZWN0aW9uLm1hcCgoc2VsZWN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gW1xuICAgICAgICAgICAgICAgIHsgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IHNlbGVjdGlvbiB0byB0aGUgU0VMRUNUIHF1ZXJ5LlxuICAgICAqL1xuICAgIGFkZFNlbGVjdChcbiAgICAgICAgc2VsZWN0aW9uOiAocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IHNlbGVjdGlvbiB0byB0aGUgU0VMRUNUIHF1ZXJ5LlxuICAgICAqL1xuICAgIGFkZFNlbGVjdChzZWxlY3Rpb246IHN0cmluZywgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgc2VsZWN0aW9uIHRvIHRoZSBTRUxFQ1QgcXVlcnkuXG4gICAgICovXG4gICAgYWRkU2VsZWN0KHNlbGVjdGlvbjogc3RyaW5nW10pOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBzZWxlY3Rpb24gdG8gdGhlIFNFTEVDVCBxdWVyeS5cbiAgICAgKi9cbiAgICBhZGRTZWxlY3QoXG4gICAgICAgIHNlbGVjdGlvbjpcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIHNlbGVjdGlvbkFsaWFzTmFtZT86IHN0cmluZyxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiB0aGlzXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5jb25jYXQoXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLm1hcCgoc2VsZWN0aW9uKSA9PiAoeyBzZWxlY3Rpb246IHNlbGVjdGlvbiB9KSksXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBleGVjdXRpb24gdGltZS5cbiAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgbWF4RXhlY3V0aW9uVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWF4RXhlY3V0aW9uVGltZSA9IG1pbGxpc2Vjb25kc1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIERJU1RJTkNULlxuICAgICAqL1xuICAgIGRpc3RpbmN0KGRpc3RpbmN0OiBib29sZWFuID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3QgPSBkaXN0aW5jdFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRpc3RpbmN0IG9uIGNsYXVzZSBmb3IgUG9zdGdyZXMuXG4gICAgICovXG4gICAgZGlzdGluY3RPbihkaXN0aW5jdE9uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3RPbiA9IGRpc3RpbmN0T25cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgZnJvbTxUIGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD4oXG4gICAgICAgIGVudGl0eVRhcmdldDogKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPlxuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEZST00gd2hpY2ggZW50aXR5J3MgdGFibGUgc2VsZWN0L3VwZGF0ZS9kZWxldGUgd2lsbCBiZSBleGVjdXRlZC5cbiAgICAgKiBBbHNvIHNldHMgYSBtYWluIHN0cmluZyBhbGlhcyBvZiB0aGUgc2VsZWN0aW9uIGRhdGEuXG4gICAgICogUmVtb3ZlcyBhbGwgcHJldmlvdXNseSBzZXQgZnJvbS1zLlxuICAgICAqL1xuICAgIGZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IEVudGl0eVRhcmdldDxUPixcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgZnJvbTxUIGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD4oXG4gICAgICAgIGVudGl0eVRhcmdldDpcbiAgICAgICAgICAgIHwgRW50aXR5VGFyZ2V0PFQ+XG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPiB7XG4gICAgICAgIGNvbnN0IG1haW5BbGlhcyA9IHRoaXMuY3JlYXRlRnJvbUFsaWFzKGVudGl0eVRhcmdldCwgYWxpYXNOYW1lKVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2V0TWFpbkFsaWFzKG1haW5BbGlhcylcbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgYW55IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIGFkZEZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhc05hbWU6IHN0cmluZyxcbiAgICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8VD5cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIGFkZEZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IEVudGl0eVRhcmdldDxUPixcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBhZGRGcm9tPFQgZXh0ZW5kcyBPYmplY3RMaXRlcmFsPihcbiAgICAgICAgZW50aXR5VGFyZ2V0OlxuICAgICAgICAgICAgfCBFbnRpdHlUYXJnZXQ8VD5cbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+IHtcbiAgICAgICAgY29uc3QgYWxpYXMgPSB0aGlzLmNyZWF0ZUZyb21BbGlhcyhlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSlcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNldE1haW5BbGlhcyhhbGlhcylcblxuICAgICAgICByZXR1cm4gdGhpcyBhcyBhbnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKSBnaXZlbiBzdWJxdWVyeS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW4oXG4gICAgICAgIHN1YlF1ZXJ5RmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIGVudGl0eSdzIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW4oXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmpvaW4oXCJJTk5FUlwiLCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKSBnaXZlbiBzdWJxdWVyeS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbihcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikgZW50aXR5J3MgdGFibGUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW4oXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luKFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW4oXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmpvaW4oXCJMRUZUXCIsIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC4uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICBzdWJRdWVyeUZhY3Rvcnk6IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyBwcm9wZXJ0eSBhbmQgYWRkcyBhbGwgc2VsZWN0aW9uIHByb3BlcnRpZXMgdG8gU0VMRUNULlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5IGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICBlbnRpdHk6IEZ1bmN0aW9uIHwgc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zIHRhYmxlIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBhbmQgYWRkcyBhbGwgc2VsZWN0aW9uIHByb3BlcnRpZXMgdG8gU0VMRUNULlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5T3JQcm9wZXJ0eTpcbiAgICAgICAgICAgIHwgRnVuY3Rpb25cbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKVxuICAgICAgICB0aGlzLmlubmVySm9pbihlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZ2l2ZW4gc3VicXVlcnkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC4uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHN1YlF1ZXJ5RmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZW50aXR5J3MgcHJvcGVydHkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBHaXZlbiBlbnRpdHkgcHJvcGVydHkgc2hvdWxkIGJlIGEgcmVsYXRpb24uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHRhYmxlIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5T3JQcm9wZXJ0eTpcbiAgICAgICAgICAgIHwgRnVuY3Rpb25cbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKVxuICAgICAgICB0aGlzLmxlZnRKb2luKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5J3MgcHJvcGVydHksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJJTk5FUlwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5J3MgcHJvcGVydHksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJJTk5FUlwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBzdWJRdWVyeUZhY3Rvcnk6IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGVudGl0eSdzIHByb3BlcnR5LCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGVudGl0eSdzIHRhYmxlLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBlbnRpdHk6IEZ1bmN0aW9uIHwgc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJMRUZUXCIsXG4gICAgICAgICAgICBlbnRpdHlPclByb3BlcnR5LFxuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgICAgbWFwVG9Qcm9wZXJ0eSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGdpdmVuIHN1YnF1ZXJ5LCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBHaXZlbiBlbnRpdHkgcHJvcGVydHkgc2hvdWxkIGJlIGEgcmVsYXRpb24uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkncyBwcm9wZXJ0eSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHRhYmxlLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBlbnRpdHlPclByb3BlcnR5OlxuICAgICAgICAgICAgfCBGdW5jdGlvblxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpXG4gICAgICAgIHRoaXMuam9pbihcbiAgICAgICAgICAgIFwiTEVGVFwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqL1xuXG5cbiAgICAvKipcbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqL1xuXG5cblxuXG5cblxuXG5cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IHsgZGlzYWJsZU1peGVkTWFwPzogYm9vbGVhbiB9LFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXNOYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgeyBkaXNhYmxlTWl4ZWRNYXA/OiBib29sZWFuIH0sXG4gICAgICAgIHF1ZXJ5QnVpbGRlckZhY3Rvcnk/OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uSWRBdHRyaWJ1dGUgPSBuZXcgUmVsYXRpb25JZEF0dHJpYnV0ZSh0aGlzLmV4cHJlc3Npb25NYXApXG4gICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHlcbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWVcbiAgICAgICAgaWYgKHR5cGVvZiBhbGlhc05hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICByZWxhdGlvbklkQXR0cmlidXRlLmFsaWFzID0gYWxpYXNOYW1lT3JPcHRpb25zXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBhbGlhc05hbWVPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIChhbGlhc05hbWVPck9wdGlvbnMgYXMgYW55KS5kaXNhYmxlTWl4ZWRNYXBcbiAgICAgICAgKVxuICAgICAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5kaXNhYmxlTWl4ZWRNYXAgPSB0cnVlXG5cbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5xdWVyeUJ1aWxkZXJGYWN0b3J5ID0gcXVlcnlCdWlsZGVyRmFjdG9yeVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucmVsYXRpb25JZEF0dHJpYnV0ZXMucHVzaChyZWxhdGlvbklkQXR0cmlidXRlKVxuXG4gICAgICAgIGlmIChyZWxhdGlvbklkQXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jcmVhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uSWRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvdW50cyBudW1iZXIgb2YgZW50aXRpZXMgb2YgZW50aXR5J3MgcmVsYXRpb24gYW5kIG1hcHMgdGhlIHZhbHVlIGludG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbG9hZFJlbGF0aW9uQ291bnRBbmRNYXAoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsaWFzTmFtZT86IHN0cmluZyxcbiAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeT86IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICApOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25Db3VudEF0dHJpYnV0ZSA9IG5ldyBSZWxhdGlvbkNvdW50QXR0cmlidXRlKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLFxuICAgICAgICApXG4gICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHlcbiAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWVcbiAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5hbGlhcyA9IGFsaWFzTmFtZVxuICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnF1ZXJ5QnVpbGRlckZhY3RvcnkgPSBxdWVyeUJ1aWxkZXJGYWN0b3J5XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcy5wdXNoKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUpXG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5qdW5jdGlvbkFsaWFzLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOlxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYWxsIHJlbGF0aW9uIGlkcyBmb3IgYWxsIHJlbGF0aW9ucyBvZiB0aGUgc2VsZWN0ZWQgZW50aXR5LlxuICAgICAqIEFsbCByZWxhdGlvbiBpZHMgd2lsbCBiZSBtYXBwZWQgdG8gcmVsYXRpb24gcHJvcGVydHkgdGhlbXNlbGYuXG4gICAgICogSWYgYXJyYXkgb2Ygc3RyaW5ncyBpcyBnaXZlbiB0aGVuIGxvYWRzIG9ubHkgcmVsYXRpb24gaWRzIG9mIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIGxvYWRBbGxSZWxhdGlvbklkcyhvcHRpb25zPzoge1xuICAgICAgICByZWxhdGlvbnM/OiBzdHJpbmdbXVxuICAgICAgICBkaXNhYmxlTWl4ZWRNYXA/OiBib29sZWFuXG4gICAgfSk6IHRoaXMge1xuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLnJlbGF0aW9ucy5mb3JFYWNoKChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVsYXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBvcHRpb25zLnJlbGF0aW9ucy5pbmRleE9mKHJlbGF0aW9uLnByb3BlcnR5UGF0aCkgPT09IC0xXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgICAgIHRoaXMubG9hZFJlbGF0aW9uSWRBbmRNYXAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSArXG4gICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBXSEVSRSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgV0hFUkUgY29uZGl0aW9ucy5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgd2hlcmUoXG4gICAgICAgIHdoZXJlOlxuICAgICAgICAgICAgfCBCcmFja2V0c1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogdGhpcykgPT4gc3RyaW5nKVxuICAgICAgICAgICAgfCBPYmplY3RMaXRlcmFsXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxbXSxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXSAvLyBkb24ndCBtb3ZlIHRoaXMgYmxvY2sgYmVsb3cgc2luY2UgY29tcHV0ZVdoZXJlUGFyYW1ldGVyIGNhbiBhZGQgd2hlcmUgZXhwcmVzc2lvbnNcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSlcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9LFxuICAgICAgICAgICAgXVxuICAgICAgICBpZiAocGFyYW1ldGVycykgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgYW5kV2hlcmUoXG4gICAgICAgIHdoZXJlOlxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgQnJhY2tldHNcbiAgICAgICAgICAgIHwgKChxYjogdGhpcykgPT4gc3RyaW5nKVxuICAgICAgICAgICAgfCBPYmplY3RMaXRlcmFsXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxbXSxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcImFuZFwiLFxuICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgb3JXaGVyZShcbiAgICAgICAgd2hlcmU6XG4gICAgICAgICAgICB8IEJyYWNrZXRzXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiB0aGlzKSA9PiBzdHJpbmcpXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxcbiAgICAgICAgICAgIHwgT2JqZWN0TGl0ZXJhbFtdLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3JcIixcbiAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSksXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKSB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIHdoZXJlSW5JZHMoaWRzOiBhbnkgfCBhbnlbXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIGFuZFdoZXJlSW5JZHMoaWRzOiBhbnkgfCBhbnlbXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmRXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBPUiBXSEVSRSB3aXRoIGNvbmRpdGlvbnMgZm9yIHRoZSBnaXZlbiBpZHMuXG4gICAgICpcbiAgICAgKiBJZHMgYXJlIG1peGVkLlxuICAgICAqIEl0IG1lYW5zIGlmIHlvdSBoYXZlIHNpbmdsZSBwcmltYXJ5IGtleSB5b3UgY2FuIHBhc3MgYSBzaW1wbGUgaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSBbMSwgMiwgM10uXG4gICAgICogSWYgeW91IGhhdmUgbXVsdGlwbGUgcHJpbWFyeSBrZXlzIHlvdSBuZWVkIHRvIHBhc3Mgb2JqZWN0IHdpdGggcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBzcGVjaWZpZWQsXG4gICAgICogZm9yIGV4YW1wbGUgW3sgZmlyc3RJZDogMSwgc2Vjb25kSWQ6IDIgfSwgeyBmaXJzdElkOiAyLCBzZWNvbmRJZDogMyB9LCAuLi5dXG4gICAgICovXG4gICAgb3JXaGVyZUluSWRzKGlkczogYW55IHwgYW55W10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEhBVklORyBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgSEFWSU5HIGNvbmRpdGlvbnMuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIGhhdmluZyhoYXZpbmc6IHN0cmluZywgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3MucHVzaCh7IHR5cGU6IFwic2ltcGxlXCIsIGNvbmRpdGlvbjogaGF2aW5nIH0pXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKSB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgSEFWSU5HIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgYW5kSGF2aW5nKGhhdmluZzogc3RyaW5nLCBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiBoYXZpbmcgfSlcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIG9ySGF2aW5nKGhhdmluZzogc3RyaW5nLCBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJvclwiLCBjb25kaXRpb246IGhhdmluZyB9KVxuICAgICAgICBpZiAocGFyYW1ldGVycykgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoZ3JvdXBCeTogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoZ3JvdXBCeT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzID0gW2dyb3VwQnldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgYWRkR3JvdXBCeShncm91cEJ5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLnB1c2goZ3JvdXBCeSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIG9yZGVyIGJ5IHdpdGhvdXQgb3JkZXIgc2V0IHdpbGwgcmVtb3ZlIGFsbCBwcmV2aW91c2x5IHNldCBvcmRlciBieXMuXG4gICAgICovXG4gICAgb3JkZXJCeSgpOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgb3JkZXJCeShcbiAgICAgICAgc29ydDogc3RyaW5nLFxuICAgICAgICBvcmRlcj86IFwiQVNDXCIgfCBcIkRFU0NcIixcbiAgICAgICAgbnVsbHM/OiBcIk5VTExTIEZJUlNUXCIgfCBcIk5VTExTIExBU1RcIixcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgb3JkZXJCeShvcmRlcjogT3JkZXJCeUNvbmRpdGlvbik6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIFNldHMgT1JERVIgQlkgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBPUkRFUiBCWSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgT1JERVIgQlkgY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBvcmRlckJ5KFxuICAgICAgICBzb3J0Pzogc3RyaW5nIHwgT3JkZXJCeUNvbmRpdGlvbixcbiAgICAgICAgb3JkZXI6IFwiQVNDXCIgfCBcIkRFU0NcIiA9IFwiQVNDXCIsXG4gICAgICAgIG51bGxzPzogXCJOVUxMUyBGSVJTVFwiIHwgXCJOVUxMUyBMQVNUXCIsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yZGVyICE9PSBcIkFTQ1wiICYmIG9yZGVyICE9PSBcIkRFU0NcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFNlbGVjdFF1ZXJ5QnVpbGRlci5hZGRPcmRlckJ5IFwib3JkZXJcIiBjYW4gYWNjZXB0IG9ubHkgXCJBU0NcIiBhbmQgXCJERVNDXCIgdmFsdWVzLmAsXG4gICAgICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGxzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG51bGxzICE9PSBcIk5VTExTIEZJUlNUXCIgJiZcbiAgICAgICAgICAgIG51bGxzICE9PSBcIk5VTExTIExBU1RcIlxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIGBTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcIm51bGxzXCIgY2FuIGFjY2VwdCBvbmx5IFwiTlVMTFMgRklSU1RcIiBhbmQgXCJOVUxMUyBMQVNUXCIgdmFsdWVzLmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc29ydCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHNvcnQgYXMgT3JkZXJCeUNvbmRpdGlvblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnQgYXMgc3RyaW5nXTogeyBvcmRlciwgbnVsbHMgfSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHsgW3NvcnQgYXMgc3RyaW5nXTogb3JkZXIgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKi9cbiAgICBhZGRPcmRlckJ5KFxuICAgICAgICBzb3J0OiBzdHJpbmcsXG4gICAgICAgIG9yZGVyOiBcIkFTQ1wiIHwgXCJERVNDXCIgPSBcIkFTQ1wiLFxuICAgICAgICBudWxscz86IFwiTlVMTFMgRklSU1RcIiB8IFwiTlVMTFMgTEFTVFwiLFxuICAgICk6IHRoaXMge1xuICAgICAgICBpZiAob3JkZXIgIT09IHVuZGVmaW5lZCAmJiBvcmRlciAhPT0gXCJBU0NcIiAmJiBvcmRlciAhPT0gXCJERVNDXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIGBTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcIm9yZGVyXCIgY2FuIGFjY2VwdCBvbmx5IFwiQVNDXCIgYW5kIFwiREVTQ1wiIHZhbHVlcy5gLFxuICAgICAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBudWxscyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBudWxscyAhPT0gXCJOVUxMUyBGSVJTVFwiICYmXG4gICAgICAgICAgICBudWxscyAhPT0gXCJOVUxMUyBMQVNUXCJcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgU2VsZWN0UXVlcnlCdWlsZGVyLmFkZE9yZGVyQnkgXCJudWxsc1wiIGNhbiBhY2NlcHQgb25seSBcIk5VTExTIEZJUlNUXCIgYW5kIFwiTlVMTFMgTEFTVFwiIHZhbHVlcy5gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIGlmIChudWxscykge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzW3NvcnRdID0geyBvcmRlciwgbnVsbHMgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzW3NvcnRdID0gb3JkZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCdzIExJTUlUIC0gbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHRha2UgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgbGltaXQobGltaXQ/OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0ID0gdGhpcy5ub3JtYWxpemVOdW1iZXIobGltaXQpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAubGltaXQpXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwibGltaXRcIiB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgbnVtZXJpYyB2YWx1ZS5gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0J3MgT0ZGU0VUIC0gc2VsZWN0aW9uIG9mZnNldC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHNraXAgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgb2Zmc2V0KG9mZnNldD86IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub2Zmc2V0ID0gdGhpcy5ub3JtYWxpemVOdW1iZXIob2Zmc2V0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub2Zmc2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGlzTmFOKHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQpXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwib2Zmc2V0XCIgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIG51bWVyaWMgdmFsdWUuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbWF4aW1hbCBudW1iZXIgb2YgZW50aXRpZXMgdG8gdGFrZS5cbiAgICAgKi9cbiAgICB0YWtlKHRha2U/OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnRha2UgPSB0aGlzLm5vcm1hbGl6ZU51bWJlcih0YWtlKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudGFrZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAudGFrZSlcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgXCJ0YWtlXCIgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIG51bWVyaWMgdmFsdWUuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHNraXAuXG4gICAgICovXG4gICAgc2tpcChza2lwPzogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5za2lwID0gdGhpcy5ub3JtYWxpemVOdW1iZXIoc2tpcClcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNraXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgaXNOYU4odGhpcy5leHByZXNzaW9uTWFwLnNraXApXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwic2tpcFwiIHZhbHVlIGlzIG5vdCBhIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBudW1lcmljIHZhbHVlLmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgY2VydGFpbiBpbmRleCB0byBiZSB1c2VkIGJ5IHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBOYW1lIG9mIGluZGV4IHRvIGJlIHVzZWQuXG4gICAgICovXG4gICAgdXNlSW5kZXgoaW5kZXg6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlSW5kZXggPSBpbmRleFxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhsb2NrTW9kZTogXCJvcHRpbWlzdGljXCIsIGxvY2tWZXJzaW9uOiBudW1iZXIgfCBEYXRlKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhcbiAgICAgICAgbG9ja01vZGU6XG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfcmVhZFwiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfd3JpdGVcIlxuICAgICAgICAgICAgfCBcImRpcnR5X3JlYWRcIlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiBhbmQgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgYXJlIGRlcHJlY2F0ZWQgYW5kXG4gICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG5cbiAgICAgICAgICAgICAgICBVc2Ugc2V0T25Mb2NrZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIlxuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIlxuICAgICAgICAgICAgfCBcImZvcl9ub19rZXlfdXBkYXRlXCJcbiAgICAgICAgICAgIHwgXCJmb3Jfa2V5X3NoYXJlXCIsXG4gICAgICAgIGxvY2tWZXJzaW9uPzogdW5kZWZpbmVkLFxuICAgICAgICBsb2NrVGFibGVzPzogc3RyaW5nW10sXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhcbiAgICAgICAgbG9ja01vZGU6XG4gICAgICAgICAgICB8IFwib3B0aW1pc3RpY1wiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfcmVhZFwiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfd3JpdGVcIlxuICAgICAgICAgICAgfCBcImRpcnR5X3JlYWRcIlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiBhbmQgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgYXJlIGRlcHJlY2F0ZWQgYW5kXG4gICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG5cbiAgICAgICAgICAgICAgICBVc2Ugc2V0T25Mb2NrZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIlxuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIlxuICAgICAgICAgICAgfCBcImZvcl9ub19rZXlfdXBkYXRlXCJcbiAgICAgICAgICAgIHwgXCJmb3Jfa2V5X3NoYXJlXCIsXG4gICAgICAgIGxvY2tWZXJzaW9uPzogbnVtYmVyIHwgRGF0ZSxcbiAgICAgICAgbG9ja1RhYmxlcz86IHN0cmluZ1tdLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPSBsb2NrTW9kZVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gPSBsb2NrVmVyc2lvblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcyA9IGxvY2tUYWJsZXNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGxvY2sgaGFuZGxpbmcgYnkgYWRkaW5nIE5PIFdBSVQgb3IgU0tJUCBMT0NLRUQuXG4gICAgICovXG4gICAgc2V0T25Mb2NrZWQob25Mb2NrZWQ6IFwibm93YWl0XCIgfCBcInNraXBfbG9ja2VkXCIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9uTG9ja2VkID0gb25Mb2NrZWRcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgZ2xvYmFsIGNvbmRpdGlvbiBvZiBcIm5vbi1kZWxldGVkXCIgZm9yIHRoZSBlbnRpdHkgd2l0aCBkZWxldGUgZGF0ZSBjb2x1bW5zLlxuICAgICAqL1xuICAgIHdpdGhEZWxldGVkKCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2l0aERlbGV0ZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaXJzdCByYXcgcmVzdWx0IHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmF3T25lPFQgPSBhbnk+KCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0UmF3TWFueSgpKVswXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHJhdyByZXN1bHRzIHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmF3TWFueTxUID0gYW55PigpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKClcblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZVxuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG5cblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAocm9sbGJhY2tFcnJvcikge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpIHtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc3FsIGdlbmVyYXRlZCBieSBxdWVyeSBidWlsZGVyIGFuZCByZXR1cm5zIG9iamVjdCB3aXRoIHJhdyByZXN1bHRzIGFuZCBlbnRpdGllcyBjcmVhdGVkIGZyb20gdGhlbS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRSYXdBbmRFbnRpdGllczxUID0gYW55PigpOiBQcm9taXNlPHtcbiAgICAgICAgZW50aXRpZXM6IEVudGl0eVtdXG4gICAgICAgIHJhdzogVFtdXG4gICAgfT4ge1xuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUVudGl0aWVzQW5kUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcilcblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBzaW5nbGUgZW50aXR5IHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0T25lKCk6IFByb21pc2U8RW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRSYXdBbmRFbnRpdGllcygpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHMuZW50aXRpZXNbMF0gYXMgYW55XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwib3B0aW1pc3RpY1wiICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsVmVyc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4hLmdldEVudGl0eVZhbHVlKHJlc3VsdCkgLy8gd2hhdCBpZiBjb2x1bW5zIGFyZW50IHNldD9cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFZlcnNpb24uZ2V0VGltZSgpICE9PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24uZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFZlcnNpb24gPVxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS52ZXJzaW9uQ29sdW1uIS5nZXRFbnRpdHlWYWx1ZShyZXN1bHQpIC8vIHdoYXQgaWYgY29sdW1ucyBhcmVudCBzZXQ/XG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbFZlcnNpb24gIT09IHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrVmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbnRpdHkgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbCBvciByZWplY3RzIHRoZSByZXR1cm5lZCBwcm9taXNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGdldE9uZU9yRmFpbCgpOiBQcm9taXNlPEVudGl0eT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBhd2FpdCB0aGlzLmdldE9uZSgpXG5cbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlOb3RGb3VuZEVycm9yKFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLnRhcmdldCxcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudGl0eVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZW50aXRpZXMgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRNYW55KCk6IFByb21pc2U8RW50aXR5W10+IHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2V0UmF3QW5kRW50aXRpZXMoKVxuICAgICAgICByZXR1cm4gcmVzdWx0cy5lbnRpdGllc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY291bnQgLSBudW1iZXIgb2YgZW50aXRpZXMgc2VsZWN0ZWQgYnkgc3FsIGdlbmVyYXRlZCBieSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQ291bnQgZXhjbHVkZXMgYWxsIGxpbWl0YXRpb25zIHNldCBieSBzZXRGaXJzdFJlc3VsdCBhbmQgc2V0TWF4UmVzdWx0cyBtZXRob2RzIGNhbGwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q291bnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpXG5cbiAgICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKClcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXM6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKVxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeUVudGl0eSA9IGZhbHNlXG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjdXRlQ291bnRRdWVyeShxdWVyeVJ1bm5lcilcblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYnVpbHQgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIGVudGl0aWVzIGFuZCBvdmVyYWxsIGVudGl0aWVzIGNvdW50ICh3aXRob3V0IGxpbWl0YXRpb24pLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBidWlsZCBwYWdpbmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldE1hbnlBbmRDb3VudCgpOiBQcm9taXNlPFtFbnRpdHlbXSwgbnVtYmVyXT4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKClcblxuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgZW50aXRpZXNBbmRSYXcgPSBhd2FpdCB0aGlzLmV4ZWN1dGVFbnRpdGllc0FuZFJhd1Jlc3VsdHMoXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZVxuICAgICAgICAgICAgY29uc3QgY2FjaGVJZCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUlkXG5cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSBjYWNoZUlkID8gYCR7Y2FjaGVJZH0tY291bnRgIDogY2FjaGVJZFxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVDb3VudFF1ZXJ5KHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogW0VudGl0eVtdLCBudW1iZXJdID0gW2VudGl0aWVzQW5kUmF3LmVudGl0aWVzLCBjb3VudF1cblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gIFxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZy5cbiAgICAgKi9cbiAgICBjYWNoZShlbmFibGVkOiBib29sZWFuKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZyBhbmQgc2V0cyBpbiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggY2FjaGUgd2lsbCBleHBpcmUuXG4gICAgICogSWYgbm90IHNldCB0aGVuIGdsb2JhbCBjYWNoaW5nIHRpbWUgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGNhY2hlKG1pbGxpc2Vjb25kczogbnVtYmVyKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZyBhbmQgc2V0cyBjYWNoZSBpZCBhbmQgbWlsbGlzZWNvbmRzIGluIHdoaWNoIGNhY2hlIHdpbGwgZXhwaXJlLlxuICAgICAqL1xuICAgIGNhY2hlKGlkOiBhbnksIG1pbGxpc2Vjb25kcz86IG51bWJlcik6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcXVlcnkgcmVzdWx0IGNhY2hpbmcuXG4gICAgICovXG4gICAgY2FjaGUoXG4gICAgICAgIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ6IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcsXG4gICAgICAgIG1heWJlTWlsbGlzZWNvbmRzPzogbnVtYmVyLFxuICAgICk6IHRoaXMge1xuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgPSBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uID0gZW5hYmxlZE9yTWlsbGlzZWNvbmRzT3JJZFxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkID09PSBcIm51bWJlclwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF5YmVNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uID0gbWF5YmVNaWxsaXNlY29uZHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBleHRyYSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGhvdyBxdWVyeSBidWlsZGVyIHdvcmtzLlxuICAgICAqL1xuICAgIHNldE9wdGlvbihvcHRpb246IFNlbGVjdFF1ZXJ5QnVpbGRlck9wdGlvbik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cblxuXG5cblxuICAgIHByb3RlY3RlZCBqb2luKFxuICAgICAgICBkaXJlY3Rpb246IFwiSU5ORVJcIiB8IFwiTEVGVFwiLFxuICAgICAgICBlbnRpdHlPclByb3BlcnR5OlxuICAgICAgICAgICAgfCBGdW5jdGlvblxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgICAgIG1hcFRvUHJvcGVydHk/OiBzdHJpbmcsXG4gICAgICAgIGlzTWFwcGluZ01hbnk/OiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyB8fCB7fSlcblxuICAgICAgICBjb25zdCBqb2luQXR0cmlidXRlID0gbmV3IEpvaW5BdHRyaWJ1dGUoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAsXG4gICAgICAgIClcbiAgICAgICAgam9pbkF0dHJpYnV0ZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cbiAgICAgICAgam9pbkF0dHJpYnV0ZS5tYXBUb1Byb3BlcnR5ID0gbWFwVG9Qcm9wZXJ0eVxuICAgICAgICBqb2luQXR0cmlidXRlLmlzTWFwcGluZ01hbnkgPSBpc01hcHBpbmdNYW55XG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuZW50aXR5T3JQcm9wZXJ0eSA9IGVudGl0eU9yUHJvcGVydHkgLy8gcmVsYXRpb25OYW1lXG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uID0gY29uZGl0aW9uID8gY29uZGl0aW9uIDogdW5kZWZpbmVkIC8vIGpvaW5JbnZlcnNlU2lkZUNvbmRpdGlvblxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5wdXNoKGpvaW5BdHRyaWJ1dGUpXG5cbiAgICAgICAgaWYgKGpvaW5BdHRyaWJ1dGUubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLm1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5leHByZXNzaW9uTWFwLndpdGhEZWxldGVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25EZWxldGVDb2x1bW4gPSBgJHthbGlhc05hbWV9LiR7am9pbkF0dHJpYnV0ZS5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZX0gSVMgTlVMTGBcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLmNvbmRpdGlvbiA9IGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gYCAke2pvaW5BdHRyaWJ1dGUuY29uZGl0aW9ufSBBTkQgJHtjb25kaXRpb25EZWxldGVDb2x1bW59YFxuICAgICAgICAgICAgICAgICAgICA6IGAke2NvbmRpdGlvbkRlbGV0ZUNvbHVtbn1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpvaW5BdHRyaWJ1dGUuYWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuY3JlYXRlQWxpYXMoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiam9pblwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogam9pbkF0dHJpYnV0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgam9pbkF0dHJpYnV0ZS5yZWxhdGlvbiAmJlxuICAgICAgICAgICAgICAgIGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJqb2luXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGpvaW5BdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN1YlF1ZXJ5OiBzdHJpbmcgPSBcIlwiXG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudGl0eU9yUHJvcGVydHkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5QnVpbGRlcjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4gPSAoXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9yUHJvcGVydHkgYXMgYW55XG4gICAgICAgICAgICAgICAgKSgodGhpcyBhcyBhbnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLnN1YlF1ZXJ5KCkpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICAgICAgc3ViUXVlcnkgPSBzdWJRdWVyeUJ1aWxkZXIuZ2V0UXVlcnkoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJRdWVyeSA9IGVudGl0eU9yUHJvcGVydHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzU3ViUXVlcnkgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbnRpdHlPclByb3BlcnR5ID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAoZW50aXR5T3JQcm9wZXJ0eS5zdWJzdHIoMCwgMSkgPT09IFwiKFwiICYmXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9yUHJvcGVydHkuc3Vic3RyKC0xKSA9PT0gXCIpXCIpXG4gICAgICAgICAgICBqb2luQXR0cmlidXRlLmFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImpvaW5cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgdGFibGVQYXRoOlxuICAgICAgICAgICAgICAgICAgICBpc1N1YlF1ZXJ5ID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoZW50aXR5T3JQcm9wZXJ0eSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdWJRdWVyeTogaXNTdWJRdWVyeSA9PT0gdHJ1ZSA/IHN1YlF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJTRUxFQ1QgRlJPTVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVTZWxlY3RFeHByZXNzaW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2Fubm90IGJ1aWxkIHF1ZXJ5IGJlY2F1c2UgbWFpbiBhbGlhcyBpcyBub3Qgc2V0IChjYWxsIHFiI2Zyb20gbWV0aG9kKVwiLFxuICAgICAgICAgICAgKVxuXG5cblxuICAgICAgICBjb25zdCBhbGxTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cbiAgICAgICAgY29uc3QgZXhjbHVkZWRTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBhbGxTZWxlY3RzLnB1c2goXG4gICAgICAgICAgICAgICAgLi4udGhpcy5idWlsZEVzY2FwZWRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaChcbiAgICAgICAgICAgICAgICAuLi50aGlzLmZpbmRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5mb3JFYWNoKChqb2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoam9pbi5tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5idWlsZEVzY2FwZWRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcy5uYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkU2VsZWN0cy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmZpbmRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcy5uYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNNYWluQWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0KSA9PiBzZWxlY3Quc2VsZWN0aW9uID09PSBqb2luLmFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChoYXNNYWluQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5lc2NhcGUoam9pbi5hbGlhcy5uYW1lISkgKyBcIi4qXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkU2VsZWN0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+IHNlbGVjdC5zZWxlY3Rpb24gPT09IGpvaW4uYWxpYXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaChleGNsdWRlZFNlbGVjdCEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHNcbiAgICAgICAgICAgIC5maWx0ZXIoKHNlbGVjdCkgPT4gZXhjbHVkZWRTZWxlY3RzLmluZGV4T2Yoc2VsZWN0KSA9PT0gLTEpXG4gICAgICAgICAgICAuZm9yRWFjaCgoc2VsZWN0KSA9PlxuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhzZWxlY3Quc2VsZWN0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3QuYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuXG5cbiAgICAgICAgaWYgKGFsbFNlbGVjdHMubGVuZ3RoID09PSAwKSBhbGxTZWxlY3RzLnB1c2goeyBzZWxlY3Rpb246IFwiKlwiIH0pXG5cblxuICAgICAgICBsZXQgdXNlSW5kZXg6IHN0cmluZyA9IFwiXCJcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleCkge1xuICAgICAgICAgICAgaWYgKERyaXZlclV0aWxzLmlzTXlTUUxGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICB1c2VJbmRleCA9IGAgVVNFIElOREVYICgke3RoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleH0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBmcm9tcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc2VzXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChhbGlhcykgPT5cbiAgICAgICAgICAgICAgICAgICAgYWxpYXMudHlwZSA9PT0gXCJmcm9tXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFsaWFzLnRhYmxlUGF0aCB8fCBhbGlhcy5zdWJRdWVyeSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChhbGlhcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGlhcy5zdWJRdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzLnN1YlF1ZXJ5ICsgXCIgXCIgKyB0aGlzLmVzY2FwZShhbGlhcy5uYW1lKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZU5hbWUoYWxpYXMudGFibGVQYXRoISkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGFsaWFzLm5hbWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzZWxlY3QgPSB0aGlzLmNyZWF0ZVNlbGVjdERpc3RpbmN0RXhwcmVzc2lvbigpXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGFsbFNlbGVjdHNcbiAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKHNlbGVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3QuYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiIEFTIFwiICsgdGhpcy5lc2NhcGUoc2VsZWN0LmFsaWFzTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNlbGVjdCArXG4gICAgICAgICAgICBzZWxlY3Rpb24gK1xuICAgICAgICAgICAgXCIgRlJPTSBcIiArXG4gICAgICAgICAgICBmcm9tcy5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVUYWJsZUxvY2tFeHByZXNzaW9uKCkgK1xuICAgICAgICAgICAgdXNlSW5kZXhcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc2VsZWN0IHwgc2VsZWN0IGRpc3RpbmN0IHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVTZWxlY3REaXN0aW5jdEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyBzZWxlY3REaXN0aW5jdCwgc2VsZWN0RGlzdGluY3RPbiwgbWF4RXhlY3V0aW9uVGltZSB9ID1cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcFxuICAgICAgICBjb25zdCB7IGRyaXZlciB9ID0gdGhpcy5jb25uZWN0aW9uXG5cbiAgICAgICAgbGV0IHNlbGVjdCA9IFwiU0VMRUNUIFwiXG5cbiAgICAgICAgaWYgKG1heEV4ZWN1dGlvblRpbWUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ICs9IGAvKisgTUFYX0VYRUNVVElPTl9USU1FKCR7dGhpcy5leHByZXNzaW9uTWFwLm1heEV4ZWN1dGlvblRpbWV9KSAqLyBgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikgJiZcbiAgICAgICAgICAgIHNlbGVjdERpc3RpbmN0T24ubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdERpc3RpbmN0T25NYXAgPSBzZWxlY3REaXN0aW5jdE9uXG4gICAgICAgICAgICAgICAgLm1hcCgob24pID0+IHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMob24pKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIilcblxuICAgICAgICAgICAgc2VsZWN0ID0gYFNFTEVDVCBESVNUSU5DVCBPTiAoJHtzZWxlY3REaXN0aW5jdE9uTWFwfSkgYFxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdERpc3RpbmN0KSB7XG4gICAgICAgICAgICBzZWxlY3QgPSBcIlNFTEVDVCBESVNUSU5DVCBcIlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJKT0lOXCIgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUpvaW5FeHByZXNzaW9uKCk6IHN0cmluZyB7XG5cblxuXG5cblxuXG5cblxuICAgICAgICBjb25zdCBqb2lucyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5tYXAoKGpvaW5BdHRyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IGpvaW5BdHRyLnJlbGF0aW9uXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblRhYmxlTmFtZSA9IGpvaW5BdHRyLnRhYmxlUGF0aFxuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25UYWJsZUFsaWFzID0gam9pbkF0dHIuYWxpYXMubmFtZVxuICAgICAgICAgICAgbGV0IGFwcGVuZGVkQ29uZGl0aW9uID0gam9pbkF0dHIuY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgPyBcIiBBTkQgKFwiICsgam9pbkF0dHIuY29uZGl0aW9uICsgXCIpXCJcbiAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEFsaWFzID0gam9pbkF0dHIucGFyZW50QWxpYXNcblxuXG5cbiAgICAgICAgICAgIGlmICghcGFyZW50QWxpYXMgfHwgIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Kb2luID0gam9pbkF0dHIuYWxpYXMuc3ViUXVlcnlcbiAgICAgICAgICAgICAgICAgICAgPyBqb2luQXR0ci5hbGlhcy5zdWJRdWVyeVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0VGFibGVOYW1lKGRlc3RpbmF0aW9uVGFibGVOYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgam9pbkF0dHIuZGlyZWN0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgXCIgSk9JTiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uSm9pbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgKGpvaW5BdHRyLmNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIiBPTiBcIiArIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoam9pbkF0dHIuY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNNYW55VG9PbmUgfHwgcmVsYXRpb24uaXNPbmVUb09uZU93bmVyKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChqb2luQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BdHRyLmRpcmVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIEpPSU4gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGRlc3RpbmF0aW9uVGFibGVBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlTG9ja0V4cHJlc3Npb24oKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9OIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLmlzT25lVG9NYW55IHx8IHJlbGF0aW9uLmlzT25lVG9PbmVOb3RPd25lcikge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uID0gcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKChqb2luQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnRpdHktY2hpbGRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZENvbmRpdGlvbiArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBBTkQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpc2NyaW1pbmF0b3JDb2x1bW4uZGF0YWJhc2VOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlzY3JpbWluYXRvclZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hLnByb3BlcnR5UGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BdHRyLmRpcmVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIEpPSU4gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGRlc3RpbmF0aW9uVGFibGVBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlTG9ja0V4cHJlc3Npb24oKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9OIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgY29uc3QganVuY3Rpb25UYWJsZU5hbWUgPVxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhIS50YWJsZVBhdGhcblxuICAgICAgICAgICAgICAgIGNvbnN0IGp1bmN0aW9uQWxpYXMgPSBqb2luQXR0ci5qdW5jdGlvbkFsaWFzXG4gICAgICAgICAgICAgICAgbGV0IGp1bmN0aW9uQ29uZGl0aW9uID0gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSBcIlwiXG5cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAganVuY3Rpb25Db25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoam9pbkNvbHVtbikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuY3Rpb25BbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEFsaWFzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGpvaW5Db2x1bW4pID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIEFORCBcIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkNvbmRpdGlvbiA9IHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW52ZXJzZVJlbGF0aW9uIS5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqb2luQ29sdW1uKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5wcm9wZXJ0eVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKChqb2luQ29sdW1uKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkFsaWFzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICBqb2luQXR0ci5kaXJlY3Rpb24gK1xuICAgICAgICAgICAgICAgICAgICBcIiBKT0lOIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZU5hbWUoanVuY3Rpb25UYWJsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShqdW5jdGlvbkFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgT04gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGp1bmN0aW9uQ29uZGl0aW9uKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgam9pbkF0dHIuZGlyZWN0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgXCIgSk9JTiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVOYW1lKGRlc3RpbmF0aW9uVGFibGVOYW1lKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgT04gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gam9pbnMuam9pbihcIiBcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiR1JPVVAgQllcIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIFwiIEdST1VQIEJZIFwiICtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXModGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLmpvaW4oXCIsIFwiKSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJPUkRFUiBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVPcmRlckJ5RXhwcmVzc2lvbigpIHtcbiAgICAgICAgY29uc3Qgb3JkZXJCeXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxsT3JkZXJCeXNcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yZGVyQnlzKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBcIiBPUkRFUiBCWSBcIiArXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3JkZXJCeXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbk5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JkZXJCeXNbY29sdW1uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGNvbHVtbk5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckJ5c1tjb2x1bW5OYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZGVyQnlzW2NvbHVtbk5hbWVdIGFzIGFueSkub3JkZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmRlckJ5c1tjb2x1bW5OYW1lXSBhcyBhbnkpLm51bGxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTElNSVRcIiBhbmQgXCJPRkZTRVRcIiBwYXJ0cyBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUxpbWl0T2Zmc2V0RXhwcmVzc2lvbigpOiBzdHJpbmcge1xuXG5cbiAgICAgICAgbGV0IG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdGhpcy5leHByZXNzaW9uTWFwLm9mZnNldCxcbiAgICAgICAgICAgIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB0aGlzLmV4cHJlc3Npb25NYXAubGltaXRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW9mZnNldCAmJlxuICAgICAgICAgICAgIWxpbWl0ICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNraXBcbiAgICAgICAgICAgIGxpbWl0ID0gdGhpcy5leHByZXNzaW9uTWFwLnRha2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG5cblxuXG5cblxuICAgICAgICAgICAgbGV0IHByZWZpeCA9IFwiXCJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobGltaXQgfHwgb2Zmc2V0KSAmJlxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZXhwcmVzc2lvbk1hcC5hbGxPcmRlckJ5cykubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiIE9SREVSIEJZIChTRUxFQ1QgTlVMTClcIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9GRlNFVCBcIiArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArXG4gICAgICAgICAgICAgICAgICAgIFwiIFJPV1MgRkVUQ0ggTkVYVCBcIiArXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0ICtcbiAgICAgICAgICAgICAgICAgICAgXCIgUk9XUyBPTkxZXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgXCIgT0ZGU0VUIDAgUk9XUyBGRVRDSCBORVhUIFwiICsgbGltaXQgKyBcIiBST1dTIE9OTFlcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChvZmZzZXQpIHJldHVybiBwcmVmaXggKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQgKyBcIiBST1dTXCJcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIERyaXZlclV0aWxzLmlzTXlTUUxGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikgfHxcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy50eXBlID09PSBcImF1cm9yYS1teXNxbFwiIHx8XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJzYXBcIiB8fFxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwic3Bhbm5lclwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGxpbWl0ICYmIG9mZnNldCkgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQgKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXRcbiAgICAgICAgICAgIGlmIChsaW1pdCkgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXRcbiAgICAgICAgICAgIGlmIChvZmZzZXQpIHRocm93IG5ldyBPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvcigpXG4gICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNTUUxpdGVGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpIHJldHVybiBcIiBMSU1JVCBcIiArIGxpbWl0ICsgXCIgT0ZGU0VUIFwiICsgb2Zmc2V0XG4gICAgICAgICAgICBpZiAobGltaXQpIHJldHVybiBcIiBMSU1JVCBcIiArIGxpbWl0XG4gICAgICAgICAgICBpZiAob2Zmc2V0KSByZXR1cm4gXCIgTElNSVQgLTEgT0ZGU0VUIFwiICsgb2Zmc2V0XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwib3JhY2xlXCIpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgXCIgT0ZGU0VUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICtcbiAgICAgICAgICAgICAgICAgICAgXCIgUk9XUyBGRVRDSCBORVhUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgbGltaXQgK1xuICAgICAgICAgICAgICAgICAgICBcIiBST1dTIE9OTFlcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChsaW1pdCkgcmV0dXJuIFwiIEZFVENIIE5FWFQgXCIgKyBsaW1pdCArIFwiIFJPV1MgT05MWVwiXG4gICAgICAgICAgICBpZiAob2Zmc2V0KSByZXR1cm4gXCIgT0ZGU0VUIFwiICsgb2Zmc2V0ICsgXCIgUk9XU1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KSByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdCArIFwiIE9GRlNFVCBcIiArIG9mZnNldFxuICAgICAgICAgICAgaWYgKGxpbWl0KSByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdFxuICAgICAgICAgICAgaWYgKG9mZnNldCkgcmV0dXJuIFwiIE9GRlNFVCBcIiArIG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTE9DS1wiIHBhcnQgb2YgU0VMRUNUIFF1ZXJ5IGFmdGVyIHRhYmxlIENsYXVzZVxuICAgICAqIGV4LlxuICAgICAqICBTRUxFQ1QgMVxuICAgICAqICBGUk9NIFVTRVIgVSBXSVRIIChOT0xPQ0spXG4gICAgICogIEpPSU4gT1JERVIgTyBXSVRIIChOT0xPQ0spXG4gICAgICogICAgICBPTiBVLklEPU8uT3JkZXJJRFxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwibXNzcWxcIikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgV0lUSCAoSE9MRExPQ0ssIFJPV0xPQ0spXCJcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfd3JpdGVcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIFdJVEggKFVQRExPQ0ssIFJPV0xPQ0spXCJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlydHlfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgV0lUSCAoTk9MT0NLKVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJMT0NLXCIgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUxvY2tFeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXJcblxuICAgICAgICBsZXQgbG9ja1RhYmxlc0NsYXVzZSA9IFwiXCJcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tUYWJsZXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJjb2Nrcm9hY2hkYlwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJMb2NrIHRhYmxlcyBub3Qgc3VwcG9ydGVkIGluIHNlbGVjdGVkIGRyaXZlclwiLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcImxvY2tUYWJsZXMgY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NrVGFibGVzQ2xhdXNlID0gXCIgT0YgXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5qb2luKFwiLCBcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvbkxvY2tFeHByZXNzaW9uID0gXCJcIlxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9uTG9ja2VkID09PSBcIm5vd2FpdFwiKSB7XG4gICAgICAgICAgICBvbkxvY2tFeHByZXNzaW9uID0gXCIgTk9XQUlUXCJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cHJlc3Npb25NYXAub25Mb2NrZWQgPT09IFwic2tpcF9sb2NrZWRcIikge1xuICAgICAgICAgICAgb25Mb2NrRXhwcmVzc2lvbiA9IFwiIFNLSVAgTE9DS0VEXCJcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3JlYWRcIjpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwibXlzcWxcIiB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImF1cm9yYS1teXNxbFwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUmVsZWFzZVZlcnNpb25PckdyZWF0ZXIoZHJpdmVyLCBcIjguMC4wXCIpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBGT1IgU0hBUkVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgTE9DSyBJTiBTSEFSRSBNT0RFXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtYXJpYWRiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIExPQ0sgSU4gU0hBUkUgTU9ERVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBTSEFSRVwiICsgbG9ja1RhYmxlc0NsYXVzZSArIG9uTG9ja0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwib3JhY2xlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJwZXNzaW1pc3RpY193cml0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwiYXVyb3JhLW15c3FsXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJvcmFjbGVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgb25Mb2NrRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUG9zdGdyZXNGYW1pbHkoZHJpdmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImNvY2tyb2FjaGRiXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcml2ZXIub3B0aW9ucy50eXBlID09PSBcIm1zc3FsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIjpcbiAgICAgICAgICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNQb3N0Z3Jlc0ZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFXCIgKyBsb2NrVGFibGVzQ2xhdXNlICsgXCIgU0tJUCBMT0NLRURcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIFNLSVAgTE9DS0VEXCJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIjpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUG9zdGdyZXNGYW1pbHkoZHJpdmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImNvY2tyb2FjaGRiXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBcIiBOT1dBSVRcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIE5PV0FJVFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJmb3Jfbm9fa2V5X3VwZGF0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuaXNQb3N0Z3Jlc0ZhbWlseShkcml2ZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwiY29ja3JvYWNoZGJcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgRk9SIE5PIEtFWSBVUERBVEVcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NrVGFibGVzQ2xhdXNlICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9ja0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZm9yX2tleV9zaGFyZVwiOlxuICAgICAgICAgICAgICAgIGlmIChEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIEZPUiBLRVkgU0hBUkVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkhBVklOR1wiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVIYXZpbmdFeHByZXNzaW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3NcbiAgICAgICAgICAgIC5tYXAoKGhhdmluZywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhdmluZy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4ID4gMCA/IFwiQU5EIFwiIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCA+IDAgPyBcIk9SIFwiIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGhhdmluZy5jb25kaXRpb24pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKVxuXG4gICAgICAgIGlmICghY29uZGl0aW9ucy5sZW5ndGgpIHJldHVybiBcIlwiXG4gICAgICAgIHJldHVybiBcIiBIQVZJTkcgXCIgKyBjb25kaXRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkRXNjYXBlZEVudGl0eUNvbHVtblNlbGVjdHMoXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgKTogU2VsZWN0UXVlcnlbXSB7XG4gICAgICAgIGNvbnN0IGhhc01haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoXG4gICAgICAgICAgICAoc2VsZWN0KSA9PiBzZWxlY3Quc2VsZWN0aW9uID09PSBhbGlhc05hbWUsXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdID0gW11cbiAgICAgICAgaWYgKGhhc01haW5BbGlhcykge1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLm1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoY29sdW1uKSA9PiBjb2x1bW4uaXNTZWxlY3QgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5zLnB1c2goXG4gICAgICAgICAgICAuLi5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0aW9uID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApXG5cblxuXG5cbiAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKVxuXG4gICAgICAgICAgICByZXR1cm4gW11cblxuICAgICAgICBjb25zdCBub25TZWxlY3RlZFByaW1hcnlDb2x1bW5zID0gdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5XG4gICAgICAgICAgICA/IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIChwcmltYXJ5Q29sdW1uKSA9PiBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUNvbHVtbikgPT09IC0xLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IFtdXG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSBbLi4uY29sdW1ucywgLi4ubm9uU2VsZWN0ZWRQcmltYXJ5Q29sdW1uc11cbiAgICAgICAgY29uc3QgZmluYWxTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cblxuICAgICAgICBjb25zdCBlc2NhcGVkQWxpYXNOYW1lID0gdGhpcy5lc2NhcGUoYWxpYXNOYW1lKVxuICAgICAgICBhbGxDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvblBhdGggPVxuICAgICAgICAgICAgICAgIGVzY2FwZWRBbGlhc05hbWUgKyBcIi5cIiArIHRoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpXG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsUHJvcGVydHkgJiYgY29sdW1uLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uUGF0aCA9IGAoJHtjb2x1bW4ucXVlcnkoZXNjYXBlZEFsaWFzTmFtZSl9KWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcblxuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHNlbGVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxTZWxlY3RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3Rpb24uYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWxlY3Rpb24uYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOiBzZWxlY3Rpb24udmlydHVhbCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5hbFNlbGVjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogaGFzTWFpbkFsaWFzLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBmaW5hbFNlbGVjdHNcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmluZEVudGl0eUNvbHVtblNlbGVjdHMoXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgKTogU2VsZWN0UXVlcnlbXSB7XG4gICAgICAgIGNvbnN0IG1haW5TZWxlY3QgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKFxuICAgICAgICAgICAgKHNlbGVjdCkgPT4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lLFxuICAgICAgICApXG4gICAgICAgIGlmIChtYWluU2VsZWN0KSByZXR1cm4gW21haW5TZWxlY3RdXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLmZpbHRlcigoc2VsZWN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuY29sdW1ucy5zb21lKFxuICAgICAgICAgICAgICAgIChjb2x1bW4pID0+XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVDb3VudEV4cHJlc3Npb24oKSB7XG4gICAgICAgIGNvbnN0IG1haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUgLy8gdG9kbzogd2lsbCB0aGlzIHdvcmsgd2l0aCBcImZyb21UYWJsZU5hbWVcIj9cbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzIS5tZXRhZGF0YVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW5zID0gbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNcbiAgICAgICAgY29uc3QgZGlzdGluY3RBbGlhcyA9IHRoaXMuZXNjYXBlKG1haW5BbGlhcylcblxuXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBcIkNPVU5UKDEpXCJcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJjb2Nrcm9hY2hkYlwiIHx8XG4gICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KHRoaXMuY29ubmVjdGlvbi5kcml2ZXIpXG4gICAgICAgICkge1xuXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgXCJDT1VOVChESVNUSU5DVChcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpfWAsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgXCIpKVwiXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseSh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyKSkge1xuXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgXCJDT1VOVChESVNUSU5DVCBcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpfWAsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgXCIpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG5cblxuXG5cblxuICAgICAgICAgICAgY29uc3QgY29sdW1uc0V4cHJlc3Npb24gPSBwcmltYXJ5Q29sdW1uc1xuICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChwcmltYXJ5Q29sdW1uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7ZGlzdGluY3RBbGlhc30uJHt0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsICd8O3wnLCBcIilcblxuICAgICAgICAgICAgaWYgKHByaW1hcnlDb2x1bW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgQ09VTlQoRElTVElOQ1QoJHtjb2x1bW5zRXhwcmVzc2lvbn0pKWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGBDT1VOVChESVNUSU5DVChDT05DQVQoJHtjb2x1bW5zRXhwcmVzc2lvbn0pKSlgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwic3Bhbm5lclwiKSB7XG5cblxuXG4gICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBDT1VOVChESVNUSU5DVCgke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zWzBdLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICApfSkpYFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zRXhwcmVzc2lvbiA9IHByaW1hcnlDb2x1bW5zXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHByaW1hcnlDb2x1bW4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBgQ0FTVCgke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApfSBBUyBTVFJJTkcpYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsICd8O3wnLCBcIilcbiAgICAgICAgICAgIHJldHVybiBgQ09VTlQoRElTVElOQ1QoQ09OQ0FUKCR7Y29sdW1uc0V4cHJlc3Npb259KSkpYFxuICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgYENPVU5UKERJU1RJTkNUKGAgK1xuICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAubWFwKChjKSA9PiBgJHtkaXN0aW5jdEFsaWFzfS4ke3RoaXMuZXNjYXBlKGMuZGF0YWJhc2VOYW1lKX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiIHx8ICd8O3wnIHx8IFwiKSArXG4gICAgICAgICAgICBcIikpXCJcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICAgICAgcXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyLFxuICAgICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IGNvdW50U3FsID0gdGhpcy5jb21wdXRlQ291bnRFeHByZXNzaW9uKClcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAub3JkZXJCeSgpXG4gICAgICAgICAgICAuZ3JvdXBCeSgpXG4gICAgICAgICAgICAub2Zmc2V0KHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5saW1pdCh1bmRlZmluZWQpXG4gICAgICAgICAgICAuc2tpcCh1bmRlZmluZWQpXG4gICAgICAgICAgICAudGFrZSh1bmRlZmluZWQpXG4gICAgICAgICAgICAuc2VsZWN0KGNvdW50U3FsLCBcImNudFwiKVxuICAgICAgICAgICAgLnNldE9wdGlvbihcImRpc2FibGUtZ2xvYmFsLW9yZGVyXCIpXG4gICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG5cbiAgICAgICAgaWYgKCFyZXN1bHRzIHx8ICFyZXN1bHRzWzBdIHx8ICFyZXN1bHRzWzBdW1wiY250XCJdKSByZXR1cm4gMFxuXG4gICAgICAgIHJldHVybiBwYXJzZUludChyZXN1bHRzWzBdW1wiY250XCJdKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcHBseUZpbmRPcHRpb25zKCkge1xuXG5cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9uTG9hZFN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbkxvYWRTdHJhdGVneVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tZW50KHRoaXMuZmluZE9wdGlvbnMuY29tbWVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMud2l0aERlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhEZWxldGVkKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gQXJyYXkuaXNBcnJheSh0aGlzLmZpbmRPcHRpb25zLnNlbGVjdClcbiAgICAgICAgICAgICAgICAgICAgPyBPcm1VdGlscy5wcm9wZXJ0eVBhdGhzVG9UcnV0aHlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpbmRPcHRpb25zLnNlbGVjdFxuXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzIS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5zZWxlY3RzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdHMgPSBbXVxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25zID0gQXJyYXkuaXNBcnJheSh0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgPyBPcm1VdGlscy5wcm9wZXJ0eVBhdGhzVG9UcnV0aHlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFJlbGF0aW9ucyhcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5maW5kT3B0aW9ucy5zZWxlY3QgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIEZpbmRPcHRpb25zU2VsZWN0PGFueT4pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkxvYWRTdHJhdGVneSA9PT0gXCJqb2luXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZEVhZ2VyUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0ID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5maW5kT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QgYXMgRmluZE9wdGlvbnNTZWxlY3Q8YW55PilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3QodGhpcy5zZWxlY3RzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy53aGVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5kV2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbnMuc3Vic3RyKDAsIDEpICE9PSBcIihcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIoXCIgKyB0aGlzLmNvbmRpdGlvbnMgKyBcIilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICApIC8vIHRlbXBvcmFyeSBhbmQgd2hlcmUgYW5kIGJyYWNlc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5vcmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRPcmRlcihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5vcmRlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmpvaW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuam9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoam9pbi5zZWxlY3QgJiYgIWpvaW4uc2VsZWN0aW9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2luLnR5cGUgPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtqb2luLnBhcmVudEFsaWFzfS4ke2pvaW4ucmVsYXRpb25NZXRhZGF0YS5wcm9wZXJ0eVBhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2pvaW4ucGFyZW50QWxpYXN9LiR7am9pbi5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5UGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luLmFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW4udHlwZSA9PT0gXCJpbm5lclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lckpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2pvaW4ucGFyZW50QWxpYXN9LiR7am9pbi5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5UGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luLmFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7am9pbi5wYXJlbnRBbGlhc30uJHtqb2luLnJlbGF0aW9uTWV0YWRhdGEucHJvcGVydHlQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG5cblxuXG5cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMuc2tpcCAhPT0gdW5kZWZpbmVkKSB7XG5cblxuXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwKHRoaXMuZmluZE9wdGlvbnMuc2tpcClcblxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLnRha2UgIT09IHVuZGVmaW5lZCkge1xuXG5cblxuICAgICAgICAgICAgICAgIHRoaXMudGFrZSh0aGlzLmZpbmRPcHRpb25zLnRha2UpXG5cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuY2FjaGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlKHRoaXMuZmluZE9wdGlvbnMuY2FjaGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmZpbmRPcHRpb25zLmNhY2hlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUodGhpcy5maW5kT3B0aW9ucy5jYWNoZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuY2FjaGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmNhY2hlLmlkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmNhY2hlLm1pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5qb2luLmxlZnRKb2luKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbmRPcHRpb25zLmpvaW4ubGVmdEpvaW4pLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5qb2luIS5sZWZ0Sm9pbiFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJKb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmlubmVySm9pbiFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4ubGVmdEpvaW5BbmRTZWxlY3QpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5qb2luLmxlZnRKb2luQW5kU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICApLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmxlZnRKb2luQW5kU2VsZWN0IVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luQW5kU2VsZWN0KVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuam9pbi5pbm5lckpvaW5BbmRTZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVySm9pbkFuZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmlubmVySm9pbkFuZFNlbGVjdCFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwib3B0aW1pc3RpY1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9jayhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMubG9jay5tb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT0gXCJwZXNzaW1pc3RpY19yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwicGVzc2ltaXN0aWNfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT0gXCJkaXJ0eV9yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGVzc2ltaXN0aWNfd3JpdGVfb3JfZmFpbFwiIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMubG9jay5tb2RlID09PSBcImZvcl9ub19rZXlfdXBkYXRlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwiZm9yX2tleV9zaGFyZVwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZXMgPSB0aGlzLmZpbmRPcHRpb25zLmxvY2sudGFibGVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZmluZE9wdGlvbnMubG9jay50YWJsZXMubWFwKCh0YWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVBbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmFsaWFzZXMuZmluZCgoYWxpYXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXggPT09IHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZUFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHt0YWJsZX1cIiBpcyBub3QgcGFydCBvZiB0aGlzIHF1ZXJ5YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lc2NhcGUodGFibGVBbGlhcy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2NrKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWVzLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMubG9jay5vbkxvY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRPbkxvY2tlZCh0aGlzLmZpbmRPcHRpb25zLmxvY2sub25Mb2NrZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmxvYWRSZWxhdGlvbklkcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZEFsbFJlbGF0aW9uSWRzKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMubG9hZFJlbGF0aW9uSWRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkQWxsUmVsYXRpb25JZHModGhpcy5maW5kT3B0aW9ucy5sb2FkUmVsYXRpb25JZHMgYXMgYW55KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5qb2luRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMudHJhbnNhY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPSB0cnVlXG4gICAgICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyBvYmplY3Qgd2l0aCByYXcgcmVzdWx0cyBhbmQgZW50aXRpZXMgY3JlYXRlZCBmcm9tIHRoZW0uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVFbnRpdGllc0FuZFJhd1Jlc3VsdHMoXG4gICAgICAgIHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcixcbiAgICApOiBQcm9taXNlPHsgZW50aXRpZXM6IEVudGl0eVtdOyByYXc6IGFueVtdIH0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgQWxpYXMgaXMgbm90IHNldC4gVXNlIFwiZnJvbVwiIG1ldGhvZCB0byBzZXQgYW4gYWxpYXMuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3JlYWRcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwiZm9yX25vX2tleV91cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJmb3Jfa2V5X3NoYXJlXCIpICYmXG4gICAgICAgICAgICAhcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZVxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yKClcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIikge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLnZlcnNpb25Db2x1bW4gJiYgIW1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yKG1ldGFkYXRhLm5hbWUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvbklkTG9hZGVyID0gbmV3IFJlbGF0aW9uSWRMb2FkZXIoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcyxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCByZWxhdGlvbkNvdW50TG9hZGVyID0gbmV3IFJlbGF0aW9uQ291bnRMb2FkZXIoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcyxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCByZWxhdGlvbklkTWV0YWRhdGFUcmFuc2Zvcm1lciA9XG4gICAgICAgICAgICBuZXcgUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lcih0aGlzLmV4cHJlc3Npb25NYXApXG4gICAgICAgIHJlbGF0aW9uSWRNZXRhZGF0YVRyYW5zZm9ybWVyLnRyYW5zZm9ybSgpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uQ291bnRNZXRhZGF0YVRyYW5zZm9ybWVyID1cbiAgICAgICAgICAgIG5ldyBSZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyKHRoaXMuZXhwcmVzc2lvbk1hcClcbiAgICAgICAgcmVsYXRpb25Db3VudE1ldGFkYXRhVHJhbnNmb3JtZXIudHJhbnNmb3JtKClcblxuICAgICAgICBsZXQgcmF3UmVzdWx0czogYW55W10gPSBbXSxcbiAgICAgICAgICAgIGVudGl0aWVzOiBhbnlbXSA9IFtdXG5cblxuXG5cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5leHByZXNzaW9uTWFwLnNraXAgfHwgdGhpcy5leHByZXNzaW9uTWFwLnRha2UpICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubGVuZ3RoID4gMFxuICAgICAgICApIHtcblxuXG4gICAgICAgICAgICBjb25zdCBbc2VsZWN0cywgb3JkZXJCeXNdID1cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9yZGVyQnlDb21iaW5lZFdpdGhTZWxlY3RFeHByZXNzaW9uKFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBjb25zdCBtYWluQWxpYXNOYW1lID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lXG5cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U2VsZWN0cyA9IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChcbiAgICAgICAgICAgICAgICAocHJpbWFyeUNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0aW5jdEFsaWFzID0gdGhpcy5lc2NhcGUoXCJkaXN0aW5jdEFsaWFzXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkFsaWFzID0gdGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckJ5c1tjb2x1bW5BbGlhc10pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyQnlzW2NvbHVtbkFsaWFzXSA9IFwiQVNDXCJcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZGlzdGluY3RBbGlhc30uJHtjb2x1bW5BbGlhc30gQVMgJHt0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICByYXdSZXN1bHRzID0gYXdhaXQgbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcihcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnNlbGVjdChgRElTVElOQ1QgJHtxdWVyeVNlbGVjdHMuam9pbihcIiwgXCIpfWApXG4gICAgICAgICAgICAgICAgLmFkZFNlbGVjdChzZWxlY3RzKVxuICAgICAgICAgICAgICAgIC5mcm9tKGAoJHt0aGlzLmNsb25lKCkub3JkZXJCeSgpLmdldFF1ZXJ5KCl9KWAsIFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgICAgIC5vZmZzZXQodGhpcy5leHByZXNzaW9uTWFwLnNraXApXG4gICAgICAgICAgICAgICAgLmxpbWl0KHRoaXMuZXhwcmVzc2lvbk1hcC50YWtlKVxuICAgICAgICAgICAgICAgIC5vcmRlckJ5KG9yZGVyQnlzKVxuICAgICAgICAgICAgICAgIC5jYWNoZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHRoaXMuZ2V0UGFyYW1ldGVycygpKVxuICAgICAgICAgICAgICAgIC5zZXROYXRpdmVQYXJhbWV0ZXJzKHRoaXMuZXhwcmVzc2lvbk1hcC5uYXRpdmVQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgICAgIC5nZXRSYXdNYW55KClcblxuICAgICAgICAgICAgaWYgKHJhd1Jlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBcIlwiXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyczogT2JqZWN0TGl0ZXJhbCA9IHt9XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmhhc011bHRpcGxlUHJpbWFyeUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gcmF3UmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwcmltYXJ5Q29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbUtleSA9IGBvcm1fZGlzdGluY3RfaWRzXyR7aW5kZXh9XyR7cHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1twYXJhbUtleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGlkc18ke21haW5BbGlhc05hbWV9XyR7cHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHttYWluQWxpYXNOYW1lfS4ke3ByaW1hcnlDb2x1bW4ucHJvcGVydHlQYXRofT06JHtwYXJhbUtleX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIEFORCBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBPUiBcIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNbMF0uZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRzID0gcmF3UmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0W2FsaWFzXSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJlQWxsTnVtYmVycyA9IGlkcy5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgIChpZDogYW55KSA9PiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZUFsbE51bWJlcnMpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gYCR7bWFpbkFsaWFzTmFtZX0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5wcm9wZXJ0eVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gSU4gKCR7aWRzLmpvaW4oXCIsIFwiKX0pYFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tcIm9ybV9kaXN0aW5jdF9pZHNcIl0gPSBpZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFsaWFzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdLnByb3BlcnR5UGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgSU4gKDouLi5vcm1fZGlzdGluY3RfaWRzKVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmF3UmVzdWx0cyA9IGF3YWl0IHRoaXMuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAubWVyZ2VFeHByZXNzaW9uTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXBwZW5kZWRBbmRXaGVyZUNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYXdSZXN1bHRzID0gYXdhaXQgdGhpcy5sb2FkUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdSZXN1bHRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgY29uc3QgcmF3UmVsYXRpb25JZFJlc3VsdHMgPSBhd2FpdCByZWxhdGlvbklkTG9hZGVyLmxvYWQocmF3UmVzdWx0cylcbiAgICAgICAgICAgIGNvbnN0IHJhd1JlbGF0aW9uQ291bnRSZXN1bHRzID0gYXdhaXQgcmVsYXRpb25Db3VudExvYWRlci5sb2FkKFxuICAgICAgICAgICAgICAgIHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lcihcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICByYXdSZWxhdGlvbklkUmVzdWx0cyxcbiAgICAgICAgICAgICAgICByYXdSZWxhdGlvbkNvdW50UmVzdWx0cyxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZW50aXRpZXMgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgcmF3UmVzdWx0cyxcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzISxcbiAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXG4gICAgICAgICAgICAgICAgICAgIFwiTG9hZFwiLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID09PSBcInF1ZXJ5XCIpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25NZXRhZGF0YXMubWFwKGFzeW5jIChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvblRhcmdldCA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25BbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IEFycmF5LmlzQXJyYXkodGhpcy5maW5kT3B0aW9ucy5zZWxlY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLnByb3BlcnR5UGF0aHNUb1RydXRoeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9ucyA9IEFycmF5LmlzQXJyYXkodGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLnByb3BlcnR5UGF0aHNUb1RydXRoeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlCdWlsZGVyID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChyZWxhdGlvbkFsaWFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20ocmVsYXRpb25UYXJnZXQsIHJlbGF0aW9uQWxpYXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmluZE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiB0aGlzLmZpbmRPcHRpb25zLm9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLm9yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnM6IHJlbGF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoRGVsZXRlZDogdGhpcy5maW5kT3B0aW9ucy53aXRoRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkxvYWRTdHJhdGVneTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbkxvYWRTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5R3JvdXBzOiBhbnlbXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlbGF0aW9uSWRMb2FkZXIubG9hZE1hbnlUb01hbnlSZWxhdGlvbklkc0FuZEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlCdWlsZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHlHcm91cCA9IHJlbGF0ZWRFbnRpdHlHcm91cHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3VwKSA9PiBncm91cC5lbnRpdHkgPT09IGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5R3JvdXAucmVsYXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWxhdGVkRW50aXR5R3JvdXAucmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5zZXRFbnRpdHlWYWx1ZShlbnRpdHksIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXc6IHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICBlbnRpdGllczogZW50aXRpZXMsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlT3JkZXJCeUNvbWJpbmVkV2l0aFNlbGVjdEV4cHJlc3Npb24oXG4gICAgICAgIHBhcmVudEFsaWFzOiBzdHJpbmcsXG4gICAgKTogW3N0cmluZywgT3JkZXJCeUNvbmRpdGlvbl0ge1xuXG4gICAgICAgIGNvbnN0IG9yZGVyQnlzID0gdGhpcy5leHByZXNzaW9uTWFwLmFsbE9yZGVyQnlzXG4gICAgICAgIGNvbnN0IHNlbGVjdFN0cmluZyA9IE9iamVjdC5rZXlzKG9yZGVyQnlzKVxuICAgICAgICAgICAgLm1hcCgob3JkZXJDcml0ZXJpYSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcmRlckNyaXRlcmlhLmluZGV4T2YoXCIuXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcml0ZXJpYVBhcnRzID0gb3JkZXJDcml0ZXJpYS5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxpYXNOYW1lID0gY3JpdGVyaWFQYXJ0c1swXVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGggPSBjcml0ZXJpYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5tZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4hLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0aW9uID09PSBvcmRlckNyaXRlcmlhIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWEsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgKyBcIi5cIiArIG9yZGVyQ3JpdGVyaWFcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgICAgY29uc3Qgb3JkZXJCeU9iamVjdDogT3JkZXJCeUNvbmRpdGlvbiA9IHt9XG4gICAgICAgIE9iamVjdC5rZXlzKG9yZGVyQnlzKS5mb3JFYWNoKChvcmRlckNyaXRlcmlhKSA9PiB7XG4gICAgICAgICAgICBpZiAob3JkZXJDcml0ZXJpYS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcml0ZXJpYVBhcnRzID0gb3JkZXJDcml0ZXJpYS5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhc05hbWUgPSBjcml0ZXJpYVBhcnRzWzBdXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gY3JpdGVyaWFQYXJ0cy5zbGljZSgxKS5qb2luKFwiLlwiKVxuICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgICAgICAgICAgICAgYWxpYXMubWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgIG9yZGVyQnlPYmplY3RbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiEuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSA9IG9yZGVyQnlzW29yZGVyQ3JpdGVyaWFdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiA9PT0gb3JkZXJDcml0ZXJpYSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWEsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJCeU9iamVjdFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArIFwiLlwiICsgb3JkZXJDcml0ZXJpYVxuICAgICAgICAgICAgICAgICAgICBdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmRlckJ5T2JqZWN0W29yZGVyQ3JpdGVyaWFdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtzZWxlY3RTdHJpbmcsIG9yZGVyQnlPYmplY3RdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgcmF3IHJlc3VsdHMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGxvYWRSYXdSZXN1bHRzKHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcikge1xuICAgICAgICBjb25zdCBbc3FsLCBwYXJhbWV0ZXJzXSA9IHRoaXMuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKClcbiAgICAgICAgY29uc3QgcXVlcnlJZCA9IHNxbCArIFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycylcbiAgICAgICAgY29uc3QgY2FjaGVPcHRpb25zID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5jYWNoZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgID8gdGhpcy5jb25uZWN0aW9uLm9wdGlvbnMuY2FjaGVcbiAgICAgICAgICAgICAgICA6IHt9XG4gICAgICAgIGxldCBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zOiBRdWVyeVJlc3VsdENhY2hlT3B0aW9ucyB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgbGV0IGNhY2hlRXJyb3IgPSBmYWxzZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZSAmJlxuICAgICAgICAgICAgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5nZXRGcm9tQ2FjaGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlT3B0aW9ucy5kdXJhdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5pc0V4cGlyZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMucmVzdWx0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZU9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhY2hlRXJyb3IgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoc3FsLCBwYXJhbWV0ZXJzLCB0cnVlKVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFjYWNoZUVycm9yICYmXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZSAmJlxuICAgICAgICAgICAgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlLnN0b3JlSW5DYWNoZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZU9wdGlvbnMuZHVyYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHRzLnJlY29yZHMpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICghY2FjaGVPcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLnJlY29yZHNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgaW50byBleHByZXNzaW9uIG1hcCBnaXZlbiBleHByZXNzaW9uIG1hcCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtZXJnZUV4cHJlc3Npb25NYXAoXG4gICAgICAgIGV4cHJlc3Npb25NYXA6IFBhcnRpYWw8UXVlcnlFeHByZXNzaW9uTWFwPixcbiAgICApOiB0aGlzIHtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMuZXhwcmVzc2lvbk1hcCwgZXhwcmVzc2lvbk1hcClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGEgZ2l2ZSBudW1iZXIgLSBjb252ZXJ0cyB0byBpbnQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG5vcm1hbGl6ZU51bWJlcihudW06IGFueSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIiB8fCBudW0gPT09IHVuZGVmaW5lZCB8fCBudW0gPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVtXG5cbiAgICAgICAgcmV0dXJuIE51bWJlcihudW0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IGJ1aWxkZXIgdXNlZCB0byBleGVjdXRlIHNxbCBxdWVyaWVzIGluc2lkZSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9idGFpblF1ZXJ5UnVubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoXCJzbGF2ZVwiKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZFNlbGVjdChcbiAgICAgICAgc2VsZWN0OiBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGVtYmVkUHJlZml4Pzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc2VsZWN0KSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0W2tleV0gPT09IHVuZGVmaW5lZCB8fCBzZWxlY3Rba2V5XSA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4ID8gZW1iZWRQcmVmaXggKyBcIi5cIiArIGtleSA6IGtleVxuICAgICAgICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aFN0cmljdChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCBlbWJlZCA9IG1ldGFkYXRhLmZpbmRFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgY29uc3QgcmVsYXRpb24gPSBtZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aClcblxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhY29sdW1uICYmICFyZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yKHByb3BlcnR5UGF0aCwgbWV0YWRhdGEpXG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdHMucHVzaChhbGlhcyArIFwiLlwiICsgcHJvcGVydHlQYXRoKVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdCggLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rba2V5XSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICApXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVsYXRpb25zKFxuICAgICAgICByZWxhdGlvbnM6IEZpbmRPcHRpb25zUmVsYXRpb25zPGFueT4sXG4gICAgICAgIHNlbGVjdGlvbjogRmluZE9wdGlvbnNTZWxlY3Q8YW55PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgbWV0YWRhdGE6IEVudGl0eU1ldGFkYXRhLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBlbWJlZFByZWZpeD86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKCFyZWxhdGlvbnMpIHJldHVyblxuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlbGF0aW9ucykuZm9yRWFjaCgocmVsYXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gKHJlbGF0aW9ucyBhcyBhbnkpW3JlbGF0aW9uTmFtZV1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4XG4gICAgICAgICAgICAgICAgPyBlbWJlZFByZWZpeCArIFwiLlwiICsgcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhcmVsYXRpb24pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvcihwcm9wZXJ0eVBhdGgsIG1ldGFkYXRhKVxuXG4gICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShzZWxlY3Rpb24sIGVtYmVkLnByb3BlcnR5UGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpvaW5BbGlhcyA9IGFsaWFzICsgXCJfXCIgKyBwcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpXG4gICAgICAgICAgICAgICAgam9pbkFsaWFzID0gRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgeyBqb2luZXI6IFwiX19cIiB9LFxuICAgICAgICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVmFsdWUgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlbGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkxvYWRTdHJhdGVneSA9PT0gXCJxdWVyeVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uTWV0YWRhdGFzLnB1c2gocmVsYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb25bcmVsYXRpb25OYW1lXSA9PT0gXCJvYmplY3RcIiAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChzZWxlY3Rpb25bXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRBbGlhczogYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NZXRhZGF0YTogcmVsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbltyZWxhdGlvbk5hbWVdID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkU2VsZWN0KCAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIGFzIEZpbmRPcHRpb25zU2VsZWN0PGFueT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlbGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID09PSBcImpvaW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZEVhZ2VyUmVsYXRpb25zKFxuICAgICAgICByZWxhdGlvbnM6IEZpbmRPcHRpb25zUmVsYXRpb25zPGFueT4sXG4gICAgICAgIHNlbGVjdGlvbjogRmluZE9wdGlvbnNTZWxlY3Q8YW55PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgbWV0YWRhdGE6IEVudGl0eU1ldGFkYXRhLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBlbWJlZFByZWZpeD86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKCFyZWxhdGlvbnMpIHJldHVyblxuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlbGF0aW9ucykuZm9yRWFjaCgocmVsYXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gKHJlbGF0aW9ucyBhcyBhbnkpW3JlbGF0aW9uTmFtZV1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4XG4gICAgICAgICAgICAgICAgPyBlbWJlZFByZWZpeCArIFwiLlwiICsgcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhcmVsYXRpb24pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvcihwcm9wZXJ0eVBhdGgsIG1ldGFkYXRhKVxuXG4gICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKHNlbGVjdGlvbiwgZW1iZWQucHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgam9pbkFsaWFzID0gYWxpYXMgKyBcIl9cIiArIHByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIilcbiAgICAgICAgICAgICAgICBqb2luQWxpYXMgPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICB7IGpvaW5lcjogXCJfX1wiIH0sXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZWxhdGlvblZhbHVlID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5lYWdlclJlbGF0aW9ucy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVhZ2VyUmVsYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWFnZXJSZWxhdGlvbkpvaW5BbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFnZXJSZWxhdGlvbi5wcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFnZXJSZWxhdGlvbkpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgam9pbmVyOiBcIl9fXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWdlclJlbGF0aW9uSm9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0Sm9pbiA9IHRoaXMuam9pbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IGVhZ2VyUmVsYXRpb25Kb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiBlYWdlclJlbGF0aW9uSm9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NZXRhZGF0YTogZWFnZXJSZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uW3JlbGF0aW9uTmFtZV0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdCggLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkT3JkZXIoXG4gICAgICAgIG9yZGVyOiBGaW5kT3B0aW9uc09yZGVyPGFueT4sXG4gICAgICAgIG1ldGFkYXRhOiBFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgZW1iZWRQcmVmaXg/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvcmRlcikge1xuICAgICAgICAgICAgaWYgKG9yZGVyW2tleV0gPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gZW1iZWRQcmVmaXggPyBlbWJlZFByZWZpeCArIFwiLlwiICsga2V5IDoga2V5XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoU3RyaWN0KHByb3BlcnR5UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuXG4gICAgICAgICAgICBpZiAoIWVtYmVkICYmICFjb2x1bW4gJiYgIXJlbGF0aW9uKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlQcm9wZXJ0eU5vdEZvdW5kRXJyb3IocHJvcGVydHlQYXRoLCBtZXRhZGF0YSlcblxuICAgICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3JkZXJba2V5XSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAob3JkZXJba2V5XSBhcyBhbnkpLmRpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvcmRlcltrZXldXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSBcIkRFU0NcIiB8fFxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IFwiZGVzY1wiIHx8XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJERVNDXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJBU0NcIlxuICAgICAgICAgICAgICAgIGxldCBudWxscyA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBvcmRlcltrZXldID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChvcmRlcltrZXldIGFzIGFueSkubnVsbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgbnVsbHMgPVxuICAgICAgICAgICAgICAgICAgICBudWxscz8udG9Mb3dlckNhc2UoKSA9PT0gXCJmaXJzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiTlVMTFMgRklSU1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscz8udG9Mb3dlckNhc2UoKSA9PT0gXCJsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJOVUxMUyBMQVNUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICAgICAgICBsZXQgYWxpYXNQYXRoID0gYCR7YWxpYXN9LiR7cHJvcGVydHlQYXRofWBcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVmlydHVhbFByb3BlcnR5ICYmIGNvbHVtbi5xdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHMpID0+IHMuc2VsZWN0aW9uID09PSBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGggPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hbGlhc05hbWUgPSBhbGlhc1BhdGhcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCA9IGAoJHtjb2x1bW4ucXVlcnkoYWxpYXMpfSlgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZE9yZGVyQnkoYWxpYXNQYXRoLCBkaXJlY3Rpb24sIG51bGxzKVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE9yZGVyKFxuICAgICAgICAgICAgICAgICAgICBvcmRlcltrZXldIGFzIEZpbmRPcHRpb25zT3JkZXI8YW55PixcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBqb2luQWxpYXMgPSBhbGlhcyArIFwiX1wiICsgcHJvcGVydHlQYXRoLnJlcGxhY2UoXCIuXCIsIFwiX1wiKVxuICAgICAgICAgICAgICAgIGpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgIHsgam9pbmVyOiBcIl9fXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICApXG5cblxuXG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdEpvaW4gPSB0aGlzLmpvaW5zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChqb2luKSA9PiBqb2luLmFsaWFzID09PSBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE9yZGVyKFxuICAgICAgICAgICAgICAgICAgICBvcmRlcltrZXldIGFzIEZpbmRPcHRpb25zT3JkZXI8YW55PixcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkV2hlcmUoXG4gICAgICAgIHdoZXJlOiBGaW5kT3B0aW9uc1doZXJlPGFueT4sXG4gICAgICAgIG1ldGFkYXRhOiBFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgZW1iZWRQcmVmaXg/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGxldCBjb25kaXRpb246IHN0cmluZyA9IFwiXCJcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aGVyZSkpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9XG4gICAgICAgICAgICAgICAgXCIoXCIgK1xuICAgICAgICAgICAgICAgIHdoZXJlXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHdoZXJlSXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRQcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbmRpdGlvbikgPT4gISFjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbmRpdGlvbikgPT4gXCIoXCIgKyBjb25kaXRpb24gKyBcIilcIilcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgT1IgXCIpICtcbiAgICAgICAgICAgICAgICBcIilcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFuZENvbmRpdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB3aGVyZSkge1xuICAgICAgICAgICAgICAgIGlmICh3aGVyZVtrZXldID09PSB1bmRlZmluZWQgfHwgd2hlcmVba2V5XSA9PT0gbnVsbCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4ID8gZW1iZWRQcmVmaXggKyBcIi5cIiArIGtleSA6IGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoU3RyaWN0KHByb3BlcnR5UGF0aClcbiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZCA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG5cbiAgICAgICAgICAgICAgICBpZiAoIWVtYmVkICYmICFjb2x1bW4gJiYgIXJlbGF0aW9uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaWFzUGF0aCA9IGAke2FsaWFzfS4ke3Byb3BlcnR5UGF0aH1gXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsUHJvcGVydHkgJiYgY29sdW1uLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGggPSBgKCR7Y29sdW1uLnF1ZXJ5KGFsaWFzKX0pYFxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJWYWx1ZSA9IHdoZXJlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKEluc3RhbmNlQ2hlY2tlci5pc0VxdWFsT3BlcmF0b3Iod2hlcmVba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gd2hlcmVba2V5XS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4udHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gQXBwbHlWYWx1ZVRyYW5zZm9ybWVycy50cmFuc2Zvcm1UbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4udHJhbnNmb3JtZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy9cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy9cblxuXG5cblxuXG5cblxuICAgICAgICAgICAgICAgICAgICBhbmRDb25kaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFdoZXJlUHJlZGljYXRlQ29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgICAgICAgIClcblxuXG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlW2tleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pIGFuZENvbmRpdGlvbnMucHVzaChjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbikge1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVyZVtrZXldID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxBbGxVbmRlZmluZWQgPSBPYmplY3Qua2V5cyh3aGVyZVtrZXldKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaykgPT4gd2hlcmVba2V5XVtrXSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbEFsbFVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoSW5zdGFuY2VDaGVja2VyLmlzRmluZE9wZXJhdG9yKHdoZXJlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVba2V5XS50eXBlID09PSBcIm1vcmVUaGFuXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLnR5cGUgPT09IFwibGVzc1RoYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3FsT3BlcmF0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLnR5cGUgPT09IFwibW9yZVRoYW5cIiA/IFwiPlwiIDogXCI8XCJcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFiOiBRdWVyeUJ1aWxkZXI8YW55PiA9IHRoaXMuc3ViUXVlcnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb01hbnlPd25lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYi5zZWxlY3QoXCJDT1VOVCgqKVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uam9pblRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5qb2luVGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5Db2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5UYWJsZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucHJvcGVydHlOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gJHthbGlhc30uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgQU5EIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLmlzTWFueVRvTWFueU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiLnNlbGVjdChcIkNPVU5UKCopXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hLmpvaW5UYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uIS5qb2luVGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZlcnNlUmVsYXRpb24hLmludmVyc2VKb2luQ29sdW1ucy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pblRhYmxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSAke2FsaWFzfS4ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIuc2VsZWN0KFwiQ09VTlQoKilcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZlcnNlRW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YWJsZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gJHthbGlhc30uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcGVydHlOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgQU5EIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyByZWxhdGlvbiBpc24ndCBzdXBwb3J0ZWQgYnkgZ2l2ZW4gZmluZCBvcGVyYXRvcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIuZ2V0U3FsKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsT3BlcmF0b3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQod2hlcmVba2V5XS52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmlzTWFueVRvT25lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGlvbi5pc09uZVRvT25lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzUGF0aCA9IGAke2FsaWFzfS4ke3Byb3BlcnR5UGF0aH1gXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kQ29uZGl0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVXaGVyZUNvbmRpdGlvbkV4cHJlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRXaGVyZVByZWRpY2F0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgcmVsYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IGdpdmVuIGZpbmQgb3BlcmF0b3JgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgam9pbkFsaWFzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGpvaW5lcjogXCJfX1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdEpvaW4gPSB0aGlzLmpvaW5zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RKb2luLnR5cGUgPT09IFwibGVmdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdEpvaW4udHlwZSA9IFwiaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLmJ1aWxkV2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZENvbmRpdGlvbnMucHVzaChjb25kaXRpb24pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGFuZENvbmRpdGlvbnMuam9pbihcIiBBTkQgXCIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxuICAgIH1cbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPXRhb24tdHlwZW9ybSBsaWIvdHlwZW9ybS9xdWVyeS1idWlsZGVyL1NlbGVjdFF1ZXJ5QnVpbGRlci50cyJdfQ==