E@/      !"#$%&'()*+,-. None9;DR/3authentication scopes that the application requests%Credentials for Google Cloud PlatformFPrivate key (i.e. the PEM string obtained from the Google API Console)FEmail address of the service account (ending in .gserviceaccount.com )email address of the user for which the application is requesting delegated access (defaults to the service account email if Nothing)Service account secret 01/ 01/01/SafeCloud API exception Token exchange exceptions 6Something went wrong with the request, token not found0Errors associated with JWT-encoded token requestAuthentication key exceptions 2345   2345None 0:<=DIR The main type of the library. It can easily be re-used in libraries that interface with more than one cloud API provider because its type parameter c1 lets us be declare distinct behaviours for each.A  with an expiry date60`cacheToken tok hdl` : Overwrite the token TVar tv containing a token if tok! carries a more recent timestamp.7wExtract the token content (needed to authenticate subsequent requests). The token will be valid for at least 60 seconds& Create a  with an empty token8Lift an `IO a` action into the  monad'Lift an `IO a` action into the V monad, and catch synchronous exceptions, while rethrowing the asynchronous ones to IO( Evaluate a  action, given a .+NB : Assumes all exceptions are handled by 9:athe whole point of this parametrization is to have a distinct MonadHttp for each API provider/DSPSinstance HasCredentials c => MonadHttp (Boo c) where handleHttpException = throwM !"#$%6;7&8'(<:=>?@ !#"$%;7&'( !"#$%6;7&8'(<:=>?@None:A produce a &c-separated list of parameters that can be passed to an HTTP querty from a list of key, value pairs BCDAEFGBCDAEFGBCDAEFGNone5HLsend a POST request over HTTPS to a given URI that will return a OAuth2TokenIReturns the UTCTime (absolute) related to a delay in seconds from the time this function is executed. We need this helper function because the "expires_in" field in the OAuth2 response means "seconds from now".JKLMNOPQRSTH Request URI.parameter list as a list of (key, value) pairs#request options (e.g. headers) IICorrection for system delays (e.g. processing and network time). Positive'"seconds from now" parameter. Positive U JKLMNOPQRSTHJKLMNOPQRSTHIUNone!":VOReturns a bytestring with the signed JWT-encoded token request. adapted from _https://github.com/brendanhay/gogol/blob/master/gogol/src/Network/Google/Auth/ServiceAccount.hsVWXVWXVWXNone ,59:;<=DIR *=OAuth2 scopes for the various Google Cloud Platform services.Please refer to  =https://developers.google.com/identity/protocols/googlescopesfor the full list+E`getObject b p` retrieves the contents of a GCS object (of full path p ) in bucket bYM`getObjectMetadata b p` retrieves the metadata of a GCS object (of full path p ) in bucket b,=`listObjects b` retrieves a list of objects stored in bucket b-*`putObject b p body` uploads a bytestring body! into a GCS object (of full path p ) in bucket bZ1Constant request parameters required by GCS calls[1Constant request parameters required by GCS calls\Implementation of %]Request an OAuth2Token^cWe can provide a custom http exception handler rather than throwing exceptions with this instance )*_+Y,-Z[\]^`a)*+Y,-\)*_+Y,-Z[\]^`a None.Parse a chunk of text into an RSA private key. For Google Cloud Platform , this is the private key associated with the user's "service account" (for server-to-server API use) 1https://console.cloud.google.com/apis/credentials Note: do not[ supply the RSA header and footer or any newlines (they will be inserted by this function)..b..bNone/  !#"$%&'()*+,-./+,-*('&)!"#$% .  c       !"#$$%&'()*+,-./0123 4566789:;<=>?@ABCDEFGHIJKLMNOPQQRSTUUVWXYZ[\]^_`abcdef gh&goggles-0.1.0.1-LZ5NeZSDq9i12dv3RdgUk0Network.GogglesNetwork.Goggles.Types"Network.Goggles.Control.ExceptionsNetwork.Goggles.CloudNetwork.Utils.HTTPNetwork.Goggles.Auth.OAuth2Network.Goggles.Auth.JWT"Network.Goggles.Auth.TokenExchange Data.KeysGCPServiceAccount_servicePrivateKey _serviceEmail_serviceAccountUser_gcpServiceAcctSecretCloudException UnknownErrorIOError TimeoutErrorJsonDecodeErrorTokenExchangeExceptionNotFoundAPICredentialsNotFoundJWTErrorBadExpirationTimeCryptoSignError KeyException NoSecretFound NoParsePKNoRSAKeyCloudrunCloudHandle credentialstokenoptionsTokentTokentTimeHasCredentials CredentialsOptions TokenContent tokenFetch createHandle liftCloudIO evalCloudIOGCP scopesDefault getObject listObjects putObjectparseRSAPrivateKey_tokenOptionsScopesGCPTokenOptions$fExceptionCloudException!$fExceptionTokenExchangeException$fExceptionJWTError$fExceptionKeyException cacheToken accessToken liftCloudIO_'exceptions-0.8.3-74UMKX8an841ULC0nHtYN7Control.Monad.CatchthrowM$fMonadRandomCloud refreshToken$fMonadReaderHandleCloud$fMonadCatchCloud$fMonadThrowCloud$fMonadIOCloud$fAlternativeCloudencodeHttpParametersLBgetLbspostLbsputLbsencodeHttpParameters urlEncode urlDecoderequestOAuth2TokentokenExpiryTime OAuth2TokenoaTokenExpirySeconds oaTokenString oaTokenTypeOAuth2TokenUTCoauTokenExpiryoauTokenString oauTokenTypemkOAuth2TokenUTC$fFromJSONOAuth2TokenencodeBearerJWT base64Encodebase64getObjectMetadataaltMediaulMediarequestTokenGCPrequestGcpOAuth2Token$fMonadHttpClouduriBase $fShowToken$fHasCredentialsGCPparseRSAPrivateKey_helper