@nlabs/reaktor 1.18.0 → 1.20.0-reactorbox.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.
- package/README.md +290 -0
- package/docs/GENERATION.md +42 -16
- package/lib/actions/alfredFaq.js +1 -1
- package/lib/actions/analytics.js +1 -1
- package/lib/actions/apps.js +17 -2
- package/lib/actions/connections.js +1 -1
- package/lib/actions/content.js +1 -1
- package/lib/actions/contentGeneration.d.ts +22 -1
- package/lib/actions/contentGeneration.js +120 -32
- package/lib/actions/contentGenerationErrors.js +1 -1
- package/lib/actions/contentGenerationSources.d.ts +29 -0
- package/lib/actions/contentGenerationSources.js +103 -0
- package/lib/actions/conversations.js +1 -1
- package/lib/actions/crm.d.ts +6 -2
- package/lib/actions/crm.js +91 -12
- package/lib/actions/crmCanonicalOutcomes.d.ts +88 -0
- package/lib/actions/crmCanonicalOutcomes.js +398 -0
- package/lib/actions/crmCanonicalPolicy.d.ts +92 -0
- package/lib/actions/crmCanonicalPolicy.js +104 -0
- package/lib/actions/crmCheckoutRecovery.d.ts +72 -0
- package/lib/actions/crmCheckoutRecovery.js +413 -0
- package/lib/actions/crmCheckoutRecoveryPolicy.d.ts +38 -0
- package/lib/actions/crmCheckoutRecoveryPolicy.js +61 -0
- package/lib/actions/crmDeliveryEvents.d.ts +24 -0
- package/lib/actions/crmDeliveryEvents.js +207 -0
- package/lib/actions/crmDeliveryEvidence.d.ts +17 -0
- package/lib/actions/crmDeliveryEvidence.js +58 -0
- package/lib/actions/crmExecution.d.ts +125 -0
- package/lib/actions/crmExecution.js +830 -0
- package/lib/actions/crmFinancialEvidence.d.ts +12 -0
- package/lib/actions/crmFinancialEvidence.js +60 -0
- package/lib/actions/crmInsights.d.ts +60 -0
- package/lib/actions/crmInsights.js +225 -0
- package/lib/actions/crmLeadFollowups.d.ts +66 -0
- package/lib/actions/crmLeadFollowups.js +209 -0
- package/lib/actions/crmOutcomes.d.ts +106 -0
- package/lib/actions/crmOutcomes.js +289 -0
- package/lib/actions/crmRecoveryRetention.d.ts +13 -0
- package/lib/actions/crmRecoveryRetention.js +163 -0
- package/lib/actions/crmReminderDispatch.d.ts +10 -0
- package/lib/actions/crmReminderDispatch.js +65 -0
- package/lib/actions/crmSourceOwnership.d.ts +7 -0
- package/lib/actions/crmSourceOwnership.js +27 -0
- package/lib/actions/crmSupportInsights.d.ts +18 -0
- package/lib/actions/crmSupportInsights.js +47 -0
- package/lib/actions/crmWinback.d.ts +71 -0
- package/lib/actions/crmWinback.js +347 -0
- package/lib/actions/crmWinbackConsent.d.ts +29 -0
- package/lib/actions/crmWinbackConsent.js +158 -0
- package/lib/actions/crmWinbackPolicy.d.ts +33 -0
- package/lib/actions/crmWinbackPolicy.js +115 -0
- package/lib/actions/crmWinbackShopSource.d.ts +15 -0
- package/lib/actions/crmWinbackShopSource.js +63 -0
- package/lib/actions/crud.js +1 -1
- package/lib/actions/databaseAccounts.js +1 -1
- package/lib/actions/databaseProvisioningLease.js +1 -1
- package/lib/actions/dynamodb.js +1 -1
- package/lib/actions/email.d.ts +4 -1
- package/lib/actions/email.js +25 -3
- package/lib/actions/files.js +1 -1
- package/lib/actions/flags.js +1 -1
- package/lib/actions/geminiVideo.js +1 -1
- package/lib/actions/groups.js +1 -1
- package/lib/actions/higgsfield.js +1 -1
- package/lib/actions/imageGeneration.js +1 -1
- package/lib/actions/images.js +1 -1
- package/lib/actions/index.d.ts +56 -0
- package/lib/actions/index.js +42 -1
- package/lib/actions/ios.js +1 -1
- package/lib/actions/locations.js +1 -1
- package/lib/actions/merchantAccountExperiment.d.ts +50 -0
- package/lib/actions/merchantAccountExperiment.js +424 -0
- package/lib/actions/merchantAccountExperimentConfig.d.ts +7 -0
- package/lib/actions/merchantAccountExperimentConfig.js +32 -0
- package/lib/actions/merchantAccountExperimentHost.d.ts +69 -0
- package/lib/actions/merchantAccountExperimentHost.js +92 -0
- package/lib/actions/merchantAccountExperimentPolicy.d.ts +66 -0
- package/lib/actions/merchantAccountExperimentPolicy.js +121 -0
- package/lib/actions/merchantAccountExperimentRelay.d.ts +10 -0
- package/lib/actions/merchantAccountExperimentRelay.js +75 -0
- package/lib/actions/merchantCalendar.d.ts +34 -0
- package/lib/actions/merchantCalendar.js +119 -0
- package/lib/actions/merchantCalendarBookings.d.ts +17 -0
- package/lib/actions/merchantCalendarBookings.js +113 -0
- package/lib/actions/merchantCalendarDelegation.d.ts +80 -0
- package/lib/actions/merchantCalendarDelegation.js +353 -0
- package/lib/actions/merchantCalendarDiscovery.d.ts +38 -0
- package/lib/actions/merchantCalendarDiscovery.js +124 -0
- package/lib/actions/merchantCalendarEventHost.d.ts +105 -0
- package/lib/actions/merchantCalendarEventHost.js +16 -0
- package/lib/actions/merchantCalendarEventPrivacy.d.ts +7 -0
- package/lib/actions/merchantCalendarEventPrivacy.js +70 -0
- package/lib/actions/merchantCalendarEventRepository.d.ts +121 -0
- package/lib/actions/merchantCalendarEventRepository.js +295 -0
- package/lib/actions/merchantCalendarEventTransport.d.ts +65 -0
- package/lib/actions/merchantCalendarEventTransport.js +132 -0
- package/lib/actions/merchantCalendarEvents.d.ts +172 -0
- package/lib/actions/merchantCalendarEvents.js +365 -0
- package/lib/actions/merchantCalendarInvitationConsent.d.ts +28 -0
- package/lib/actions/merchantCalendarInvitationConsent.js +118 -0
- package/lib/actions/merchantCalendarManagedSource.d.ts +22 -0
- package/lib/actions/merchantCalendarManagedSource.js +24 -0
- package/lib/actions/merchantCalendarOAuth.d.ts +92 -0
- package/lib/actions/merchantCalendarOAuth.js +502 -0
- package/lib/actions/merchantCalendarOAuthConfig.d.ts +4 -0
- package/lib/actions/merchantCalendarOAuthConfig.js +30 -0
- package/lib/actions/merchantCalendarOAuthRepository.d.ts +57 -0
- package/lib/actions/merchantCalendarOAuthRepository.js +108 -0
- package/lib/actions/merchantCalendarOAuthTransport.d.ts +4 -0
- package/lib/actions/merchantCalendarOAuthTransport.js +25 -0
- package/lib/actions/merchantCalendarScopes.d.ts +4 -0
- package/lib/actions/merchantCalendarScopes.js +31 -0
- package/lib/actions/merchantFinance.d.ts +65 -0
- package/lib/actions/merchantFinance.js +244 -0
- package/lib/actions/merchantFinanceProvider.d.ts +57 -0
- package/lib/actions/merchantFinanceProvider.js +180 -0
- package/lib/actions/merchantOperations.d.ts +94 -0
- package/lib/actions/merchantOperations.js +489 -0
- package/lib/actions/messages.js +1 -1
- package/lib/actions/notifications.js +1 -1
- package/lib/actions/ollamaGeneration.js +1 -1
- package/lib/actions/openaiResponseSession.js +1 -1
- package/lib/actions/payments.js +1 -1
- package/lib/actions/personas.js +1 -1
- package/lib/actions/phoneSupport.js +1 -1
- package/lib/actions/posts.js +1 -1
- package/lib/actions/providerCredentials.d.ts +35 -0
- package/lib/actions/providerCredentials.js +166 -0
- package/lib/actions/query.js +1 -1
- package/lib/actions/reactions.js +1 -1
- package/lib/actions/rum.js +1 -1
- package/lib/actions/s3.d.ts +10 -7
- package/lib/actions/s3.js +59 -14
- package/lib/actions/search.js +1 -1
- package/lib/actions/sms.js +1 -1
- package/lib/actions/statistics.js +1 -1
- package/lib/actions/subscriptions.js +1 -1
- package/lib/actions/supportChannelSources.d.ts +66 -0
- package/lib/actions/supportChannelSources.js +183 -0
- package/lib/actions/supportCommerce.d.ts +62 -0
- package/lib/actions/supportCommerce.js +252 -0
- package/lib/actions/supportConnect.d.ts +39 -0
- package/lib/actions/supportConnect.js +224 -0
- package/lib/actions/supportContext.d.ts +31 -0
- package/lib/actions/supportContext.js +88 -0
- package/lib/actions/supportConversation.d.ts +102 -0
- package/lib/actions/supportConversation.js +100 -0
- package/lib/actions/supportEmailEvents.d.ts +20 -0
- package/lib/actions/supportEmailEvents.js +130 -0
- package/lib/actions/supportEmailHandoff.d.ts +114 -0
- package/lib/actions/supportEmailHandoff.js +356 -0
- package/lib/actions/supportOperations.d.ts +32 -0
- package/lib/actions/supportOperations.js +74 -0
- package/lib/actions/supportPolicy.d.ts +9 -0
- package/lib/actions/supportPolicy.js +44 -0
- package/lib/actions/supportPurposeConsent.d.ts +32 -0
- package/lib/actions/supportPurposeConsent.js +196 -0
- package/lib/actions/supportPurposePrivacy.d.ts +15 -0
- package/lib/actions/supportPurposePrivacy.js +181 -0
- package/lib/actions/supportSemanticReview.d.ts +64 -0
- package/lib/actions/supportSemanticReview.js +239 -0
- package/lib/actions/tags.js +1 -1
- package/lib/actions/users.js +22 -3
- package/lib/actions/videoGeneration.js +1 -1
- package/lib/actions/videos.js +1 -1
- package/lib/adapters/arangoAdapter.js +1 -1
- package/lib/adapters/contentAdapter.js +1 -1
- package/lib/adapters/fileAdapter.js +1 -1
- package/lib/adapters/geminiGenerationAdapter.js +1 -1
- package/lib/adapters/higgsfieldAdapter.js +1 -1
- package/lib/adapters/higgsfieldModelCatalog.js +1 -1
- package/lib/adapters/higgsfieldModels.js +1 -1
- package/lib/adapters/imageAdapter.js +1 -1
- package/lib/adapters/imageGenerationAdapter.js +1 -1
- package/lib/adapters/index.js +1 -1
- package/lib/adapters/messageAdapter.js +1 -1
- package/lib/adapters/postAdapter.js +1 -1
- package/lib/adapters/reaktorAdapter.js +1 -1
- package/lib/adapters/tagAdapter.js +1 -1
- package/lib/adapters/userAdapter.js +1 -1
- package/lib/assistant/core.js +1 -1
- package/lib/assistant/faq.js +1 -1
- package/lib/assistant/faqCore.js +1 -1
- package/lib/assistant/index.js +1 -1
- package/lib/assistant/service.js +1 -1
- package/lib/config.js +1 -1
- package/lib/constants/collections.d.ts +2 -1
- package/lib/constants/collections.js +2 -1
- package/lib/durableChat/conversations.js +1 -1
- package/lib/durableChat/errors.js +1 -1
- package/lib/durableChat/events.js +1 -1
- package/lib/durableChat/index.js +1 -1
- package/lib/durableChat/membership.js +1 -1
- package/lib/durableChat/messageTypes.js +1 -1
- package/lib/durableChat/messages.js +1 -1
- package/lib/durableChat/transaction.js +1 -1
- package/lib/durableChat/types.js +1 -1
- package/lib/handlers/graphqlHandler.js +1 -1
- package/lib/index.js +1 -1
- package/lib/lambdas/actions/websockets.js +1 -1
- package/lib/lambdas/authorizer.js +1 -1
- package/lib/lambdas/connection.js +1 -1
- package/lib/lambdas/utils/message.js +1 -1
- package/lib/lambdas/utils/websocket.js +1 -1
- package/lib/mocks/conversation.js +1 -1
- package/lib/mocks/file.js +1 -1
- package/lib/mocks/group.js +1 -1
- package/lib/mocks/image.js +1 -1
- package/lib/mocks/post.js +1 -1
- package/lib/mocks/tag.js +1 -1
- package/lib/mocks/user.js +1 -1
- package/lib/mocks/video.js +1 -1
- package/lib/mutations/analytics/analytics.js +1 -1
- package/lib/mutations/content/content.js +1 -1
- package/lib/mutations/crm/crm.js +395 -7
- package/lib/mutations/events/events.js +1 -1
- package/lib/mutations/flags/flags.js +1 -1
- package/lib/mutations/groups/groups.js +1 -1
- package/lib/mutations/higgsfield/higgsfield.js +1 -1
- package/lib/mutations/images/images.js +1 -1
- package/lib/mutations/index.js +1 -1
- package/lib/mutations/locations/locations.js +1 -1
- package/lib/mutations/messages/messages.js +1 -1
- package/lib/mutations/personas/personas.js +1 -1
- package/lib/mutations/posts/posts.js +1 -1
- package/lib/mutations/reactions/reactions.js +1 -1
- package/lib/mutations/rum/rum.js +1 -1
- package/lib/mutations/statistics/statistics.js +1 -1
- package/lib/mutations/subscriptions/subscriptions.js +1 -1
- package/lib/mutations/tags/tags.js +1 -1
- package/lib/mutations/users/users.js +1 -1
- package/lib/mutations/videos/videos.js +1 -1
- package/lib/nativePush/graphql.js +1 -1
- package/lib/nativePush/index.js +1 -1
- package/lib/nativePush/migrations.js +1 -1
- package/lib/nativePush/nativePushContract.fixture.js +1 -1
- package/lib/nativePush/payload.js +1 -1
- package/lib/nativePush/repository.js +1 -1
- package/lib/nativePush/service.js +1 -1
- package/lib/nativePush/snsProvider.js +1 -1
- package/lib/nativePush/types.js +1 -1
- package/lib/objectTypes/analytics.js +1 -1
- package/lib/objectTypes/app.js +1 -1
- package/lib/objectTypes/bankAccount.js +1 -1
- package/lib/objectTypes/connection.js +1 -1
- package/lib/objectTypes/content.js +1 -1
- package/lib/objectTypes/contentGeneration.js +1 -1
- package/lib/objectTypes/conversation.js +1 -1
- package/lib/objectTypes/creditCard.js +1 -1
- package/lib/objectTypes/crm.js +1 -1
- package/lib/objectTypes/document.js +1 -1
- package/lib/objectTypes/error.js +1 -1
- package/lib/objectTypes/event.js +1 -1
- package/lib/objectTypes/external.js +1 -1
- package/lib/objectTypes/file.js +1 -1
- package/lib/objectTypes/filter.js +1 -1
- package/lib/objectTypes/flag.js +1 -1
- package/lib/objectTypes/group.js +1 -1
- package/lib/objectTypes/higgsfield.js +1 -1
- package/lib/objectTypes/iapSubscription.js +1 -1
- package/lib/objectTypes/image.js +1 -1
- package/lib/objectTypes/imageGeneration.js +1 -1
- package/lib/objectTypes/index.js +1 -1
- package/lib/objectTypes/location.js +1 -1
- package/lib/objectTypes/message.js +1 -1
- package/lib/objectTypes/passcode.js +1 -1
- package/lib/objectTypes/persona.js +1 -1
- package/lib/objectTypes/plan.js +1 -1
- package/lib/objectTypes/post.js +1 -1
- package/lib/objectTypes/query.js +1 -1
- package/lib/objectTypes/reaction.js +1 -1
- package/lib/objectTypes/relation.js +1 -1
- package/lib/objectTypes/rum.js +1 -1
- package/lib/objectTypes/search.js +1 -1
- package/lib/objectTypes/statistics.js +1 -1
- package/lib/objectTypes/subscription.js +1 -1
- package/lib/objectTypes/tag.js +1 -1
- package/lib/objectTypes/user.js +1 -1
- package/lib/objectTypes/video.js +1 -1
- package/lib/objectTypes/videoGeneration.js +1 -1
- package/lib/organizations/accountLifecycle.js +1 -1
- package/lib/organizations/authorization.js +1 -1
- package/lib/organizations/billing.js +1 -1
- package/lib/organizations/billingProvider.js +1 -1
- package/lib/organizations/billingUpdates.js +1 -1
- package/lib/organizations/index.js +1 -1
- package/lib/organizations/mail.js +1 -1
- package/lib/organizations/memberDirectory.js +1 -1
- package/lib/organizations/membership.js +1 -1
- package/lib/organizations/passwordRecovery.js +1 -1
- package/lib/organizations/plans.js +1 -1
- package/lib/organizations/providerPagination.js +1 -1
- package/lib/organizations/reconciliation.js +1 -1
- package/lib/organizations/signup.js +1 -1
- package/lib/organizations/store.js +1 -1
- package/lib/organizations/types.js +1 -1
- package/lib/organizations/verification.js +1 -1
- package/lib/queries/analytics/analytics.js +1 -1
- package/lib/queries/content/content.js +1 -1
- package/lib/queries/crm/crm.js +251 -5
- package/lib/queries/events/events.js +1 -1
- package/lib/queries/flags/flags.js +1 -1
- package/lib/queries/groups/groups.js +1 -1
- package/lib/queries/higgsfield/higgsfield.js +1 -1
- package/lib/queries/images/images.js +1 -1
- package/lib/queries/index.js +1 -1
- package/lib/queries/locations/locations.js +1 -1
- package/lib/queries/messages/messages.js +1 -1
- package/lib/queries/personas/personas.js +1 -1
- package/lib/queries/posts/posts.js +1 -1
- package/lib/queries/query/query.js +1 -1
- package/lib/queries/reactions/reactions.js +1 -1
- package/lib/queries/statistics/statistics.js +1 -1
- package/lib/queries/subscriptions/subscriptions.js +1 -1
- package/lib/queries/tags/tags.js +1 -1
- package/lib/queries/users/users.js +1 -1
- package/lib/queries/videos/videos.js +1 -1
- package/lib/templates/email/layout.js +1 -1
- package/lib/templates/email/passwordForgot.js +1 -1
- package/lib/templates/email/passwordRecovery.js +1 -1
- package/lib/templates/email/verifyEmail.js +1 -1
- package/lib/templates/email/welcome.js +1 -1
- package/lib/templates/sms/passwordForgot.js +1 -1
- package/lib/templates/sms/passwordRecovery.js +1 -1
- package/lib/templates/sms/verifyEmail.js +1 -1
- package/lib/templates/sms/verifyPhone.js +1 -1
- package/lib/templates/sms/welcome.js +1 -1
- package/lib/types/analytics.types.js +1 -1
- package/lib/types/apps.types.js +1 -1
- package/lib/types/arangodb.types.js +1 -1
- package/lib/types/auth.types.d.ts +2 -0
- package/lib/types/auth.types.js +1 -1
- package/lib/types/connections.types.js +1 -1
- package/lib/types/content.types.js +1 -1
- package/lib/types/conversations.types.js +1 -1
- package/lib/types/crm.types.d.ts +6 -0
- package/lib/types/crm.types.js +1 -1
- package/lib/types/databaseCredentials.types.js +1 -1
- package/lib/types/email.types.js +1 -1
- package/lib/types/error.types.js +1 -1
- package/lib/types/files.types.js +1 -1
- package/lib/types/flags.types.js +1 -1
- package/lib/types/google.types.js +1 -1
- package/lib/types/groups.types.js +1 -1
- package/lib/types/images.types.js +1 -1
- package/lib/types/index.js +1 -1
- package/lib/types/locations.types.js +1 -1
- package/lib/types/messages.types.js +1 -1
- package/lib/types/notifications.types.js +1 -1
- package/lib/types/payments.types.js +1 -1
- package/lib/types/personas.types.js +1 -1
- package/lib/types/posts.types.js +1 -1
- package/lib/types/rum.types.js +1 -1
- package/lib/types/statistics.types.js +1 -1
- package/lib/types/tags.types.js +1 -1
- package/lib/types/users.types.d.ts +2 -0
- package/lib/types/users.types.js +1 -1
- package/lib/types/videos.types.js +1 -1
- package/lib/types/websockets.types.js +1 -1
- package/lib/upload.js +1 -1
- package/lib/utils/adapterUtils.js +1 -1
- package/lib/utils/analyticsUtils.js +1 -1
- package/lib/utils/appContext.js +1 -1
- package/lib/utils/aqlHelpers.js +1 -1
- package/lib/utils/arangodbUtils.js +1 -1
- package/lib/utils/authUtils.js +17 -1
- package/lib/utils/awsUtils.js +1 -1
- package/lib/utils/collectionRegistry.js +1 -1
- package/lib/utils/contextUtils.js +1 -1
- package/lib/utils/databaseCredentials.js +1 -1
- package/lib/utils/dbI18n.example.js +1 -1
- package/lib/utils/dbI18n.js +1 -1
- package/lib/utils/generationCallback.js +1 -1
- package/lib/utils/googleTranslate.js +1 -1
- package/lib/utils/graphqlUtils.d.ts +2 -0
- package/lib/utils/graphqlUtils.js +1 -1
- package/lib/utils/imageUtils.js +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/utils/languageDetection.js +1 -1
- package/lib/utils/localeUtils.example.js +1 -1
- package/lib/utils/localeUtils.js +1 -1
- package/lib/utils/mediaAccess.js +1 -1
- package/lib/utils/middlewareUtils.js +1 -1
- package/lib/utils/nodeRealtime.js +1 -1
- package/lib/utils/opaqueToken.js +1 -1
- package/lib/utils/queryBuilder.js +1 -1
- package/lib/utils/schemaUtils.js +1 -1
- package/lib/utils/secretDatabase.js +1 -1
- package/lib/utils/sessionUtils.js +1 -1
- package/lib/utils/stripeUtils.js +1 -1
- package/lib/utils/templateUtils.js +1 -1
- package/lib/utils/testUtils.js +1 -1
- package/lib/utils/translationQueue.example.js +1 -1
- package/lib/utils/translationQueue.js +1 -1
- package/lib/videoProcessing.js +1 -1
- package/package.json +8 -6
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { generateOllamaContent } from './ollamaGeneration.js';
|
|
2
|
-
import { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
3
|
-
export { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
4
1
|
import { post } from '@nlabs/rip-hunter';
|
|
5
2
|
import { Config } from '../config.js';
|
|
3
|
+
import { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
4
|
+
import { geminiSourceEvidence, validateGeminiContextUrls } from './contentGenerationSources.js';
|
|
5
|
+
import { generateOllamaContent } from './ollamaGeneration.js';
|
|
6
6
|
const validMessageContent = (message)=>{
|
|
7
7
|
if (typeof message.content === 'string') {
|
|
8
8
|
return !!message.content.trim();
|
|
@@ -33,13 +33,37 @@ const validMessageContent = (message)=>{
|
|
|
33
33
|
}
|
|
34
34
|
if (input.outputTextMode !== undefined && (![
|
|
35
35
|
'claude',
|
|
36
|
+
'gemini',
|
|
36
37
|
'openai',
|
|
37
38
|
'grok'
|
|
38
|
-
].includes(input.provider) || ![
|
|
39
|
+
].includes(input.provider) || input.modality === 'image' || ![
|
|
39
40
|
'preserve',
|
|
40
41
|
'trim'
|
|
41
42
|
].includes(input.outputTextMode))) {
|
|
42
|
-
throw new ContentGenerationRejectedError('outputTextMode requires Claude, OpenAI or Grok and preserve or trim.');
|
|
43
|
+
throw new ContentGenerationRejectedError('outputTextMode requires a Claude, Gemini, OpenAI or Grok text request and preserve or trim.');
|
|
44
|
+
}
|
|
45
|
+
if (input.outputTextSeparator !== undefined && (input.outputTextMode !== 'preserve' || ![
|
|
46
|
+
'claude',
|
|
47
|
+
'gemini'
|
|
48
|
+
].includes(input.provider) || ![
|
|
49
|
+
'',
|
|
50
|
+
'\n'
|
|
51
|
+
].includes(input.outputTextSeparator))) {
|
|
52
|
+
throw new ContentGenerationRejectedError('outputTextSeparator requires Claude or Gemini preserve mode and an empty or newline separator.');
|
|
53
|
+
}
|
|
54
|
+
if (input.outputTextFilter !== undefined && (input.outputTextFilter !== 'nonblank' || input.outputTextMode !== 'preserve' || ![
|
|
55
|
+
'claude',
|
|
56
|
+
'gemini'
|
|
57
|
+
].includes(input.provider))) {
|
|
58
|
+
throw new ContentGenerationRejectedError('outputTextFilter requires Claude or Gemini preserve mode and nonblank.');
|
|
59
|
+
}
|
|
60
|
+
if (input.thinkingLevel !== undefined && (input.provider !== 'gemini' || input.modality === 'image' || ![
|
|
61
|
+
'minimal',
|
|
62
|
+
'low',
|
|
63
|
+
'medium',
|
|
64
|
+
'high'
|
|
65
|
+
].includes(input.thinkingLevel))) {
|
|
66
|
+
throw new ContentGenerationRejectedError('thinkingLevel requires a Gemini text request and a supported level.');
|
|
43
67
|
}
|
|
44
68
|
if (input.messages !== undefined) {
|
|
45
69
|
if (input.prompt !== undefined || !Array.isArray(input.messages) || !input.messages.length || input.messages.some((message)=>!message || ![
|
|
@@ -53,12 +77,18 @@ const validMessageContent = (message)=>{
|
|
|
53
77
|
} else if (typeof input.prompt !== 'string' || !input.prompt.trim()) {
|
|
54
78
|
throw new ContentGenerationRejectedError('A non-empty prompt is required.');
|
|
55
79
|
}
|
|
56
|
-
if (input.provider !== 'openai' && (input.messages !== undefined || input.reasoningEffort !== undefined || [
|
|
80
|
+
if (input.provider !== 'openai' && (input.messages !== undefined && input.provider !== 'gemini' || input.reasoningEffort !== undefined || [
|
|
57
81
|
'claude',
|
|
58
82
|
'grok'
|
|
59
83
|
].includes(input.provider) && input.responseFormat !== undefined)) {
|
|
60
84
|
throw new ContentGenerationRejectedError('Messages and reasoning effort require OpenAI; Claude and Grok do not support response format options.');
|
|
61
85
|
}
|
|
86
|
+
if (input.provider === 'gemini' && input.messages !== undefined && (input.modality === 'image' || input.images !== undefined || input.messages.some((message)=>![
|
|
87
|
+
'user',
|
|
88
|
+
'assistant'
|
|
89
|
+
].includes(message.role) || Array.isArray(message.content) && message.content.some((part)=>part.type !== 'text')))) {
|
|
90
|
+
throw new ContentGenerationRejectedError('Gemini messages require user or assistant roles with text-only content.');
|
|
91
|
+
}
|
|
62
92
|
if (input.timeoutMs !== undefined && (!Number.isInteger(input.timeoutMs) || input.timeoutMs < 1 || input.timeoutMs > 2_147_483_647)) {
|
|
63
93
|
throw new ContentGenerationRejectedError('timeoutMs must be a positive 32-bit integer.');
|
|
64
94
|
}
|
|
@@ -108,7 +138,12 @@ const validMessageContent = (message)=>{
|
|
|
108
138
|
].includes(input.provider) || input.modality === 'image' || input.search)) {
|
|
109
139
|
throw new ContentGenerationRejectedError('This provider operation supports text input and output only.');
|
|
110
140
|
}
|
|
111
|
-
if (input.provider === '
|
|
141
|
+
if (input.urlContext !== undefined && (input.provider !== 'gemini' || input.modality === 'image' || input.messages !== undefined)) {
|
|
142
|
+
throw new ContentGenerationRejectedError('URL context requires Gemini text generation with a prompt.');
|
|
143
|
+
}
|
|
144
|
+
if (input.provider === 'ollama') {
|
|
145
|
+
return generateOllamaContent(input, config);
|
|
146
|
+
}
|
|
112
147
|
const { prompt, images = [] } = input;
|
|
113
148
|
if (input.provider === 'claude') {
|
|
114
149
|
if (!config.claudeKey) {
|
|
@@ -148,8 +183,8 @@ const validMessageContent = (message)=>{
|
|
|
148
183
|
].includes(part.type || '') || part.type === 'text' && typeof part.text !== 'string'))) {
|
|
149
184
|
throw new ContentGenerationResponseError('Claude response could not be confirmed.');
|
|
150
185
|
}
|
|
151
|
-
const chunks = response.content?.filter((part)=>part.type === 'text').map((part)=>part.text || '') || [];
|
|
152
|
-
const text = preserve ? chunks.join('') : chunks.join('\n').trim();
|
|
186
|
+
const chunks = (response.content?.filter((part)=>part.type === 'text').map((part)=>part.text || '') || []).filter((text)=>input.outputTextFilter !== 'nonblank' || !!text.trim());
|
|
187
|
+
const text = preserve ? chunks.join(input.outputTextSeparator ?? '') : chunks.join('\n').trim();
|
|
153
188
|
if (response.error || response.type !== 'message' || response.stop_reason !== 'end_turn' || !text.trim()) {
|
|
154
189
|
throw new ContentGenerationResponseError('Claude response could not be confirmed.');
|
|
155
190
|
}
|
|
@@ -260,8 +295,26 @@ const validMessageContent = (message)=>{
|
|
|
260
295
|
if (!/^[a-zA-Z0-9._-]+$/.test(model)) {
|
|
261
296
|
throw new ContentGenerationRejectedError('Invalid Gemini model configuration.');
|
|
262
297
|
}
|
|
298
|
+
const urls = input.urlContext === undefined ? undefined : validateGeminiContextUrls(input.urlContext);
|
|
299
|
+
if (urls && model !== 'gemini-2.5-flash') {
|
|
300
|
+
throw new ContentGenerationRejectedError('URL context requires the verified Gemini 2.5 Flash model.');
|
|
301
|
+
}
|
|
302
|
+
if (urls) {
|
|
303
|
+
parts.push({
|
|
304
|
+
text: `Inspect only these explicitly selected URLs, without following links: ${JSON.stringify(urls)}`
|
|
305
|
+
});
|
|
306
|
+
}
|
|
263
307
|
const response = await post(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`, {
|
|
264
|
-
contents:
|
|
308
|
+
contents: input.messages?.map((message)=>({
|
|
309
|
+
parts: typeof message.content === 'string' ? [
|
|
310
|
+
{
|
|
311
|
+
text: message.content
|
|
312
|
+
}
|
|
313
|
+
] : message.content.map((part)=>({
|
|
314
|
+
text: part.text
|
|
315
|
+
})),
|
|
316
|
+
role: message.role === 'assistant' ? 'model' : 'user'
|
|
317
|
+
})) ?? [
|
|
265
318
|
{
|
|
266
319
|
parts,
|
|
267
320
|
role: 'user'
|
|
@@ -296,13 +349,25 @@ const validMessageContent = (message)=>{
|
|
|
296
349
|
} : {},
|
|
297
350
|
...input.topP !== undefined ? {
|
|
298
351
|
topP: input.topP
|
|
352
|
+
} : {},
|
|
353
|
+
...input.thinkingLevel !== undefined ? {
|
|
354
|
+
thinkingConfig: {
|
|
355
|
+
thinkingLevel: input.thinkingLevel
|
|
356
|
+
}
|
|
299
357
|
} : {}
|
|
300
358
|
},
|
|
301
|
-
...input.search ? {
|
|
359
|
+
...input.search || urls ? {
|
|
302
360
|
tools: [
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
361
|
+
...input.search ? [
|
|
362
|
+
{
|
|
363
|
+
googleSearch: {}
|
|
364
|
+
}
|
|
365
|
+
] : [],
|
|
366
|
+
...urls ? [
|
|
367
|
+
{
|
|
368
|
+
urlContext: {}
|
|
369
|
+
}
|
|
370
|
+
] : []
|
|
306
371
|
]
|
|
307
372
|
} : {}
|
|
308
373
|
}, {
|
|
@@ -327,6 +392,14 @@ const validMessageContent = (message)=>{
|
|
|
327
392
|
if (candidate.finishReason !== 'STOP') {
|
|
328
393
|
throw new ContentGenerationResponseError('Gemini response could not be confirmed: generation did not complete.');
|
|
329
394
|
}
|
|
395
|
+
const preserve = input.outputTextMode === 'preserve';
|
|
396
|
+
if (preserve && (!Array.isArray(candidate.content?.parts) || candidate.content.parts.some((part)=>!part || part.thought !== undefined && typeof part.thought !== 'boolean' || Object.keys(part).some((key)=>![
|
|
397
|
+
'text',
|
|
398
|
+
'thought',
|
|
399
|
+
'thoughtSignature'
|
|
400
|
+
].includes(key)) || !part.thought && typeof part.text !== 'string'))) {
|
|
401
|
+
throw new ContentGenerationResponseError('Gemini response text parts could not be confirmed.');
|
|
402
|
+
}
|
|
330
403
|
const output = (candidate.content?.parts || []).filter((part)=>!part.thought);
|
|
331
404
|
const inline = output.find((part)=>part.inlineData)?.inlineData;
|
|
332
405
|
let image;
|
|
@@ -343,29 +416,44 @@ const validMessageContent = (message)=>{
|
|
|
343
416
|
mime: inline.mimeType
|
|
344
417
|
};
|
|
345
418
|
}
|
|
346
|
-
const
|
|
347
|
-
|
|
419
|
+
const chunks = output.map((part)=>part.text || '').filter((text)=>input.outputTextFilter !== 'nonblank' || !!text.trim());
|
|
420
|
+
const text = preserve ? chunks.join(input.outputTextSeparator ?? '') : chunks.join('\n').trim();
|
|
421
|
+
if (input.modality === 'image' ? !image : !text.trim()) {
|
|
348
422
|
throw new ContentGenerationResponseError('The requested output was not returned.');
|
|
349
423
|
}
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
424
|
+
const evidence = geminiSourceEvidence(candidate);
|
|
425
|
+
const metadata = response.usageMetadata;
|
|
426
|
+
const counts = metadata ? {
|
|
427
|
+
candidatesTokenCount: metadata.candidatesTokenCount,
|
|
428
|
+
promptTokenCount: metadata.promptTokenCount,
|
|
429
|
+
thoughtsTokenCount: metadata.thoughtsTokenCount ?? 0,
|
|
430
|
+
toolUsePromptTokenCount: metadata.toolUsePromptTokenCount ?? 0,
|
|
431
|
+
totalTokenCount: metadata.totalTokenCount
|
|
432
|
+
} : undefined;
|
|
433
|
+
const usage = counts && Object.values(counts).every((count)=>Number.isSafeInteger(count) && count >= 0) && [
|
|
434
|
+
counts.promptTokenCount + counts.candidatesTokenCount + counts.thoughtsTokenCount,
|
|
435
|
+
counts.promptTokenCount + counts.candidatesTokenCount + counts.thoughtsTokenCount + counts.toolUsePromptTokenCount
|
|
436
|
+
].includes(counts.totalTokenCount) ? {
|
|
437
|
+
...counts,
|
|
438
|
+
model,
|
|
439
|
+
provider: 'gemini'
|
|
440
|
+
} : undefined;
|
|
363
441
|
return {
|
|
364
442
|
image,
|
|
365
443
|
searchSuggestionsHtml: candidate.groundingMetadata?.searchEntryPoint?.renderedContent,
|
|
366
|
-
sources,
|
|
367
|
-
text
|
|
444
|
+
sources: evidence.sources,
|
|
445
|
+
text,
|
|
446
|
+
...evidence.grounding ? {
|
|
447
|
+
grounding: evidence.grounding
|
|
448
|
+
} : {},
|
|
449
|
+
...evidence.urlContext ? {
|
|
450
|
+
urlContext: evidence.urlContext
|
|
451
|
+
} : {},
|
|
452
|
+
...usage ? {
|
|
453
|
+
usage
|
|
454
|
+
} : {}
|
|
368
455
|
};
|
|
369
456
|
};
|
|
457
|
+
export { ContentGenerationRejectedError, ContentGenerationResponseError, validateGeminiContextUrls };
|
|
370
458
|
|
|
371
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dlbmVyYXRlT2xsYW1hQ29udGVudH0gZnJvbSAnLi9vbGxhbWFHZW5lcmF0aW9uLmpzJztcbmltcG9ydCB7Q29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yLCBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3J9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb25FcnJvcnMuanMnO1xuZXhwb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBncm9rS2V5Pzogc3RyaW5nO1xuICBncm9rTW9kZWw/OiBzdHJpbmc7XG4gIG9sbGFtYT86IHtlbmRwb2ludDogc3RyaW5nOyBwcm90b2NvbDogJ2dlbmVyYXRlJyB8ICdjaGF0JyB8ICdvcGVuYWktY2hhdCd9O1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25QYXJ0ID0ge3RleHQ6IHN0cmluZzsgdHlwZTogJ3RleHQnfSB8IHtcbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2hpZ2gnIHwgJ2xvdyc7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHVybDogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25NZXNzYWdlIHtcbiAgY29udGVudDogc3RyaW5nIHwgQ29udGVudEdlbmVyYXRpb25QYXJ0W107XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBvdXRwdXRUZXh0TW9kZT86ICdwcmVzZXJ2ZScgfCAndHJpbSc7XG4gIHByb21wdD86IHN0cmluZztcbiAgcHJvdmlkZXI6ICdjbGF1ZGUnIHwgJ2dlbWluaScgfCAnZ3JvaycgfCAnb2xsYW1hJyB8ICdvcGVuYWknO1xuICByZWFzb25pbmdFZmZvcnQ/OiBDb250ZW50R2VuZXJhdGlvblJlYXNvbmluZ0VmZm9ydDtcbiAgcmVzcG9uc2VGb3JtYXQ/OiBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRm9ybWF0O1xuICBzZWFyY2g/OiBib29sZWFuO1xuICBzeXN0ZW0/OiBzdHJpbmc7XG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIHRvcFA/OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlZENvbnRlbnQge1xuICBpbWFnZT86IHtieXRlczogQnVmZmVyOyBtaW1lOiAnaW1hZ2UvanBlZycgfCAnaW1hZ2UvcG5nJ307XG4gIHNlYXJjaFN1Z2dlc3Rpb25zSHRtbD86IHN0cmluZztcbiAgc291cmNlczoge3RpdGxlOiBzdHJpbmc7IHVybDogc3RyaW5nfVtdO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgR2VtaW5pUGFydCB7aW5saW5lRGF0YT86IHtkYXRhOiBzdHJpbmc7IG1pbWVUeXBlOiBzdHJpbmd9OyB0ZXh0Pzogc3RyaW5nOyB0aG91Z2h0PzogYm9vbGVhbn1cbmludGVyZmFjZSBHZW1pbmlSZXNwb25zZSB7XG4gIGNhbmRpZGF0ZXM/OiB7XG4gICAgY29udGVudD86IHtwYXJ0cz86IEdlbWluaVBhcnRbXX07XG4gICAgZmluaXNoUmVhc29uPzogc3RyaW5nO1xuICAgIGdyb3VuZGluZ01ldGFkYXRhPzoge1xuICAgICAgZ3JvdW5kaW5nQ2h1bmtzPzoge3dlYj86IHt0aXRsZT86IHN0cmluZzsgdXJpPzogc3RyaW5nfX1bXTtcbiAgICAgIHNlYXJjaEVudHJ5UG9pbnQ/OiB7cmVuZGVyZWRDb250ZW50Pzogc3RyaW5nfTtcbiAgICB9O1xuICB9W107XG4gIGVycm9yPzoge2NvZGU/OiBudW1iZXJ9O1xuICBwcm9tcHRGZWVkYmFjaz86IHtibG9ja1JlYXNvbj86IHN0cmluZ307XG59XG5cbmNvbnN0IHZhbGlkTWVzc2FnZUNvbnRlbnQgPSAobWVzc2FnZTogQ29udGVudEdlbmVyYXRpb25NZXNzYWdlKTogYm9vbGVhbiA9PiB7XG4gIGlmKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICEhbWVzc2FnZS5jb250ZW50LnRyaW0oKTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpICYmIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwICYmIG1lc3NhZ2UuY29udGVudC5ldmVyeSgocGFydCkgPT4ge1xuICAgIGlmKCFwYXJ0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmKHBhcnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnQudGV4dCA9PT0gJ3N0cmluZycgJiYgISFwYXJ0LnRleHQudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydC50eXBlID09PSAnaW1hZ2UnICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ3VzZXInICYmIHR5cGVvZiBwYXJ0LnVybCA9PT0gJ3N0cmluZydcbiAgICAgICYmIC9eKGh0dHBzPzpcXC9cXC9bXlxcc10rfGRhdGE6aW1hZ2VcXC8ocG5nfGpwZWd8d2VicHxnaWYpO2Jhc2U2NCxbQS1aYS16MC05Ky9dKz17MCwyfSkkLy50ZXN0KHBhcnQudXJsKVxuICAgICAgJiYgKHBhcnQuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgWydhdXRvJywgJ2hpZ2gnLCAnbG93J10uaW5jbHVkZXMocGFydC5kZXRhaWwpKTtcbiAgfSk7XG59O1xuXG4vKiogU2luZ2xlIHN1Ym1pc3Npb24gdGhyb3VnaCBSaXAtSHVudGVyOyBjYWxsZXJzIG93biBkdXJhYmxlIGpvYnMgYW5kIHJlY29uY2lsaWF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ29udGVudCA9IGFzeW5jIChcbiAgaW5wdXQ6IENvbnRlbnRHZW5lcmF0aW9uSW5wdXQsXG4gIGNvbmZpZzogQ29udGVudEdlbmVyYXRpb25Db25maWcgPSBDb25maWcuZ2V0PENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnPignY29udGVudEdlbmVyYXRpb24nKSB8fCB7fVxuKTogUHJvbWlzZTxHZW5lcmF0ZWRDb250ZW50PiA9PiB7XG4gIGlmKCFbJ2NsYXVkZScsICdnZW1pbmknLCAnZ3JvaycsICdvbGxhbWEnLCAnb3BlbmFpJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignQSBzdXBwb3J0ZWQgcHJvdmlkZXIgaXMgcmVxdWlyZWQuJyk7XG4gIH1cbiAgaWYoaW5wdXQub3V0cHV0VGV4dE1vZGUgIT09IHVuZGVmaW5lZFxuICAgICYmICghWydjbGF1ZGUnLCAnb3BlbmFpJywgJ2dyb2snXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgIVsncHJlc2VydmUnLCAndHJpbSddLmluY2x1ZGVzKGlucHV0Lm91dHB1dFRleHRNb2RlKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdvdXRwdXRUZXh0TW9kZSByZXF1aXJlcyBDbGF1ZGUsIE9wZW5BSSBvciBHcm9rIGFuZCBwcmVzZXJ2ZSBvciB0cmltLicpO1xuICB9XG4gIGlmKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZihpbnB1dC5wcm9tcHQgIT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXNzYWdlcykgfHwgIWlucHV0Lm1lc3NhZ2VzLmxlbmd0aFxuICAgICAgfHwgaW5wdXQubWVzc2FnZXMuc29tZSgobWVzc2FnZSkgPT5cbiAgICAgICAgIW1lc3NhZ2UgfHwgIVsnYXNzaXN0YW50JywgJ2RldmVsb3BlcicsICdzeXN0ZW0nLCAndXNlciddLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgfHwgIXZhbGlkTWVzc2FnZUNvbnRlbnQobWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdTdXBwbHkgZWl0aGVyIGEgbm9uLWVtcHR5IHByb21wdCBvciBub24tZW1wdHkgdGV4dCBtZXNzYWdlcyB3aXRoIHN1cHBvcnRlZCByb2xlcy4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZih0eXBlb2YgaW5wdXQucHJvbXB0ICE9PSAnc3RyaW5nJyB8fCAhaW5wdXQucHJvbXB0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egbm9uLWVtcHR5IHByb21wdCBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ29wZW5haSdcbiAgICAmJiAoaW5wdXQubWVzc2FnZXMgIT09IHVuZGVmaW5lZCB8fCBpbnB1dC5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgKFsnY2xhdWRlJywgJ2dyb2snXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgJiYgaW5wdXQucmVzcG9uc2VGb3JtYXQgIT09IHVuZGVmaW5lZCkpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcihcbiAgICAgICdNZXNzYWdlcyBhbmQgcmVhc29uaW5nIGVmZm9ydCByZXF1aXJlIE9wZW5BSTsgQ2xhdWRlIGFuZCBHcm9rIGRvIG5vdCBzdXBwb3J0IHJlc3BvbnNlIGZvcm1hdCBvcHRpb25zLidcbiAgICApO1xuICB9XG4gIGlmKGlucHV0LnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0LnRpbWVvdXRNcykgfHwgaW5wdXQudGltZW91dE1zIDwgMSB8fCBpbnB1dC50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiYgIVsnbm9uZScsICdtaW5pbWFsJywgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICd4aGlnaCcsICdtYXgnXS5pbmNsdWRlcyhpbnB1dC5yZWFzb25pbmdFZmZvcnQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVW5zdXBwb3J0ZWQgcmVhc29uaW5nIGVmZm9ydC4nKTtcbiAgfVxuICBjb25zdCBmb3JtYXQgPSBpbnB1dC5yZXNwb25zZUZvcm1hdDtcbiAgaWYoZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKCFmb3JtYXQgfHwgIVsndGV4dCcsICdqc29uX29iamVjdCcsICdqc29uX3NjaGVtYSddLmluY2x1ZGVzKGZvcm1hdC50eXBlKSB8fCAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgJiYgKFxuICAgIHR5cGVvZiBmb3JtYXQubmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW2EtekEtWjAtOV8tXXsxLDY0fSQvLnRlc3QoZm9ybWF0Lm5hbWUpIHx8ICFmb3JtYXQuc2NoZW1hIHx8IHR5cGVvZiBmb3JtYXQuc2NoZW1hICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZvcm1hdC5zY2hlbWEpXG4gICAgfHwgKGZvcm1hdC5zdHJpY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZm9ybWF0LnN0cmljdCAhPT0gJ2Jvb2xlYW4nKVxuICApKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdC4gSlNPTiBzY2hlbWFzIHJlcXVpcmUgYSBuYW1lIGFuZCBzY2hlbWEgb2JqZWN0LicpO1xuICB9XG4gIGlmKFsnZ2VtaW5pJywgJ29sbGFtYSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSAmJiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBzdXBwb3J0cyB0ZXh0IG9yIGpzb25fb2JqZWN0IGZvciB0ZXh0IGdlbmVyYXRpb24gb25seS4nKTtcbiAgfVxuICBpZihpbnB1dC50b3BQICE9PSB1bmRlZmluZWQgJiYgKCFbJ2dlbWluaScsICdvbGxhbWEnXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgIU51bWJlci5pc0Zpbml0ZShpbnB1dC50b3BQKSB8fCBpbnB1dC50b3BQIDwgMCB8fCBpbnB1dC50b3BQID4gMSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCd0b3BQIHJlcXVpcmVzIGEgR2VtaW5pIG9yIE9sbGFtYSB0ZXh0IHJlcXVlc3QgYW5kIGEgZmluaXRlIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4nKTtcbiAgfVxuICBpZihpbnB1dC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkICYmICghWydnZW1pbmknLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQudGVtcGVyYXR1cmUpIHx8IGlucHV0LnRlbXBlcmF0dXJlIDwgMCB8fCAoaW5wdXQucHJvdmlkZXIgPT09ICdnZW1pbmknICYmIGlucHV0LnRlbXBlcmF0dXJlID4gMikpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGVtcGVyYXR1cmUgcmVxdWlyZXMgYSBub25uZWdhdGl2ZSBmaW5pdGUgdmFsdWUgZm9yIE9sbGFtYSB0ZXh0IG9yIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyIGZvciBHZW1pbmkgdGV4dC4nKTtcbiAgfVxuICBpZihpbnB1dC5tYXhUb2tlbnMgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQubWF4VG9rZW5zKSB8fCBpbnB1dC5tYXhUb2tlbnMgPCAxKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ21heFRva2VucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaSdcbiAgICAmJiAoKGlucHV0LmltYWdlcz8ubGVuZ3RoICYmICFbJ2dyb2snLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpKSB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCBpbnB1dC5zZWFyY2gpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBvcGVyYXRpb24gc3VwcG9ydHMgdGV4dCBpbnB1dCBhbmQgb3V0cHV0IG9ubHkuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdvbGxhbWEnKSByZXR1cm4gZ2VuZXJhdGVPbGxhbWFDb250ZW50KGlucHV0LCBjb25maWcpO1xuICBjb25zdCB7cHJvbXB0LCBpbWFnZXMgPSBbXX0gPSBpbnB1dDtcbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdjbGF1ZGUnKSB7XG4gICAgaWYoIWNvbmZpZy5jbGF1ZGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci4nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0KCdodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzJywge1xuICAgICAgbWF4X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtZXNzYWdlczogW3tjb250ZW50OiBwcm9tcHQsIHJvbGU6ICd1c2VyJ31dLFxuICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsIHx8IGNvbmZpZy5jbGF1ZGVNb2RlbCB8fCAnY2xhdWRlLXNvbm5ldC01JyxcbiAgICAgIHN5c3RlbTogaW5wdXQuc3lzdGVtXG4gICAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeydhbnRocm9waWMtdmVyc2lvbic6ICcyMDIzLTA2LTAxJywgJ3gtYXBpLWtleSc6IGNvbmZpZy5jbGF1ZGVLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyB7XG4gICAgICBjb250ZW50Pzoge3RleHQ/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9W107XG4gICAgICBlcnJvcj86IHt0eXBlPzogc3RyaW5nfTtcbiAgICAgIHN0b3BfcmVhc29uPzogc3RyaW5nO1xuICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9O1xuICAgIGlmKHJlc3BvbnNlLmVycm9yICYmIFsnYXV0aGVudGljYXRpb25fZXJyb3InLCAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJywgJ25vdF9mb3VuZF9lcnJvcicsICdwZXJtaXNzaW9uX2Vycm9yJ10uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IudHlwZSB8fCAnJykpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIG1vZGVsIGFuZCBhY2NvdW50IGFjY2Vzcy4nKTtcbiAgICB9XG4gICAgY29uc3QgcHJlc2VydmUgPSBpbnB1dC5vdXRwdXRUZXh0TW9kZSA9PT0gJ3ByZXNlcnZlJztcbiAgICBpZihwcmVzZXJ2ZSAmJiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UuY29udGVudCkgfHwgcmVzcG9uc2UuY29udGVudC5zb21lKChwYXJ0KSA9PlxuICAgICAgIXBhcnQgfHwgIVsndGV4dCcsICd0aGlua2luZycsICdyZWRhY3RlZF90aGlua2luZyddLmluY2x1ZGVzKHBhcnQudHlwZSB8fCAnJykgfHwgKHBhcnQudHlwZSA9PT0gJ3RleHQnICYmIHR5cGVvZiBwYXJ0LnRleHQgIT09ICdzdHJpbmcnKSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdDbGF1ZGUgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzID0gcmVzcG9uc2UuY29udGVudD8uZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICd0ZXh0JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRleHQgfHwgJycpIHx8IFtdO1xuICAgIGNvbnN0IHRleHQgPSBwcmVzZXJ2ZSA/IGNodW5rcy5qb2luKCcnKSA6IGNodW5rcy5qb2luKCdcXG4nKS50cmltKCk7XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgfHwgcmVzcG9uc2UudHlwZSAhPT0gJ21lc3NhZ2UnIHx8IHJlc3BvbnNlLnN0b3BfcmVhc29uICE9PSAnZW5kX3R1cm4nIHx8ICF0ZXh0LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignQ2xhdWRlIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnb3BlbmFpJyB8fCBpbnB1dC5wcm92aWRlciA9PT0gJ2dyb2snKSB7XG4gICAgY29uc3QgZ3JvayA9IGlucHV0LnByb3ZpZGVyID09PSAnZ3Jvayc7XG4gICAgY29uc3Qga2V5ID0gZ3JvayA/IGNvbmZpZy5ncm9rS2V5IDogY29uZmlnLm9wZW5haUtleTtcbiAgICBpZigha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuYCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdChncm9rID8gJ2h0dHBzOi8vYXBpLnguYWkvdjEvcmVzcG9uc2VzJyA6ICdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL3Jlc3BvbnNlcycsIHtcbiAgICAgIGlucHV0OiBncm9rICYmIGltYWdlcy5sZW5ndGggPyBbe2NvbnRlbnQ6IFt7dGV4dDogcHJvbXB0LCB0eXBlOiAnaW5wdXRfdGV4dCd9LCAuLi5pbWFnZXMubWFwKChpbWFnZSkgPT4gKHtpbWFnZV91cmw6IGBkYXRhOiR7aW1hZ2UubWltZX07YmFzZTY0LCR7aW1hZ2UuYnl0ZXMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsIHR5cGU6ICdpbnB1dF9pbWFnZSd9KSldLCByb2xlOiAndXNlcid9XSA6IGlucHV0Lm1lc3NhZ2VzPy5tYXAoKG1lc3NhZ2UpID0+ICh7Y29udGVudDogdHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gJ3N0cmluZycgPyBtZXNzYWdlLmNvbnRlbnQgOiBtZXNzYWdlLmNvbnRlbnQubWFwKChwYXJ0KSA9PiAocGFydC50eXBlID09PSAndGV4dCdcbiAgICAgICAgPyB7dGV4dDogcGFydC50ZXh0LCB0eXBlOiAnaW5wdXRfdGV4dCd9IDoge2RldGFpbDogcGFydC5kZXRhaWwgPz8gJ2F1dG8nLCBpbWFnZV91cmw6IHBhcnQudXJsLCB0eXBlOiAnaW5wdXRfaW1hZ2UnfSkpLCByb2xlOiBtZXNzYWdlLnJvbGUgPT09ICdzeXN0ZW0nID8gJ2RldmVsb3BlcicgOiBtZXNzYWdlLnJvbGV9KSkgPz8gcHJvbXB0LFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnB1dC5zeXN0ZW0sXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgKGdyb2sgPyBjb25maWcuZ3Jva01vZGVsIHx8ICdncm9rLTQuNycgOiBjb25maWcub3BlbmFpTW9kZWwgfHwgJ2dwdC02LWFzdHJhJyksXG4gICAgICAuLi4oaW5wdXQucmVhc29uaW5nRWZmb3J0ID8ge3JlYXNvbmluZzoge2VmZm9ydDogaW5wdXQucmVhc29uaW5nRWZmb3J0fX0gOiB7fSksXG4gICAgICBzdG9yZTogZmFsc2UsXG4gICAgICAuLi4oZm9ybWF0ID8ge3RleHQ6IHtmb3JtYXR9fSA6IHt9KSxcbiAgICAgIC4uLighZ3JvayA/IHt0cnVuY2F0aW9uOiAnZGlzYWJsZWQnfSA6IHt9KVxuICAgIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7a2V5fWB9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyB7XG4gICAgICBlcnJvcj86IHtjb2RlPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfTtcbiAgICAgIG91dHB1dD86IHtjb250ZW50Pzoge3RleHQ/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9W107IHN0YXR1cz86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTtcbiAgICAgIHN0YXR1cz86IHN0cmluZztcbiAgICB9O1xuICAgIGlmKHJlc3BvbnNlLmVycm9yICYmIFsnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJywgJ2F1dGhlbnRpY2F0aW9uX2Vycm9yJywgJ3Blcm1pc3Npb25fZXJyb3InXS5pbmNsdWRlcyhyZXNwb25zZS5lcnJvci50eXBlIHx8ICcnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcihgJHtncm9rID8gJ0dyb2snIDogJ09wZW5BSSd9IHJlamVjdGVkIHRoZSByZXF1ZXN0LiBDaGVjayB0aGUgbW9kZWwgYW5kIGFjY291bnQgYWNjZXNzLmApO1xuICAgIH1cbiAgICBpZihyZXNwb25zZS5lcnJvciB8fCByZXNwb25zZS5zdGF0dXMgIT09ICdjb21wbGV0ZWQnIHx8IHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdpbmNvbXBsZXRlJykpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkOiBnZW5lcmF0aW9uIGRpZCBub3QgY29tcGxldGUuYCk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS5jb250ZW50Py5zb21lKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdyZWZ1c2FsJykpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gZGVjbGluZWQgdGhlIHJlcXVlc3QuYCk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS50eXBlICYmICFbJ21lc3NhZ2UnLCAncmVhc29uaW5nJ10uaW5jbHVkZXMoaXRlbS50eXBlKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSByZXR1cm5lZCBhbiB1bnN1cHBvcnRlZCBvdXRwdXQgaXRlbS5gKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHJlc3BvbnNlLm91dHB1dD8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09ICdtZXNzYWdlJyB8fCAoZ3JvayAmJiAhaXRlbS50eXBlKSkuZmxhdE1hcCgoaXRlbSkgPT4gaXRlbS5jb250ZW50IHx8IFtdKVxuICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydC50eXBlID09PSAnb3V0cHV0X3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignJykgfHwgJyc7XG4gICAgaWYoIXRleHQudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gcmV0dXJuZWQgZW1wdHkgb3V0cHV0LmApO1xuICAgIH1cbiAgICByZXR1cm4ge3NvdXJjZXM6IFtdLCB0ZXh0OiBpbnB1dC5vdXRwdXRUZXh0TW9kZSA9PT0gJ3ByZXNlcnZlJyA/IHRleHQgOiB0ZXh0LnRyaW0oKX07XG4gIH1cbiAgaWYoIWNvbmZpZy5nZW1pbmlLZXkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gIH1cbiAgY29uc3QgcGFydHM6IHVua25vd25bXSA9IFt7dGV4dDogcHJvbXB0fSwgLi4uaW1hZ2VzLm1hcCgoaW1hZ2UpID0+ICh7aW5saW5lRGF0YToge2RhdGE6IGltYWdlLmJ5dGVzLnRvU3RyaW5nKCdiYXNlNjQnKSwgbWltZVR5cGU6IGltYWdlLm1pbWV9fSkpXTtcbiAgY29uc3QgbW9kZWwgPSBpbnB1dC5tb2RlbCB8fCAoaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgPyBjb25maWcuZ2VtaW5pSW1hZ2VNb2RlbCB8fCAnZ2VtaW5pLTMuMS1mbGFzaC1pbWFnZScgOiBjb25maWcuZ2VtaW5pTW9kZWwgfHwgJ2dlbWluaS0zLjgtZmxhc2gnKTtcbiAgaWYoIS9eW2EtekEtWjAtOS5fLV0rJC8udGVzdChtb2RlbCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIEdlbWluaSBtb2RlbCBjb25maWd1cmF0aW9uLicpO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdChgaHR0cHM6Ly9nZW5lcmF0aXZlbGFuZ3VhZ2UuZ29vZ2xlYXBpcy5jb20vdjFiZXRhL21vZGVscy8ke21vZGVsfTpnZW5lcmF0ZUNvbnRlbnRgLCB7XG4gICAgY29udGVudHM6IFt7cGFydHMsIHJvbGU6ICd1c2VyJ31dLFxuICAgIC4uLihpbnB1dC5zeXN0ZW0gPyB7c3lzdGVtSW5zdHJ1Y3Rpb246IHtwYXJ0czogW3t0ZXh0OiBpbnB1dC5zeXN0ZW19XX19IDoge30pLFxuICAgIGdlbmVyYXRpb25Db25maWc6IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gey4uLihpbnB1dC5hc3BlY3RSYXRpbyA/IHtpbWFnZUNvbmZpZzoge2FzcGVjdFJhdGlvOiBpbnB1dC5hc3BlY3RSYXRpb319IDoge30pLCByZXNwb25zZU1vZGFsaXRpZXM6IFsnVEVYVCcsICdJTUFHRSddfSA6IHtcbiAgICAgIG1heE91dHB1dFRva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICAuLi4oZm9ybWF0ID8ge3Jlc3BvbnNlTWltZVR5cGU6IGZvcm1hdC50eXBlID09PSAnanNvbl9vYmplY3QnID8gJ2FwcGxpY2F0aW9uL2pzb24nIDogJ3RleHQvcGxhaW4nfSA6IHt9KSxcbiAgICAgIC4uLihpbnB1dC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkID8ge3RlbXBlcmF0dXJlOiBpbnB1dC50ZW1wZXJhdHVyZX0gOiB7fSksXG4gICAgICAuLi4oaW5wdXQudG9wUCAhPT0gdW5kZWZpbmVkID8ge3RvcFA6IGlucHV0LnRvcFB9IDoge30pXG4gICAgfSxcbiAgICAuLi4oaW5wdXQuc2VhcmNoID8ge3Rvb2xzOiBbe2dvb2dsZVNlYXJjaDoge319XX0gOiB7fSlcbiAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeyd4LWdvb2ctYXBpLWtleSc6IGNvbmZpZy5nZW1pbmlLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyBHZW1pbmlSZXNwb25zZTtcbiAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWzQwMCwgNDAxLCA0MDMsIDQwNF0uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IuY29kZSB8fCAwKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIHJlZmVyZW5jZSBmb3JtYXQgYW5kIG1vZGVsIGFjY2Vzcy4nKTtcbiAgfVxuICBpZihyZXNwb25zZS5wcm9tcHRGZWVkYmFjaz8uYmxvY2tSZWFzb24gfHwgcmVzcG9uc2UuZXJyb3IgfHwgIXJlc3BvbnNlLmNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0dlbWluaSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkLicpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJlc3BvbnNlLmNhbmRpZGF0ZXNbMF0hO1xuICBpZihjYW5kaWRhdGUuZmluaXNoUmVhc29uICE9PSAnU1RPUCcpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZDogZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlLicpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IChjYW5kaWRhdGUuY29udGVudD8ucGFydHMgfHwgW10pLmZpbHRlcigocGFydCkgPT4gIXBhcnQudGhvdWdodCk7XG4gIGNvbnN0IGlubGluZSA9IG91dHB1dC5maW5kKChwYXJ0KSA9PiBwYXJ0LmlubGluZURhdGEpPy5pbmxpbmVEYXRhO1xuICBsZXQgaW1hZ2U6IEdlbmVyYXRlZENvbnRlbnRbJ2ltYWdlJ107XG4gIGlmKGlubGluZSAmJiBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ10uaW5jbHVkZXMoaW5saW5lLm1pbWVUeXBlKSkge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20oaW5saW5lLmRhdGEsICdiYXNlNjQnKTtcbiAgICBpZighYnl0ZXMubGVuZ3RoIHx8IGJ5dGVzLmxlbmd0aCA+IDIwICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0ludmFsaWQgaW1hZ2Ugb3V0cHV0LicpO1xuICAgIH1cbiAgICBpbWFnZSA9IHtieXRlcywgbWltZTogaW5saW5lLm1pbWVUeXBlIGFzICdpbWFnZS9wbmcnIHwgJ2ltYWdlL2pwZWcnfTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gb3V0cHV0Lm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCdcXG4nKS50cmltKCk7XG4gIGlmKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gIWltYWdlIDogIXRleHQpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdUaGUgcmVxdWVzdGVkIG91dHB1dCB3YXMgbm90IHJldHVybmVkLicpO1xuICB9XG4gIGNvbnN0IHNvdXJjZXMgPSAoY2FuZGlkYXRlLmdyb3VuZGluZ01ldGFkYXRhPy5ncm91bmRpbmdDaHVua3MgfHwgW10pLmZsYXRNYXAoKHt3ZWJ9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2ViPy51cmkgfHwgJycpO1xuICAgICAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBbe3RpdGxlOiB3ZWI/LnRpdGxlIHx8IHVybC5ob3N0bmFtZSwgdXJsOiB1cmwuaHJlZn1dIDogW107XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGltYWdlLCBzZWFyY2hTdWdnZXN0aW9uc0h0bWw6IGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uc2VhcmNoRW50cnlQb2ludD8ucmVuZGVyZWRDb250ZW50LCBzb3VyY2VzLCB0ZXh0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdlbmVyYXRlT2xsYW1hQ29udGVudCIsIkNvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciIsIkNvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciIsInBvc3QiLCJDb25maWciLCJ2YWxpZE1lc3NhZ2VDb250ZW50IiwibWVzc2FnZSIsImNvbnRlbnQiLCJ0cmltIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZXZlcnkiLCJwYXJ0IiwidHlwZSIsInRleHQiLCJyb2xlIiwidXJsIiwidGVzdCIsImRldGFpbCIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwiZ2VuZXJhdGVDb250ZW50IiwiaW5wdXQiLCJjb25maWciLCJnZXQiLCJwcm92aWRlciIsIm91dHB1dFRleHRNb2RlIiwibWVzc2FnZXMiLCJwcm9tcHQiLCJzb21lIiwicmVhc29uaW5nRWZmb3J0IiwicmVzcG9uc2VGb3JtYXQiLCJ0aW1lb3V0TXMiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJmb3JtYXQiLCJuYW1lIiwic2NoZW1hIiwic3RyaWN0IiwibW9kYWxpdHkiLCJ0b3BQIiwiaXNGaW5pdGUiLCJ0ZW1wZXJhdHVyZSIsIm1heFRva2VucyIsImltYWdlcyIsInNlYXJjaCIsImNsYXVkZUtleSIsInJlc3BvbnNlIiwibWF4X3Rva2VucyIsIm1vZGVsIiwiY2xhdWRlTW9kZWwiLCJzeXN0ZW0iLCJjYWNoZSIsImhlYWRlcnMiLCJIZWFkZXJzIiwidGltZW91dCIsImVycm9yIiwicHJlc2VydmUiLCJjaHVua3MiLCJmaWx0ZXIiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwiZ3JvayIsImtleSIsImdyb2tLZXkiLCJvcGVuYWlLZXkiLCJpbWFnZSIsImltYWdlX3VybCIsIm1pbWUiLCJieXRlcyIsInRvU3RyaW5nIiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJncm9rTW9kZWwiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW5saW5lRGF0YSIsImRhdGEiLCJtaW1lVHlwZSIsImdlbWluaUltYWdlTW9kZWwiLCJnZW1pbmlNb2RlbCIsImNvbnRlbnRzIiwic3lzdGVtSW5zdHJ1Y3Rpb24iLCJnZW5lcmF0aW9uQ29uZmlnIiwiYXNwZWN0UmF0aW8iLCJpbWFnZUNvbmZpZyIsInJlc3BvbnNlTW9kYWxpdGllcyIsIm1heE91dHB1dFRva2VucyIsInJlc3BvbnNlTWltZVR5cGUiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLHFCQUFxQixRQUFPLHdCQUF3QjtBQUM1RCxTQUFRQyw4QkFBOEIsRUFBRUMsOEJBQThCLFFBQU8sK0JBQStCO0FBQzVHLFNBQVFELDhCQUE4QixFQUFFQyw4QkFBOEIsUUFBTywrQkFBK0I7QUFDNUcsU0FBUUMsSUFBSSxRQUFPLG9CQUFvQjtBQUV2QyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQXNFcEMsTUFBTUMsc0JBQXNCLENBQUNDO0lBQzNCLElBQUcsT0FBT0EsUUFBUUMsT0FBTyxLQUFLLFVBQVU7UUFDdEMsT0FBTyxDQUFDLENBQUNELFFBQVFDLE9BQU8sQ0FBQ0MsSUFBSTtJQUMvQjtJQUNBLE9BQU9DLE1BQU1DLE9BQU8sQ0FBQ0osUUFBUUMsT0FBTyxLQUFLRCxRQUFRQyxPQUFPLENBQUNJLE1BQU0sR0FBRyxLQUFLTCxRQUFRQyxPQUFPLENBQUNLLEtBQUssQ0FBQyxDQUFDQztRQUM1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
|
|
459
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvLnRtcC9hZHMtcmVsZWFzZS0xLjIwLjAvc3JjL2FjdGlvbnMvY29udGVudEdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtwb3N0fSBmcm9tICdAbmxhYnMvcmlwLWh1bnRlcic7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQge2dlbWluaVNvdXJjZUV2aWRlbmNlLCB2YWxpZGF0ZUdlbWluaUNvbnRleHRVcmxzfSBmcm9tICcuL2NvbnRlbnRHZW5lcmF0aW9uU291cmNlcy5qcyc7XG5pbXBvcnQge2dlbmVyYXRlT2xsYW1hQ29udGVudH0gZnJvbSAnLi9vbGxhbWFHZW5lcmF0aW9uLmpzJztcblxuaW1wb3J0IHR5cGUge0NvbnRlbnRHZW5lcmF0aW9uR3JvdW5kaW5nLCBDb250ZW50R2VuZXJhdGlvblNvdXJjZSwgQ29udGVudEdlbmVyYXRpb25VcmxDb250ZXh0fSBmcm9tICcuL2NvbnRlbnRHZW5lcmF0aW9uU291cmNlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBncm9rS2V5Pzogc3RyaW5nO1xuICBncm9rTW9kZWw/OiBzdHJpbmc7XG4gIG9sbGFtYT86IHtlbmRwb2ludDogc3RyaW5nOyBwcm90b2NvbDogJ2dlbmVyYXRlJyB8ICdjaGF0JyB8ICdvcGVuYWktY2hhdCd9O1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25QYXJ0ID0ge3RleHQ6IHN0cmluZzsgdHlwZTogJ3RleHQnfSB8IHtcbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2hpZ2gnIHwgJ2xvdyc7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHVybDogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25NZXNzYWdlIHtcbiAgY29udGVudDogc3RyaW5nIHwgQ29udGVudEdlbmVyYXRpb25QYXJ0W107XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBvdXRwdXRUZXh0RmlsdGVyPzogJ25vbmJsYW5rJztcbiAgb3V0cHV0VGV4dE1vZGU/OiAncHJlc2VydmUnIHwgJ3RyaW0nO1xuICBvdXRwdXRUZXh0U2VwYXJhdG9yPzogJycgfCAnXFxuJztcbiAgcHJvbXB0Pzogc3RyaW5nO1xuICBwcm92aWRlcjogJ2NsYXVkZScgfCAnZ2VtaW5pJyB8ICdncm9rJyB8ICdvbGxhbWEnIHwgJ29wZW5haSc7XG4gIHJlYXNvbmluZ0VmZm9ydD86IENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0O1xuICByZXNwb25zZUZvcm1hdD86IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQ7XG4gIHNlYXJjaD86IGJvb2xlYW47XG4gIHN5c3RlbT86IHN0cmluZztcbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gIHRoaW5raW5nTGV2ZWw/OiAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnO1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIHRvcFA/OiBudW1iZXI7XG4gIC8qKiBFeHBsaWNpdCwgYm91bmRlZCBVUkxzIGZvciBHZW1pbmkgMi41IEZsYXNoIFVSTCBjb250ZXh0OyBub3QgcmVjdXJzaXZlIG9yIGd1YXJhbnRlZWQgbGl2ZS4gKi9cbiAgdXJsQ29udGV4dD86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRDb250ZW50IHtcbiAgZ3JvdW5kaW5nPzogQ29udGVudEdlbmVyYXRpb25Hcm91bmRpbmc7XG4gIHVybENvbnRleHQ/OiBDb250ZW50R2VuZXJhdGlvblVybENvbnRleHQ7XG4gIGltYWdlPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6ICdpbWFnZS9qcGVnJyB8ICdpbWFnZS9wbmcnfTtcbiAgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sPzogc3RyaW5nO1xuICBzb3VyY2VzOiB7dGl0bGU6IHN0cmluZzsgdXJsOiBzdHJpbmd9W107XG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIFByb3ZpZGVyLXJlcG9ydGVkIGNvdW50czsgYWJzZW50IG9yIG1hbGZvcm1lZCBtZXRhZGF0YSBtdXN0IG5ldmVyIGJlIGluZmVycmVkIGZyb20gdGV4dC4gKi9cbiAgdXNhZ2U/OiB7Y2FuZGlkYXRlc1Rva2VuQ291bnQ6IG51bWJlcjsgbW9kZWw6IHN0cmluZzsgcHJvbXB0VG9rZW5Db3VudDogbnVtYmVyOyBwcm92aWRlcjogJ2dlbWluaSc7IHRob3VnaHRzVG9rZW5Db3VudDogbnVtYmVyOyB0b29sVXNlUHJvbXB0VG9rZW5Db3VudDogbnVtYmVyOyB0b3RhbFRva2VuQ291bnQ6IG51bWJlcn07XG59XG5pbnRlcmZhY2UgR2VtaW5pUGFydCB7aW5saW5lRGF0YT86IHtkYXRhOiBzdHJpbmc7IG1pbWVUeXBlOiBzdHJpbmd9OyB0ZXh0Pzogc3RyaW5nOyB0aG91Z2h0PzogYm9vbGVhbn1cbmludGVyZmFjZSBHZW1pbmlSZXNwb25zZSB7XG4gIGNhbmRpZGF0ZXM/OiB7XG4gICAgY29udGVudD86IHtwYXJ0cz86IEdlbWluaVBhcnRbXX07XG4gICAgZmluaXNoUmVhc29uPzogc3RyaW5nO1xuICAgIHVybENvbnRleHRNZXRhZGF0YT86IHVua25vd247XG4gICAgZ3JvdW5kaW5nTWV0YWRhdGE/OiB7XG4gICAgICBncm91bmRpbmdDaHVua3M/OiB7d2ViPzoge3RpdGxlPzogc3RyaW5nOyB1cmk/OiBzdHJpbmd9fVtdO1xuICAgICAgZ3JvdW5kaW5nU3VwcG9ydHM/OiB1bmtub3duW107XG4gICAgICBzZWFyY2hFbnRyeVBvaW50Pzoge3JlbmRlcmVkQ29udGVudD86IHN0cmluZ307XG4gICAgfTtcbiAgfVtdO1xuICBlcnJvcj86IHtjb2RlPzogbnVtYmVyfTtcbiAgcHJvbXB0RmVlZGJhY2s/OiB7YmxvY2tSZWFzb24/OiBzdHJpbmd9O1xuICB1c2FnZU1ldGFkYXRhPzoge2NhbmRpZGF0ZXNUb2tlbkNvdW50PzogbnVtYmVyOyBwcm9tcHRUb2tlbkNvdW50PzogbnVtYmVyOyB0aG91Z2h0c1Rva2VuQ291bnQ/OiBudW1iZXI7XG4gICAgdG9vbFVzZVByb21wdFRva2VuQ291bnQ/OiBudW1iZXI7IHRvdGFsVG9rZW5Db3VudD86IG51bWJlcjt9O1xufVxuXG5jb25zdCB2YWxpZE1lc3NhZ2VDb250ZW50ID0gKG1lc3NhZ2U6IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZSk6IGJvb2xlYW4gPT4ge1xuICBpZih0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAhIW1lc3NhZ2UuY29udGVudC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJiBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoID4gMCAmJiBtZXNzYWdlLmNvbnRlbnQuZXZlcnkoKHBhcnQpID0+IHtcbiAgICBpZighcGFydCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZihwYXJ0LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0LnRleHQgPT09ICdzdHJpbmcnICYmICEhcGFydC50ZXh0LnRyaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnQudHlwZSA9PT0gJ2ltYWdlJyAmJiBtZXNzYWdlLnJvbGUgPT09ICd1c2VyJyAmJiB0eXBlb2YgcGFydC51cmwgPT09ICdzdHJpbmcnXG4gICAgICAmJiAvXihodHRwcz86XFwvXFwvW15cXHNdK3xkYXRhOmltYWdlXFwvKHBuZ3xqcGVnfHdlYnB8Z2lmKTtiYXNlNjQsW0EtWmEtejAtOSsvXSs9ezAsMn0pJC8udGVzdChwYXJ0LnVybClcbiAgICAgICYmIChwYXJ0LmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IFsnYXV0bycsICdoaWdoJywgJ2xvdyddLmluY2x1ZGVzKHBhcnQuZGV0YWlsKSk7XG4gIH0pO1xufTtcblxuLyoqIFNpbmdsZSBzdWJtaXNzaW9uIHRocm91Z2ggUmlwLUh1bnRlcjsgY2FsbGVycyBvd24gZHVyYWJsZSBqb2JzIGFuZCByZWNvbmNpbGlhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUNvbnRlbnQgPSBhc3luYyAoXG4gIGlucHV0OiBDb250ZW50R2VuZXJhdGlvbklucHV0LFxuICBjb25maWc6IENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnID0gQ29uZmlnLmdldDxDb250ZW50R2VuZXJhdGlvbkNvbmZpZz4oJ2NvbnRlbnRHZW5lcmF0aW9uJykgfHwge31cbik6IFByb21pc2U8R2VuZXJhdGVkQ29udGVudD4gPT4ge1xuICBpZighWydjbGF1ZGUnLCAnZ2VtaW5pJywgJ2dyb2snLCAnb2xsYW1hJywgJ29wZW5haSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egc3VwcG9ydGVkIHByb3ZpZGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKGlucHV0Lm91dHB1dFRleHRNb2RlICE9PSB1bmRlZmluZWRcbiAgICAmJiAoIVsnY2xhdWRlJywgJ2dlbWluaScsICdvcGVuYWknLCAnZ3JvayddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCAhWydwcmVzZXJ2ZScsICd0cmltJ10uaW5jbHVkZXMoaW5wdXQub3V0cHV0VGV4dE1vZGUpKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ291dHB1dFRleHRNb2RlIHJlcXVpcmVzIGEgQ2xhdWRlLCBHZW1pbmksIE9wZW5BSSBvciBHcm9rIHRleHQgcmVxdWVzdCBhbmQgcHJlc2VydmUgb3IgdHJpbS4nKTtcbiAgfVxuICBpZihpbnB1dC5vdXRwdXRUZXh0U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgJiYgKGlucHV0Lm91dHB1dFRleHRNb2RlICE9PSAncHJlc2VydmUnIHx8ICFbJ2NsYXVkZScsICdnZW1pbmknXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgIVsnJywgJ1xcbiddLmluY2x1ZGVzKGlucHV0Lm91dHB1dFRleHRTZXBhcmF0b3IpKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ291dHB1dFRleHRTZXBhcmF0b3IgcmVxdWlyZXMgQ2xhdWRlIG9yIEdlbWluaSBwcmVzZXJ2ZSBtb2RlIGFuZCBhbiBlbXB0eSBvciBuZXdsaW5lIHNlcGFyYXRvci4nKTtcbiAgfVxuICBpZihpbnB1dC5vdXRwdXRUZXh0RmlsdGVyICE9PSB1bmRlZmluZWQgJiYgKGlucHV0Lm91dHB1dFRleHRGaWx0ZXIgIT09ICdub25ibGFuaycgfHwgaW5wdXQub3V0cHV0VGV4dE1vZGUgIT09ICdwcmVzZXJ2ZScgfHwgIVsnY2xhdWRlJywgJ2dlbWluaSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdvdXRwdXRUZXh0RmlsdGVyIHJlcXVpcmVzIENsYXVkZSBvciBHZW1pbmkgcHJlc2VydmUgbW9kZSBhbmQgbm9uYmxhbmsuJyk7XG4gIH1cbiAgaWYoaW5wdXQudGhpbmtpbmdMZXZlbCAhPT0gdW5kZWZpbmVkICYmIChpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgIVsnbWluaW1hbCcsICdsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnXS5pbmNsdWRlcyhpbnB1dC50aGlua2luZ0xldmVsKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCd0aGlua2luZ0xldmVsIHJlcXVpcmVzIGEgR2VtaW5pIHRleHQgcmVxdWVzdCBhbmQgYSBzdXBwb3J0ZWQgbGV2ZWwuJyk7XG4gIH1cbiAgaWYoaW5wdXQubWVzc2FnZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmKGlucHV0LnByb21wdCAhPT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KGlucHV0Lm1lc3NhZ2VzKSB8fCAhaW5wdXQubWVzc2FnZXMubGVuZ3RoXG4gICAgICB8fCBpbnB1dC5tZXNzYWdlcy5zb21lKChtZXNzYWdlKSA9PlxuICAgICAgICAhbWVzc2FnZSB8fCAhWydhc3Npc3RhbnQnLCAnZGV2ZWxvcGVyJywgJ3N5c3RlbScsICd1c2VyJ10uaW5jbHVkZXMobWVzc2FnZS5yb2xlKSB8fCAhdmFsaWRNZXNzYWdlQ29udGVudChtZXNzYWdlKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ1N1cHBseSBlaXRoZXIgYSBub24tZW1wdHkgcHJvbXB0IG9yIG5vbi1lbXB0eSB0ZXh0IG1lc3NhZ2VzIHdpdGggc3VwcG9ydGVkIHJvbGVzLicpO1xuICAgIH1cbiAgfSBlbHNlIGlmKHR5cGVvZiBpbnB1dC5wcm9tcHQgIT09ICdzdHJpbmcnIHx8ICFpbnB1dC5wcm9tcHQudHJpbSgpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignQSBub24tZW1wdHkgcHJvbXB0IGlzIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyICE9PSAnb3BlbmFpJ1xuICAgICYmICgoaW5wdXQubWVzc2FnZXMgIT09IHVuZGVmaW5lZCAmJiBpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaScpIHx8IGlucHV0LnJlYXNvbmluZ0VmZm9ydCAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCAoWydjbGF1ZGUnLCAnZ3JvayddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSAmJiBpbnB1dC5yZXNwb25zZUZvcm1hdCAhPT0gdW5kZWZpbmVkKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKFxuICAgICAgJ01lc3NhZ2VzIGFuZCByZWFzb25pbmcgZWZmb3J0IHJlcXVpcmUgT3BlbkFJOyBDbGF1ZGUgYW5kIEdyb2sgZG8gbm90IHN1cHBvcnQgcmVzcG9uc2UgZm9ybWF0IG9wdGlvbnMuJ1xuICAgICk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdnZW1pbmknICYmIGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQgJiYgKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8IGlucHV0LmltYWdlcyAhPT0gdW5kZWZpbmVkIHx8IGlucHV0Lm1lc3NhZ2VzLnNvbWUoKG1lc3NhZ2UpID0+ICFbJ3VzZXInLCAnYXNzaXN0YW50J10uaW5jbHVkZXMobWVzc2FnZS5yb2xlKSB8fCAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpICYmIG1lc3NhZ2UuY29udGVudC5zb21lKChwYXJ0KSA9PiBwYXJ0LnR5cGUgIT09ICd0ZXh0JykpKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgbWVzc2FnZXMgcmVxdWlyZSB1c2VyIG9yIGFzc2lzdGFudCByb2xlcyB3aXRoIHRleHQtb25seSBjb250ZW50LicpO1xuICB9XG4gIGlmKGlucHV0LnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0LnRpbWVvdXRNcykgfHwgaW5wdXQudGltZW91dE1zIDwgMSB8fCBpbnB1dC50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiYgIVsnbm9uZScsICdtaW5pbWFsJywgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICd4aGlnaCcsICdtYXgnXS5pbmNsdWRlcyhpbnB1dC5yZWFzb25pbmdFZmZvcnQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVW5zdXBwb3J0ZWQgcmVhc29uaW5nIGVmZm9ydC4nKTtcbiAgfVxuICBjb25zdCBmb3JtYXQgPSBpbnB1dC5yZXNwb25zZUZvcm1hdDtcbiAgaWYoZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKCFmb3JtYXQgfHwgIVsndGV4dCcsICdqc29uX29iamVjdCcsICdqc29uX3NjaGVtYSddLmluY2x1ZGVzKGZvcm1hdC50eXBlKSB8fCAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgJiYgKFxuICAgIHR5cGVvZiBmb3JtYXQubmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW2EtekEtWjAtOV8tXXsxLDY0fSQvLnRlc3QoZm9ybWF0Lm5hbWUpIHx8ICFmb3JtYXQuc2NoZW1hIHx8IHR5cGVvZiBmb3JtYXQuc2NoZW1hICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZvcm1hdC5zY2hlbWEpXG4gICAgfHwgKGZvcm1hdC5zdHJpY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZm9ybWF0LnN0cmljdCAhPT0gJ2Jvb2xlYW4nKVxuICApKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdC4gSlNPTiBzY2hlbWFzIHJlcXVpcmUgYSBuYW1lIGFuZCBzY2hlbWEgb2JqZWN0LicpO1xuICB9XG4gIGlmKFsnZ2VtaW5pJywgJ29sbGFtYSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSAmJiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBzdXBwb3J0cyB0ZXh0IG9yIGpzb25fb2JqZWN0IGZvciB0ZXh0IGdlbmVyYXRpb24gb25seS4nKTtcbiAgfVxuICBpZihpbnB1dC50b3BQICE9PSB1bmRlZmluZWQgJiYgKCFbJ2dlbWluaScsICdvbGxhbWEnXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgIU51bWJlci5pc0Zpbml0ZShpbnB1dC50b3BQKSB8fCBpbnB1dC50b3BQIDwgMCB8fCBpbnB1dC50b3BQID4gMSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCd0b3BQIHJlcXVpcmVzIGEgR2VtaW5pIG9yIE9sbGFtYSB0ZXh0IHJlcXVlc3QgYW5kIGEgZmluaXRlIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4nKTtcbiAgfVxuICBpZihpbnB1dC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkICYmICghWydnZW1pbmknLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQudGVtcGVyYXR1cmUpIHx8IGlucHV0LnRlbXBlcmF0dXJlIDwgMCB8fCAoaW5wdXQucHJvdmlkZXIgPT09ICdnZW1pbmknICYmIGlucHV0LnRlbXBlcmF0dXJlID4gMikpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGVtcGVyYXR1cmUgcmVxdWlyZXMgYSBub25uZWdhdGl2ZSBmaW5pdGUgdmFsdWUgZm9yIE9sbGFtYSB0ZXh0IG9yIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyIGZvciBHZW1pbmkgdGV4dC4nKTtcbiAgfVxuICBpZihpbnB1dC5tYXhUb2tlbnMgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQubWF4VG9rZW5zKSB8fCBpbnB1dC5tYXhUb2tlbnMgPCAxKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ21heFRva2VucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaSdcbiAgICAmJiAoKGlucHV0LmltYWdlcz8ubGVuZ3RoICYmICFbJ2dyb2snLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpKSB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCBpbnB1dC5zZWFyY2gpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBvcGVyYXRpb24gc3VwcG9ydHMgdGV4dCBpbnB1dCBhbmQgb3V0cHV0IG9ubHkuJyk7XG4gIH1cbiAgaWYoaW5wdXQudXJsQ29udGV4dCAhPT0gdW5kZWZpbmVkICYmIChpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgaW5wdXQubWVzc2FnZXMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdVUkwgY29udGV4dCByZXF1aXJlcyBHZW1pbmkgdGV4dCBnZW5lcmF0aW9uIHdpdGggYSBwcm9tcHQuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdvbGxhbWEnKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlT2xsYW1hQ29udGVudChpbnB1dCwgY29uZmlnKTtcbiAgfVxuICBjb25zdCB7cHJvbXB0LCBpbWFnZXMgPSBbXX0gPSBpbnB1dDtcbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdjbGF1ZGUnKSB7XG4gICAgaWYoIWNvbmZpZy5jbGF1ZGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci4nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0KCdodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzJywge1xuICAgICAgbWF4X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtZXNzYWdlczogW3tjb250ZW50OiBwcm9tcHQsIHJvbGU6ICd1c2VyJ31dLFxuICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsIHx8IGNvbmZpZy5jbGF1ZGVNb2RlbCB8fCAnY2xhdWRlLXNvbm5ldC01JyxcbiAgICAgIHN5c3RlbTogaW5wdXQuc3lzdGVtXG4gICAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeydhbnRocm9waWMtdmVyc2lvbic6ICcyMDIzLTA2LTAxJywgJ3gtYXBpLWtleSc6IGNvbmZpZy5jbGF1ZGVLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyB7XG4gICAgICBjb250ZW50Pzoge3RleHQ/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9W107XG4gICAgICBlcnJvcj86IHt0eXBlPzogc3RyaW5nfTtcbiAgICAgIHN0b3BfcmVhc29uPzogc3RyaW5nO1xuICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9O1xuICAgIGlmKHJlc3BvbnNlLmVycm9yICYmIFsnYXV0aGVudGljYXRpb25fZXJyb3InLCAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJywgJ25vdF9mb3VuZF9lcnJvcicsICdwZXJtaXNzaW9uX2Vycm9yJ10uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IudHlwZSB8fCAnJykpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIG1vZGVsIGFuZCBhY2NvdW50IGFjY2Vzcy4nKTtcbiAgICB9XG4gICAgY29uc3QgcHJlc2VydmUgPSBpbnB1dC5vdXRwdXRUZXh0TW9kZSA9PT0gJ3ByZXNlcnZlJztcbiAgICBpZihwcmVzZXJ2ZSAmJiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UuY29udGVudCkgfHwgcmVzcG9uc2UuY29udGVudC5zb21lKChwYXJ0KSA9PlxuICAgICAgIXBhcnQgfHwgIVsndGV4dCcsICd0aGlua2luZycsICdyZWRhY3RlZF90aGlua2luZyddLmluY2x1ZGVzKHBhcnQudHlwZSB8fCAnJykgfHwgKHBhcnQudHlwZSA9PT0gJ3RleHQnICYmIHR5cGVvZiBwYXJ0LnRleHQgIT09ICdzdHJpbmcnKSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdDbGF1ZGUgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzID0gKHJlc3BvbnNlLmNvbnRlbnQ/LmZpbHRlcigocGFydCkgPT4gcGFydC50eXBlID09PSAndGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKSB8fCBbXSkuZmlsdGVyKCh0ZXh0KSA9PiBpbnB1dC5vdXRwdXRUZXh0RmlsdGVyICE9PSAnbm9uYmxhbmsnIHx8ICEhdGV4dC50cmltKCkpO1xuICAgIGNvbnN0IHRleHQgPSBwcmVzZXJ2ZSA/IGNodW5rcy5qb2luKGlucHV0Lm91dHB1dFRleHRTZXBhcmF0b3IgPz8gJycpIDogY2h1bmtzLmpvaW4oJ1xcbicpLnRyaW0oKTtcbiAgICBpZihyZXNwb25zZS5lcnJvciB8fCByZXNwb25zZS50eXBlICE9PSAnbWVzc2FnZScgfHwgcmVzcG9uc2Uuc3RvcF9yZWFzb24gIT09ICdlbmRfdHVybicgfHwgIXRleHQudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdDbGF1ZGUgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtzb3VyY2VzOiBbXSwgdGV4dH07XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdvcGVuYWknIHx8IGlucHV0LnByb3ZpZGVyID09PSAnZ3JvaycpIHtcbiAgICBjb25zdCBncm9rID0gaW5wdXQucHJvdmlkZXIgPT09ICdncm9rJztcbiAgICBjb25zdCBrZXkgPSBncm9rID8gY29uZmlnLmdyb2tLZXkgOiBjb25maWcub3BlbmFpS2V5O1xuICAgIGlmKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci5gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0KGdyb2sgPyAnaHR0cHM6Ly9hcGkueC5haS92MS9yZXNwb25zZXMnIDogJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVzcG9uc2VzJywge1xuICAgICAgaW5wdXQ6IGdyb2sgJiYgaW1hZ2VzLmxlbmd0aCA/IFt7Y29udGVudDogW3t0ZXh0OiBwcm9tcHQsIHR5cGU6ICdpbnB1dF90ZXh0J30sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2ltYWdlX3VybDogYGRhdGE6JHtpbWFnZS5taW1lfTtiYXNlNjQsJHtpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0Jyl9YCwgdHlwZTogJ2lucHV0X2ltYWdlJ30pKV0sIHJvbGU6ICd1c2VyJ31dIDogaW5wdXQubWVzc2FnZXM/Lm1hcCgobWVzc2FnZSkgPT4gKHtjb250ZW50OiB0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UuY29udGVudCA6IG1lc3NhZ2UuY29udGVudC5tYXAoKHBhcnQpID0+IChwYXJ0LnR5cGUgPT09ICd0ZXh0J1xuICAgICAgICA/IHt0ZXh0OiBwYXJ0LnRleHQsIHR5cGU6ICdpbnB1dF90ZXh0J30gOiB7ZGV0YWlsOiBwYXJ0LmRldGFpbCA/PyAnYXV0bycsIGltYWdlX3VybDogcGFydC51cmwsIHR5cGU6ICdpbnB1dF9pbWFnZSd9KSksIHJvbGU6IG1lc3NhZ2Uucm9sZSA9PT0gJ3N5c3RlbScgPyAnZGV2ZWxvcGVyJyA6IG1lc3NhZ2Uucm9sZX0pKSA/PyBwcm9tcHQsXG4gICAgICBpbnN0cnVjdGlvbnM6IGlucHV0LnN5c3RlbSxcbiAgICAgIG1heF9vdXRwdXRfdG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5NixcbiAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCB8fCAoZ3JvayA/IGNvbmZpZy5ncm9rTW9kZWwgfHwgJ2dyb2stNC43JyA6IGNvbmZpZy5vcGVuYWlNb2RlbCB8fCAnZ3B0LTYtYXN0cmEnKSxcbiAgICAgIC4uLihpbnB1dC5yZWFzb25pbmdFZmZvcnQgPyB7cmVhc29uaW5nOiB7ZWZmb3J0OiBpbnB1dC5yZWFzb25pbmdFZmZvcnR9fSA6IHt9KSxcbiAgICAgIHN0b3JlOiBmYWxzZSxcbiAgICAgIC4uLihmb3JtYXQgPyB7dGV4dDoge2Zvcm1hdH19IDoge30pLFxuICAgICAgLi4uKCFncm9rID8ge3RydW5jYXRpb246ICdkaXNhYmxlZCd9IDoge30pXG4gICAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoe0F1dGhvcml6YXRpb246IGBCZWFyZXIgJHtrZXl9YH0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGVycm9yPzoge2NvZGU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9O1xuICAgICAgb3V0cHV0Pzoge2NvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTsgc3RhdHVzPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnYXV0aGVudGljYXRpb25fZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuYCk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcihgJHtncm9rID8gJ0dyb2snIDogJ09wZW5BSSd9IHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS5gKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQ/LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3JlZnVzYWwnKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSBkZWNsaW5lZCB0aGUgcmVxdWVzdC5gKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgJiYgIVsnbWVzc2FnZScsICdyZWFzb25pbmcnXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcihgJHtncm9rID8gJ0dyb2snIDogJ09wZW5BSSd9IHJldHVybmVkIGFuIHVuc3VwcG9ydGVkIG91dHB1dCBpdGVtLmApO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2Uub3V0cHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnIHx8IChncm9rICYmICFpdGVtLnR5cGUpKS5mbGF0TWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQgfHwgW10pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCcnKSB8fCAnJztcbiAgICBpZighdGV4dC50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSByZXR1cm5lZCBlbXB0eSBvdXRwdXQuYCk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHQ6IGlucHV0Lm91dHB1dFRleHRNb2RlID09PSAncHJlc2VydmUnID8gdGV4dCA6IHRleHQudHJpbSgpfTtcbiAgfVxuICBpZighY29uZmlnLmdlbWluaUtleSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci4nKTtcbiAgfVxuICBjb25zdCBwYXJ0czogdW5rbm93bltdID0gW3t0ZXh0OiBwcm9tcHR9LCAuLi5pbWFnZXMubWFwKChpbWFnZSkgPT4gKHtpbmxpbmVEYXRhOiB7ZGF0YTogaW1hZ2UuYnl0ZXMudG9TdHJpbmcoJ2Jhc2U2NCcpLCBtaW1lVHlwZTogaW1hZ2UubWltZX19KSldO1xuICBjb25zdCBtb2RlbCA9IGlucHV0Lm1vZGVsIHx8IChpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IGNvbmZpZy5nZW1pbmlJbWFnZU1vZGVsIHx8ICdnZW1pbmktMy4xLWZsYXNoLWltYWdlJyA6IGNvbmZpZy5nZW1pbmlNb2RlbCB8fCAnZ2VtaW5pLTMuOC1mbGFzaCcpO1xuICBpZighL15bYS16QS1aMC05Ll8tXSskLy50ZXN0KG1vZGVsKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0ludmFsaWQgR2VtaW5pIG1vZGVsIGNvbmZpZ3VyYXRpb24uJyk7XG4gIH1cbiAgY29uc3QgdXJscyA9IGlucHV0LnVybENvbnRleHQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlR2VtaW5pQ29udGV4dFVybHMoaW5wdXQudXJsQ29udGV4dCk7XG4gIGlmKHVybHMgJiYgbW9kZWwgIT09ICdnZW1pbmktMi41LWZsYXNoJykge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ1VSTCBjb250ZXh0IHJlcXVpcmVzIHRoZSB2ZXJpZmllZCBHZW1pbmkgMi41IEZsYXNoIG1vZGVsLicpO1xuICB9XG4gIGlmKHVybHMpIHtcbiAgICBwYXJ0cy5wdXNoKHt0ZXh0OiBgSW5zcGVjdCBvbmx5IHRoZXNlIGV4cGxpY2l0bHkgc2VsZWN0ZWQgVVJMcywgd2l0aG91dCBmb2xsb3dpbmcgbGlua3M6ICR7SlNPTi5zdHJpbmdpZnkodXJscyl9YH0pO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdChgaHR0cHM6Ly9nZW5lcmF0aXZlbGFuZ3VhZ2UuZ29vZ2xlYXBpcy5jb20vdjFiZXRhL21vZGVscy8ke21vZGVsfTpnZW5lcmF0ZUNvbnRlbnRgLCB7XG4gICAgY29udGVudHM6IGlucHV0Lm1lc3NhZ2VzPy5tYXAoKG1lc3NhZ2UpID0+ICh7cGFydHM6IHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gW3t0ZXh0OiBtZXNzYWdlLmNvbnRlbnR9XSA6IG1lc3NhZ2UuY29udGVudC5tYXAoKHBhcnQpID0+ICh7dGV4dDogKHBhcnQgYXMgRXh0cmFjdDxDb250ZW50R2VuZXJhdGlvblBhcnQsIHt0eXBlOiAndGV4dCd9PikudGV4dH0pKSwgcm9sZTogbWVzc2FnZS5yb2xlID09PSAnYXNzaXN0YW50JyA/ICdtb2RlbCcgOiAndXNlcid9KSkgPz8gW3twYXJ0cywgcm9sZTogJ3VzZXInfV0sXG4gICAgLi4uKGlucHV0LnN5c3RlbSA/IHtzeXN0ZW1JbnN0cnVjdGlvbjoge3BhcnRzOiBbe3RleHQ6IGlucHV0LnN5c3RlbX1dfX0gOiB7fSksXG4gICAgZ2VuZXJhdGlvbkNvbmZpZzogaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgPyB7Li4uKGlucHV0LmFzcGVjdFJhdGlvID8ge2ltYWdlQ29uZmlnOiB7YXNwZWN0UmF0aW86IGlucHV0LmFzcGVjdFJhdGlvfX0gOiB7fSksIHJlc3BvbnNlTW9kYWxpdGllczogWydURVhUJywgJ0lNQUdFJ119IDoge1xuICAgICAgbWF4T3V0cHV0VG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5NixcbiAgICAgIC4uLihmb3JtYXQgPyB7cmVzcG9uc2VNaW1lVHlwZTogZm9ybWF0LnR5cGUgPT09ICdqc29uX29iamVjdCcgPyAnYXBwbGljYXRpb24vanNvbicgOiAndGV4dC9wbGFpbid9IDoge30pLFxuICAgICAgLi4uKGlucHV0LnRlbXBlcmF0dXJlICE9PSB1bmRlZmluZWQgPyB7dGVtcGVyYXR1cmU6IGlucHV0LnRlbXBlcmF0dXJlfSA6IHt9KSxcbiAgICAgIC4uLihpbnB1dC50b3BQICE9PSB1bmRlZmluZWQgPyB7dG9wUDogaW5wdXQudG9wUH0gOiB7fSksXG4gICAgICAuLi4oaW5wdXQudGhpbmtpbmdMZXZlbCAhPT0gdW5kZWZpbmVkID8ge3RoaW5raW5nQ29uZmlnOiB7dGhpbmtpbmdMZXZlbDogaW5wdXQudGhpbmtpbmdMZXZlbH19IDoge30pXG4gICAgfSxcbiAgICAuLi4oaW5wdXQuc2VhcmNoIHx8IHVybHMgPyB7dG9vbHM6IFtcbiAgICAgIC4uLihpbnB1dC5zZWFyY2ggPyBbe2dvb2dsZVNlYXJjaDoge319XSA6IFtdKSwgLi4uKHVybHMgPyBbe3VybENvbnRleHQ6IHt9fV0gOiBbXSldfSA6IHt9KVxuICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7J3gtZ29vZy1hcGkta2V5JzogY29uZmlnLmdlbWluaUtleX0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIEdlbWluaVJlc3BvbnNlO1xuICBpZihyZXNwb25zZS5lcnJvciAmJiBbNDAwLCA0MDEsIDQwMywgNDA0XS5pbmNsdWRlcyhyZXNwb25zZS5lcnJvci5jb2RlIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIHJlamVjdGVkIHRoZSByZXF1ZXN0LiBDaGVjayB0aGUgcmVmZXJlbmNlIGZvcm1hdCBhbmQgbW9kZWwgYWNjZXNzLicpO1xuICB9XG4gIGlmKHJlc3BvbnNlLnByb21wdEZlZWRiYWNrPy5ibG9ja1JlYXNvbiB8fCByZXNwb25zZS5lcnJvciB8fCAhcmVzcG9uc2UuY2FuZGlkYXRlcz8ubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignR2VtaW5pIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gIH1cbiAgY29uc3QgY2FuZGlkYXRlID0gcmVzcG9uc2UuY2FuZGlkYXRlc1swXSE7XG4gIGlmKGNhbmRpZGF0ZS5maW5pc2hSZWFzb24gIT09ICdTVE9QJykge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0dlbWluaSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkOiBnZW5lcmF0aW9uIGRpZCBub3QgY29tcGxldGUuJyk7XG4gIH1cbiAgY29uc3QgcHJlc2VydmUgPSBpbnB1dC5vdXRwdXRUZXh0TW9kZSA9PT0gJ3ByZXNlcnZlJztcbiAgaWYocHJlc2VydmUgJiYgKCFBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jb250ZW50Py5wYXJ0cykgfHwgY2FuZGlkYXRlLmNvbnRlbnQucGFydHMuc29tZSgocGFydCkgPT4gIXBhcnQgfHwgKHBhcnQudGhvdWdodCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwYXJ0LnRob3VnaHQgIT09ICdib29sZWFuJykgfHwgT2JqZWN0LmtleXMocGFydCkuc29tZSgoa2V5KSA9PiAhWyd0ZXh0JywgJ3Rob3VnaHQnLCAndGhvdWdodFNpZ25hdHVyZSddLmluY2x1ZGVzKGtleSkpIHx8ICghcGFydC50aG91Z2h0ICYmIHR5cGVvZiBwYXJ0LnRleHQgIT09ICdzdHJpbmcnKSkpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignR2VtaW5pIHJlc3BvbnNlIHRleHQgcGFydHMgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSAoY2FuZGlkYXRlLmNvbnRlbnQ/LnBhcnRzIHx8IFtdKS5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0LnRob3VnaHQpO1xuICBjb25zdCBpbmxpbmUgPSBvdXRwdXQuZmluZCgocGFydCkgPT4gcGFydC5pbmxpbmVEYXRhKT8uaW5saW5lRGF0YTtcbiAgbGV0IGltYWdlOiBHZW5lcmF0ZWRDb250ZW50WydpbWFnZSddO1xuICBpZihpbmxpbmUgJiYgWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddLmluY2x1ZGVzKGlubGluZS5taW1lVHlwZSkpIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGlubGluZS5kYXRhLCAnYmFzZTY0Jyk7XG4gICAgaWYoIWJ5dGVzLmxlbmd0aCB8fCBieXRlcy5sZW5ndGggPiAyMCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdJbnZhbGlkIGltYWdlIG91dHB1dC4nKTtcbiAgICB9XG4gICAgaW1hZ2UgPSB7Ynl0ZXMsIG1pbWU6IGlubGluZS5taW1lVHlwZSBhcyAnaW1hZ2UvcG5nJyB8ICdpbWFnZS9qcGVnJ307XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gb3V0cHV0Lm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5maWx0ZXIoKHRleHQpID0+IGlucHV0Lm91dHB1dFRleHRGaWx0ZXIgIT09ICdub25ibGFuaycgfHwgISF0ZXh0LnRyaW0oKSk7XG4gIGNvbnN0IHRleHQgPSBwcmVzZXJ2ZSA/IGNodW5rcy5qb2luKGlucHV0Lm91dHB1dFRleHRTZXBhcmF0b3IgPz8gJycpIDogY2h1bmtzLmpvaW4oJ1xcbicpLnRyaW0oKTtcbiAgaWYoaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgPyAhaW1hZ2UgOiAhdGV4dC50cmltKCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdUaGUgcmVxdWVzdGVkIG91dHB1dCB3YXMgbm90IHJldHVybmVkLicpO1xuICB9XG4gIGNvbnN0IGV2aWRlbmNlID0gZ2VtaW5pU291cmNlRXZpZGVuY2UoY2FuZGlkYXRlKTtcbiAgY29uc3QgbWV0YWRhdGEgPSByZXNwb25zZS51c2FnZU1ldGFkYXRhO1xuICBjb25zdCBjb3VudHMgPSBtZXRhZGF0YSA/IHtjYW5kaWRhdGVzVG9rZW5Db3VudDogbWV0YWRhdGEuY2FuZGlkYXRlc1Rva2VuQ291bnQsXG4gICAgcHJvbXB0VG9rZW5Db3VudDogbWV0YWRhdGEucHJvbXB0VG9rZW5Db3VudCwgdGhvdWdodHNUb2tlbkNvdW50OiBtZXRhZGF0YS50aG91Z2h0c1Rva2VuQ291bnQgPz8gMCxcbiAgICB0b29sVXNlUHJvbXB0VG9rZW5Db3VudDogbWV0YWRhdGEudG9vbFVzZVByb21wdFRva2VuQ291bnQgPz8gMCxcbiAgICB0b3RhbFRva2VuQ291bnQ6IG1ldGFkYXRhLnRvdGFsVG9rZW5Db3VudH0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHVzYWdlID0gY291bnRzXG4gICAgJiYgT2JqZWN0LnZhbHVlcyhjb3VudHMpLmV2ZXJ5KChjb3VudCkgPT4gTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmIGNvdW50ISA+PSAwKVxuICAgICYmIFtjb3VudHMucHJvbXB0VG9rZW5Db3VudCEgKyBjb3VudHMuY2FuZGlkYXRlc1Rva2VuQ291bnQhICsgY291bnRzLnRob3VnaHRzVG9rZW5Db3VudCxcbiAgICAgIGNvdW50cy5wcm9tcHRUb2tlbkNvdW50ISArIGNvdW50cy5jYW5kaWRhdGVzVG9rZW5Db3VudCEgKyBjb3VudHMudGhvdWdodHNUb2tlbkNvdW50XG4gICAgICAgICsgY291bnRzLnRvb2xVc2VQcm9tcHRUb2tlbkNvdW50XVxuICAgICAgLmluY2x1ZGVzKGNvdW50cy50b3RhbFRva2VuQ291bnQhKVxuICAgID8gey4uLmNvdW50cyBhcyBSZXF1aXJlZDx0eXBlb2YgY291bnRzPiwgbW9kZWwsIHByb3ZpZGVyOiAnZ2VtaW5pJyBhcyBjb25zdH0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgaW1hZ2UsIHNlYXJjaFN1Z2dlc3Rpb25zSHRtbDogY2FuZGlkYXRlLmdyb3VuZGluZ01ldGFkYXRhPy5zZWFyY2hFbnRyeVBvaW50Py5yZW5kZXJlZENvbnRlbnQsXG4gICAgc291cmNlczogZXZpZGVuY2Uuc291cmNlcywgdGV4dCxcbiAgICAuLi4oZXZpZGVuY2UuZ3JvdW5kaW5nID8ge2dyb3VuZGluZzogZXZpZGVuY2UuZ3JvdW5kaW5nfSA6IHt9KSxcbiAgICAuLi4oZXZpZGVuY2UudXJsQ29udGV4dCA/IHt1cmxDb250ZXh0OiBldmlkZW5jZS51cmxDb250ZXh0fSA6IHt9KSxcbiAgICAuLi4odXNhZ2UgPyB7dXNhZ2V9IDoge30pXG4gIH07XG59O1xuXG5leHBvcnQge0NvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciwgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yLCB2YWxpZGF0ZUdlbWluaUNvbnRleHRVcmxzfTtcbmV4cG9ydCB0eXBlIHtDb250ZW50R2VuZXJhdGlvbkdyb3VuZGluZywgQ29udGVudEdlbmVyYXRpb25Tb3VyY2UsIENvbnRlbnRHZW5lcmF0aW9uVXJsQ29udGV4dH07XG4iXSwibmFtZXMiOlsicG9zdCIsIkNvbmZpZyIsIkNvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciIsIkNvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciIsImdlbWluaVNvdXJjZUV2aWRlbmNlIiwidmFsaWRhdGVHZW1pbmlDb250ZXh0VXJscyIsImdlbmVyYXRlT2xsYW1hQ29udGVudCIsInZhbGlkTWVzc2FnZUNvbnRlbnQiLCJtZXNzYWdlIiwiY29udGVudCIsInRyaW0iLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJldmVyeSIsInBhcnQiLCJ0eXBlIiwidGV4dCIsInJvbGUiLCJ1cmwiLCJ0ZXN0IiwiZGV0YWlsIiwidW5kZWZpbmVkIiwiaW5jbHVkZXMiLCJnZW5lcmF0ZUNvbnRlbnQiLCJpbnB1dCIsImNvbmZpZyIsImdldCIsInByb3ZpZGVyIiwib3V0cHV0VGV4dE1vZGUiLCJtb2RhbGl0eSIsIm91dHB1dFRleHRTZXBhcmF0b3IiLCJvdXRwdXRUZXh0RmlsdGVyIiwidGhpbmtpbmdMZXZlbCIsIm1lc3NhZ2VzIiwicHJvbXB0Iiwic29tZSIsInJlYXNvbmluZ0VmZm9ydCIsInJlc3BvbnNlRm9ybWF0IiwiaW1hZ2VzIiwidGltZW91dE1zIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiZm9ybWF0IiwibmFtZSIsInNjaGVtYSIsInN0cmljdCIsInRvcFAiLCJpc0Zpbml0ZSIsInRlbXBlcmF0dXJlIiwibWF4VG9rZW5zIiwic2VhcmNoIiwidXJsQ29udGV4dCIsImNsYXVkZUtleSIsInJlc3BvbnNlIiwibWF4X3Rva2VucyIsIm1vZGVsIiwiY2xhdWRlTW9kZWwiLCJzeXN0ZW0iLCJjYWNoZSIsImhlYWRlcnMiLCJIZWFkZXJzIiwidGltZW91dCIsImVycm9yIiwicHJlc2VydmUiLCJjaHVua3MiLCJmaWx0ZXIiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwiZ3JvayIsImtleSIsImdyb2tLZXkiLCJvcGVuYWlLZXkiLCJpbWFnZSIsImltYWdlX3VybCIsIm1pbWUiLCJieXRlcyIsInRvU3RyaW5nIiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJncm9rTW9kZWwiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW5saW5lRGF0YSIsImRhdGEiLCJtaW1lVHlwZSIsImdlbWluaUltYWdlTW9kZWwiLCJnZW1pbmlNb2RlbCIsInVybHMiLCJwdXNoIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbnRlbnRzIiwic3lzdGVtSW5zdHJ1Y3Rpb24iLCJnZW5lcmF0aW9uQ29uZmlnIiwiYXNwZWN0UmF0aW8iLCJpbWFnZUNvbmZpZyIsInJlc3BvbnNlTW9kYWxpdGllcyIsIm1heE91dHB1dFRva2VucyIsInJlc3BvbnNlTWltZVR5cGUiLCJ0aGlua2luZ0NvbmZpZyIsInRvb2xzIiwiZ29vZ2xlU2VhcmNoIiwiY29kZSIsInByb21wdEZlZWRiYWNrIiwiYmxvY2tSZWFzb24iLCJjYW5kaWRhdGVzIiwiY2FuZGlkYXRlIiwiZmluaXNoUmVhc29uIiwidGhvdWdodCIsIk9iamVjdCIsImtleXMiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImV2aWRlbmNlIiwibWV0YWRhdGEiLCJ1c2FnZU1ldGFkYXRhIiwiY291bnRzIiwiY2FuZGlkYXRlc1Rva2VuQ291bnQiLCJwcm9tcHRUb2tlbkNvdW50IiwidGhvdWdodHNUb2tlbkNvdW50IiwidG9vbFVzZVByb21wdFRva2VuQ291bnQiLCJ0b3RhbFRva2VuQ291bnQiLCJ1c2FnZSIsInZhbHVlcyIsImNvdW50IiwiaXNTYWZlSW50ZWdlciIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsImdyb3VuZGluZ01ldGFkYXRhIiwic2VhcmNoRW50cnlQb2ludCIsInJlbmRlcmVkQ29udGVudCIsImdyb3VuZGluZyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUUEsSUFBSSxRQUFPLG9CQUFvQjtBQUV2QyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyw4QkFBOEIsRUFBRUMsOEJBQThCLFFBQU8sK0JBQStCO0FBQzVHLFNBQVFD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
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
/** An accepted generation did not produce usable output; do not automatically resubmit it. */ export class ContentGenerationResponseError extends Error {
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbkVycm9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQSBjb25maXJtZWQgcmVqZWN0aW9uIGlzIGRpc3RpbmN0IGZyb20gYW4gdW5rbm93biBwYWlkIHN1Ym1pc3Npb24gb3V0Y29tZS4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuLyoqIEFuIGFjY2VwdGVkIGdlbmVyYXRpb24gZGlkIG5vdCBwcm9kdWNlIHVzYWJsZSBvdXRwdXQ7IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHJlc3VibWl0IGl0LiAqL1xuZXhwb3J0IGNsYXNzIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHt9XG4iXSwibmFtZXMiOlsiQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yIiwiRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBLCtFQUErRSxHQUMvRSxPQUFPLE1BQU1BLHVDQUF1Q0M7QUFBTztBQUMzRCw0RkFBNEYsR0FDNUYsT0FBTyxNQUFNQyx1Q0FBdUNEO0FBQU8ifQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ContentGenerationSource {
|
|
2
|
+
title: string;
|
|
3
|
+
url: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ContentGenerationGrounding {
|
|
6
|
+
claims: {
|
|
7
|
+
endByte: number;
|
|
8
|
+
partIndex: number;
|
|
9
|
+
sources: ContentGenerationSource[];
|
|
10
|
+
startByte: number;
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
omittedSupports: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ContentGenerationUrlContext {
|
|
16
|
+
omittedUrls: number;
|
|
17
|
+
urls: {
|
|
18
|
+
status: 'error' | 'paywall' | 'success' | 'unavailable' | 'unsafe';
|
|
19
|
+
url: string;
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
/** Explicit provider URL tool input, never a project HTTP source fetch. */
|
|
23
|
+
export declare const validateGeminiContextUrls: (input: readonly string[]) => string[];
|
|
24
|
+
/** Preserve original chunk indices and UTF8 Part bytes; invalid metadata cannot create a source-to-claim assertion. */
|
|
25
|
+
export declare const geminiSourceEvidence: (input: unknown) => {
|
|
26
|
+
grounding?: ContentGenerationGrounding;
|
|
27
|
+
sources: ContentGenerationSource[];
|
|
28
|
+
urlContext?: ContentGenerationUrlContext;
|
|
29
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { ContentGenerationRejectedError } from './contentGenerationErrors.js';
|
|
2
|
+
const object = (value)=>value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
3
|
+
const list = (value)=>Array.isArray(value) ? value : [];
|
|
4
|
+
const publicUrl = (value, selected = false)=>{
|
|
5
|
+
if (typeof value !== 'string' || value.length > 2048 || /\s/.test(value)) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const url = new URL(value);
|
|
10
|
+
return url.protocol === 'https:' && !url.username && !url.password && !url.port && /^[a-z\d.-]+\.[a-z]{2,}$/i.test(url.hostname) && !/\.(local|internal|localhost|test|invalid)$/i.test(url.hostname) && (!selected || !url.search && !url.hash) ? url.href : undefined;
|
|
11
|
+
} catch {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
/** Explicit provider URL tool input, never a project HTTP source fetch. */ export const validateGeminiContextUrls = (input)=>{
|
|
16
|
+
const urls = list(input).map((value)=>publicUrl(value, true));
|
|
17
|
+
if (!urls.length || urls.length > 20 || urls.some((url)=>!url) || new Set(urls).size !== urls.length) {
|
|
18
|
+
throw new ContentGenerationRejectedError('Invalid bounded public URL context sources.');
|
|
19
|
+
}
|
|
20
|
+
return urls;
|
|
21
|
+
};
|
|
22
|
+
/** Preserve original chunk indices and UTF8 Part bytes; invalid metadata cannot create a source-to-claim assertion. */ export const geminiSourceEvidence = (input)=>{
|
|
23
|
+
const candidate = object(input);
|
|
24
|
+
const metadata = object(candidate.groundingMetadata);
|
|
25
|
+
const chunks = list(metadata.groundingChunks);
|
|
26
|
+
const mapped = chunks.slice(0, 100).map((chunk)=>{
|
|
27
|
+
const web = object(object(chunk).web);
|
|
28
|
+
const url = publicUrl(web.uri);
|
|
29
|
+
if (!url) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
title: typeof web.title === 'string' && web.title.trim() ? web.title.slice(0, 512) : new URL(url).hostname,
|
|
34
|
+
url
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
const parts = list(object(candidate.content).parts);
|
|
38
|
+
const supports = list(metadata.groundingSupports);
|
|
39
|
+
const claims = [];
|
|
40
|
+
for (const value of supports.slice(0, 100)){
|
|
41
|
+
const support = object(value);
|
|
42
|
+
const segment = object(support.segment);
|
|
43
|
+
const partIndex = segment.partIndex ?? 0;
|
|
44
|
+
const startByte = segment.startIndex ?? 0;
|
|
45
|
+
const endByte = segment.endIndex;
|
|
46
|
+
const indices = list(support.groundingChunkIndices);
|
|
47
|
+
if (!Number.isSafeInteger(partIndex) || partIndex < 0 || !Number.isSafeInteger(startByte) || startByte < 0 || !Number.isSafeInteger(endByte) || endByte <= startByte || !indices.length || indices.length > 20 || indices.some((index)=>!Number.isSafeInteger(index) || index < 0 || !mapped[index])) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const part = object(parts[partIndex]);
|
|
51
|
+
if (part.thought || typeof part.text !== 'string') {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const bytes = Buffer.from(part.text, 'utf8');
|
|
55
|
+
if (endByte > bytes.length || endByte - startByte > 8192) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const slice = bytes.subarray(startByte, endByte);
|
|
59
|
+
const text = slice.toString('utf8');
|
|
60
|
+
if (!text.trim() || !Buffer.from(text, 'utf8').equals(slice) || segment.text !== undefined && segment.text !== text) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
claims.push({
|
|
64
|
+
endByte: endByte,
|
|
65
|
+
partIndex: partIndex,
|
|
66
|
+
sources: [
|
|
67
|
+
...new Set(indices)
|
|
68
|
+
].map((index)=>mapped[index]),
|
|
69
|
+
startByte: startByte,
|
|
70
|
+
text
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const rawUrls = list(object(candidate.urlContextMetadata).urlMetadata);
|
|
74
|
+
const statuses = {
|
|
75
|
+
URL_RETRIEVAL_STATUS_ERROR: 'error',
|
|
76
|
+
URL_RETRIEVAL_STATUS_PAYWALL: 'paywall',
|
|
77
|
+
URL_RETRIEVAL_STATUS_SUCCESS: 'success',
|
|
78
|
+
URL_RETRIEVAL_STATUS_UNSAFE: 'unsafe'
|
|
79
|
+
};
|
|
80
|
+
const urls = rawUrls.slice(0, 20).flatMap((value)=>{
|
|
81
|
+
const row = object(value);
|
|
82
|
+
const url = publicUrl(row.retrievedUrl);
|
|
83
|
+
return url ? [
|
|
84
|
+
{
|
|
85
|
+
status: statuses[String(row.urlRetrievalStatus)] || 'unavailable',
|
|
86
|
+
url
|
|
87
|
+
}
|
|
88
|
+
] : [];
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
grounding: Array.isArray(metadata.groundingSupports) ? {
|
|
92
|
+
claims,
|
|
93
|
+
omittedSupports: supports.length - claims.length
|
|
94
|
+
} : undefined,
|
|
95
|
+
sources: mapped.filter((source)=>Boolean(source)),
|
|
96
|
+
urlContext: candidate.urlContextMetadata !== undefined ? {
|
|
97
|
+
omittedUrls: rawUrls.length - urls.length,
|
|
98
|
+
urls
|
|
99
|
+
} : undefined
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvblNvdXJjZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3J9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb25FcnJvcnMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uU291cmNlIHt0aXRsZTogc3RyaW5nOyB1cmw6IHN0cmluZ31cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Hcm91bmRpbmcge1xuICBjbGFpbXM6IHtlbmRCeXRlOiBudW1iZXI7IHBhcnRJbmRleDogbnVtYmVyOyBzb3VyY2VzOiBDb250ZW50R2VuZXJhdGlvblNvdXJjZVtdOyBzdGFydEJ5dGU6IG51bWJlcjsgdGV4dDogc3RyaW5nfVtdO1xuICBvbWl0dGVkU3VwcG9ydHM6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25VcmxDb250ZXh0IHtcbiAgb21pdHRlZFVybHM6IG51bWJlcjtcbiAgdXJsczoge3N0YXR1czogJ2Vycm9yJyB8ICdwYXl3YWxsJyB8ICdzdWNjZXNzJyB8ICd1bmF2YWlsYWJsZScgfCAndW5zYWZlJzsgdXJsOiBzdHJpbmd9W107XG59XG5jb25zdCBvYmplY3QgPSAodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9KTtcbmNvbnN0IGxpc3QgPSAodmFsdWU6IHVua25vd24pOiB1bmtub3duW10gPT4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSk7XG5jb25zdCBwdWJsaWNVcmwgPSAodmFsdWU6IHVua25vd24sIHNlbGVjdGVkID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA+IDIwNDggfHwgL1xccy8udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh2YWx1ZSk7XG4gICAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgIXVybC51c2VybmFtZSAmJiAhdXJsLnBhc3N3b3JkICYmICF1cmwucG9ydFxuICAgICAgJiYgL15bYS16XFxkLi1dK1xcLlthLXpdezIsfSQvaS50ZXN0KHVybC5ob3N0bmFtZSkgJiYgIS9cXC4obG9jYWx8aW50ZXJuYWx8bG9jYWxob3N0fHRlc3R8aW52YWxpZCkkL2kudGVzdCh1cmwuaG9zdG5hbWUpXG4gICAgICAmJiAoIXNlbGVjdGVkIHx8ICghdXJsLnNlYXJjaCAmJiAhdXJsLmhhc2gpKSA/IHVybC5ocmVmIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG4vKiogRXhwbGljaXQgcHJvdmlkZXIgVVJMIHRvb2wgaW5wdXQsIG5ldmVyIGEgcHJvamVjdCBIVFRQIHNvdXJjZSBmZXRjaC4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUdlbWluaUNvbnRleHRVcmxzID0gKGlucHV0OiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgdXJscyA9IGxpc3QoaW5wdXQpLm1hcCgodmFsdWUpID0+IHB1YmxpY1VybCh2YWx1ZSwgdHJ1ZSkpO1xuICBpZighdXJscy5sZW5ndGggfHwgdXJscy5sZW5ndGggPiAyMCB8fCB1cmxzLnNvbWUoKHVybCkgPT4gIXVybCkgfHwgbmV3IFNldCh1cmxzKS5zaXplICE9PSB1cmxzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0ludmFsaWQgYm91bmRlZCBwdWJsaWMgVVJMIGNvbnRleHQgc291cmNlcy4nKTtcbiAgfVxuICByZXR1cm4gdXJscyBhcyBzdHJpbmdbXTtcbn07XG4vKiogUHJlc2VydmUgb3JpZ2luYWwgY2h1bmsgaW5kaWNlcyBhbmQgVVRGOCBQYXJ0IGJ5dGVzOyBpbnZhbGlkIG1ldGFkYXRhIGNhbm5vdCBjcmVhdGUgYSBzb3VyY2UtdG8tY2xhaW0gYXNzZXJ0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGdlbWluaVNvdXJjZUV2aWRlbmNlID0gKGlucHV0OiB1bmtub3duKToge2dyb3VuZGluZz86IENvbnRlbnRHZW5lcmF0aW9uR3JvdW5kaW5nO1xuICBzb3VyY2VzOiBDb250ZW50R2VuZXJhdGlvblNvdXJjZVtdOyB1cmxDb250ZXh0PzogQ29udGVudEdlbmVyYXRpb25VcmxDb250ZXh0O30gPT4ge1xuICBjb25zdCBjYW5kaWRhdGUgPSBvYmplY3QoaW5wdXQpO1xuICBjb25zdCBtZXRhZGF0YSA9IG9iamVjdChjYW5kaWRhdGUuZ3JvdW5kaW5nTWV0YWRhdGEpO1xuICBjb25zdCBjaHVua3MgPSBsaXN0KG1ldGFkYXRhLmdyb3VuZGluZ0NodW5rcyk7XG4gIGNvbnN0IG1hcHBlZCA9IGNodW5rcy5zbGljZSgwLCAxMDApLm1hcCgoY2h1bmspOiBDb250ZW50R2VuZXJhdGlvblNvdXJjZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3Qgd2ViID0gb2JqZWN0KG9iamVjdChjaHVuaykud2ViKTtcbiAgICBjb25zdCB1cmwgPSBwdWJsaWNVcmwod2ViLnVyaSk7XG4gICAgaWYoIXVybCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHt0aXRsZTogdHlwZW9mIHdlYi50aXRsZSA9PT0gJ3N0cmluZycgJiYgd2ViLnRpdGxlLnRyaW0oKSA/IHdlYi50aXRsZS5zbGljZSgwLCA1MTIpIDogbmV3IFVSTCh1cmwpLmhvc3RuYW1lLCB1cmx9O1xuICB9KTtcbiAgY29uc3QgcGFydHMgPSBsaXN0KG9iamVjdChjYW5kaWRhdGUuY29udGVudCkucGFydHMpO1xuICBjb25zdCBzdXBwb3J0cyA9IGxpc3QobWV0YWRhdGEuZ3JvdW5kaW5nU3VwcG9ydHMpO1xuICBjb25zdCBjbGFpbXM6IENvbnRlbnRHZW5lcmF0aW9uR3JvdW5kaW5nWydjbGFpbXMnXSA9IFtdO1xuICBmb3IoY29uc3QgdmFsdWUgb2Ygc3VwcG9ydHMuc2xpY2UoMCwgMTAwKSkge1xuICAgIGNvbnN0IHN1cHBvcnQgPSBvYmplY3QodmFsdWUpO1xuICAgIGNvbnN0IHNlZ21lbnQgPSBvYmplY3Qoc3VwcG9ydC5zZWdtZW50KTtcbiAgICBjb25zdCBwYXJ0SW5kZXggPSBzZWdtZW50LnBhcnRJbmRleCA/PyAwO1xuICAgIGNvbnN0IHN0YXJ0Qnl0ZSA9IHNlZ21lbnQuc3RhcnRJbmRleCA/PyAwO1xuICAgIGNvbnN0IGVuZEJ5dGUgPSBzZWdtZW50LmVuZEluZGV4O1xuICAgIGNvbnN0IGluZGljZXMgPSBsaXN0KHN1cHBvcnQuZ3JvdW5kaW5nQ2h1bmtJbmRpY2VzKTtcbiAgICBpZighTnVtYmVyLmlzU2FmZUludGVnZXIocGFydEluZGV4KSB8fCAocGFydEluZGV4IGFzIG51bWJlcikgPCAwIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihzdGFydEJ5dGUpXG4gICAgICB8fCAoc3RhcnRCeXRlIGFzIG51bWJlcikgPCAwIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihlbmRCeXRlKSB8fCAoZW5kQnl0ZSBhcyBudW1iZXIpIDw9IChzdGFydEJ5dGUgYXMgbnVtYmVyKVxuICAgICAgfHwgIWluZGljZXMubGVuZ3RoIHx8IGluZGljZXMubGVuZ3RoID4gMjAgfHwgaW5kaWNlcy5zb21lKChpbmRleCkgPT4gIU51bWJlci5pc1NhZmVJbnRlZ2VyKGluZGV4KVxuICAgICAgICB8fCAoaW5kZXggYXMgbnVtYmVyKSA8IDAgfHwgIW1hcHBlZFtpbmRleCBhcyBudW1iZXJdKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcnQgPSBvYmplY3QocGFydHNbcGFydEluZGV4IGFzIG51bWJlcl0pO1xuICAgIGlmKHBhcnQudGhvdWdodCB8fCB0eXBlb2YgcGFydC50ZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20ocGFydC50ZXh0LCAndXRmOCcpO1xuICAgIGlmKChlbmRCeXRlIGFzIG51bWJlcikgPiBieXRlcy5sZW5ndGggfHwgKGVuZEJ5dGUgYXMgbnVtYmVyKSAtIChzdGFydEJ5dGUgYXMgbnVtYmVyKSA+IDgxOTIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzbGljZSA9IGJ5dGVzLnN1YmFycmF5KHN0YXJ0Qnl0ZSBhcyBudW1iZXIsIGVuZEJ5dGUgYXMgbnVtYmVyKTtcbiAgICBjb25zdCB0ZXh0ID0gc2xpY2UudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZighdGV4dC50cmltKCkgfHwgIUJ1ZmZlci5mcm9tKHRleHQsICd1dGY4JykuZXF1YWxzKHNsaWNlKSB8fCAoc2VnbWVudC50ZXh0ICE9PSB1bmRlZmluZWQgJiYgc2VnbWVudC50ZXh0ICE9PSB0ZXh0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNsYWltcy5wdXNoKHtlbmRCeXRlOiBlbmRCeXRlIGFzIG51bWJlciwgcGFydEluZGV4OiBwYXJ0SW5kZXggYXMgbnVtYmVyLFxuICAgICAgc291cmNlczogWy4uLm5ldyBTZXQoaW5kaWNlcyldLm1hcCgoaW5kZXgpID0+IG1hcHBlZFtpbmRleCBhcyBudW1iZXJdISksIHN0YXJ0Qnl0ZTogc3RhcnRCeXRlIGFzIG51bWJlciwgdGV4dH0pO1xuICB9XG4gIGNvbnN0IHJhd1VybHMgPSBsaXN0KG9iamVjdChjYW5kaWRhdGUudXJsQ29udGV4dE1ldGFkYXRhKS51cmxNZXRhZGF0YSk7XG4gIGNvbnN0IHN0YXR1c2VzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZW50R2VuZXJhdGlvblVybENvbnRleHRbJ3VybHMnXVtudW1iZXJdWydzdGF0dXMnXT4gPSB7XG4gICAgVVJMX1JFVFJJRVZBTF9TVEFUVVNfRVJST1I6ICdlcnJvcicsIFVSTF9SRVRSSUVWQUxfU1RBVFVTX1BBWVdBTEw6ICdwYXl3YWxsJywgVVJMX1JFVFJJRVZBTF9TVEFUVVNfU1VDQ0VTUzogJ3N1Y2Nlc3MnLFxuICAgIFVSTF9SRVRSSUVWQUxfU1RBVFVTX1VOU0FGRTogJ3Vuc2FmZSdcbiAgfTtcbiAgY29uc3QgdXJscyA9IHJhd1VybHMuc2xpY2UoMCwgMjApLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgcm93ID0gb2JqZWN0KHZhbHVlKTtcbiAgICBjb25zdCB1cmwgPSBwdWJsaWNVcmwocm93LnJldHJpZXZlZFVybCk7XG4gICAgcmV0dXJuIHVybCA/IFt7c3RhdHVzOiBzdGF0dXNlc1tTdHJpbmcocm93LnVybFJldHJpZXZhbFN0YXR1cyldIHx8ICd1bmF2YWlsYWJsZScsIHVybH1dIDogW107XG4gIH0pO1xuICByZXR1cm4ge2dyb3VuZGluZzogQXJyYXkuaXNBcnJheShtZXRhZGF0YS5ncm91bmRpbmdTdXBwb3J0cylcbiAgICA/IHtjbGFpbXMsIG9taXR0ZWRTdXBwb3J0czogc3VwcG9ydHMubGVuZ3RoIC0gY2xhaW1zLmxlbmd0aH0gOiB1bmRlZmluZWQsXG4gIHNvdXJjZXM6IG1hcHBlZC5maWx0ZXIoKHNvdXJjZSk6IHNvdXJjZSBpcyBDb250ZW50R2VuZXJhdGlvblNvdXJjZSA9PiBCb29sZWFuKHNvdXJjZSkpLFxuICB1cmxDb250ZXh0OiBjYW5kaWRhdGUudXJsQ29udGV4dE1ldGFkYXRhICE9PSB1bmRlZmluZWRcbiAgICA/IHtvbWl0dGVkVXJsczogcmF3VXJscy5sZW5ndGggLSB1cmxzLmxlbmd0aCwgdXJsc30gOiB1bmRlZmluZWR9O1xufTtcbiJdLCJuYW1lcyI6WyJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJvYmplY3QiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImxpc3QiLCJwdWJsaWNVcmwiLCJzZWxlY3RlZCIsImxlbmd0aCIsInRlc3QiLCJ1bmRlZmluZWQiLCJ1cmwiLCJVUkwiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJwb3J0IiwiaG9zdG5hbWUiLCJzZWFyY2giLCJoYXNoIiwiaHJlZiIsInZhbGlkYXRlR2VtaW5pQ29udGV4dFVybHMiLCJpbnB1dCIsInVybHMiLCJtYXAiLCJzb21lIiwiU2V0Iiwic2l6ZSIsImdlbWluaVNvdXJjZUV2aWRlbmNlIiwiY2FuZGlkYXRlIiwibWV0YWRhdGEiLCJncm91bmRpbmdNZXRhZGF0YSIsImNodW5rcyIsImdyb3VuZGluZ0NodW5rcyIsIm1hcHBlZCIsInNsaWNlIiwiY2h1bmsiLCJ3ZWIiLCJ1cmkiLCJ0aXRsZSIsInRyaW0iLCJwYXJ0cyIsImNvbnRlbnQiLCJzdXBwb3J0cyIsImdyb3VuZGluZ1N1cHBvcnRzIiwiY2xhaW1zIiwic3VwcG9ydCIsInNlZ21lbnQiLCJwYXJ0SW5kZXgiLCJzdGFydEJ5dGUiLCJzdGFydEluZGV4IiwiZW5kQnl0ZSIsImVuZEluZGV4IiwiaW5kaWNlcyIsImdyb3VuZGluZ0NodW5rSW5kaWNlcyIsIk51bWJlciIsImlzU2FmZUludGVnZXIiLCJpbmRleCIsInBhcnQiLCJ0aG91Z2h0IiwidGV4dCIsImJ5dGVzIiwiQnVmZmVyIiwiZnJvbSIsInN1YmFycmF5IiwidG9TdHJpbmciLCJlcXVhbHMiLCJwdXNoIiwic291cmNlcyIsInJhd1VybHMiLCJ1cmxDb250ZXh0TWV0YWRhdGEiLCJ1cmxNZXRhZGF0YSIsInN0YXR1c2VzIiwiVVJMX1JFVFJJRVZBTF9TVEFUVVNfRVJST1IiLCJVUkxfUkVUUklFVkFMX1NUQVRVU19QQVlXQUxMIiwiVVJMX1JFVFJJRVZBTF9TVEFUVVNfU1VDQ0VTUyIsIlVSTF9SRVRSSUVWQUxfU1RBVFVTX1VOU0FGRSIsImZsYXRNYXAiLCJyb3ciLCJyZXRyaWV2ZWRVcmwiLCJzdGF0dXMiLCJTdHJpbmciLCJ1cmxSZXRyaWV2YWxTdGF0dXMiLCJncm91bmRpbmciLCJvbWl0dGVkU3VwcG9ydHMiLCJmaWx0ZXIiLCJzb3VyY2UiLCJCb29sZWFuIiwidXJsQ29udGV4dCIsIm9taXR0ZWRVcmxzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSw4QkFBOEIsUUFBTywrQkFBK0I7QUFXNUUsTUFBTUMsU0FBUyxDQUFDQyxRQUNiQSxTQUFTLE9BQU9BLFVBQVUsWUFBWSxDQUFDQyxNQUFNQyxPQUFPLENBQUNGLFNBQVNBLFFBQW1DLENBQUM7QUFDckcsTUFBTUcsT0FBTyxDQUFDSCxRQUErQkMsTUFBTUMsT0FBTyxDQUFDRixTQUFTQSxRQUFRLEVBQUU7QUFDOUUsTUFBTUksWUFBWSxDQUFDSixPQUFnQkssV0FBVyxLQUFLO0lBQ2pELElBQUcsT0FBT0wsVUFBVSxZQUFZQSxNQUFNTSxNQUFNLEdBQUcsUUFBUSxLQUFLQyxJQUFJLENBQUNQLFFBQVE7UUFDdkUsT0FBT1E7SUFDVDtJQUNBLElBQUk7UUFDRixNQUFNQyxNQUFNLElBQUlDLElBQUlWO1FBQ3BCLE9BQU9TLElBQUlFLFFBQVEsS0FBSyxZQUFZLENBQUNGLElBQUlHLFFBQVEsSUFBSSxDQUFDSCxJQUFJSSxRQUFRLElBQUksQ0FBQ0osSUFBSUssSUFBSSxJQUMxRSwyQkFBMkJQLElBQUksQ0FBQ0UsSUFBSU0sUUFBUSxLQUFLLENBQUMsOENBQThDUixJQUFJLENBQUNFLElBQUlNLFFBQVEsS0FDaEgsQ0FBQSxDQUFDVixZQUFhLENBQUNJLElBQUlPLE1BQU0sSUFBSSxDQUFDUCxJQUFJUSxJQUFJLElBQUtSLElBQUlTLElBQUksR0FBR1Y7SUFDOUQsRUFBRSxPQUFLO1FBQ0wsT0FBT0E7SUFDVDtBQUNGO0FBQ0EseUVBQXlFLEdBQ3pFLE9BQU8sTUFBTVcsNEJBQTRCLENBQUNDO0lBQ3hDLE1BQU1DLE9BQU9sQixLQUFLaUIsT0FBT0UsR0FBRyxDQUFDLENBQUN0QixRQUFVSSxVQUFV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
|