Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1irdI0-00029Q-34 for psycopg@arkaria.postgresql.org; Wed, 15 Jan 2020 07:40:32 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1irdHy-0004VK-Rz for psycopg@arkaria.postgresql.org; Wed, 15 Jan 2020 07:40:30 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1ircIB-00044L-MO for psycopg@lists.postgresql.org; Wed, 15 Jan 2020 06:36:40 +0000 Received: from mail-eopbgr1360080.outbound.protection.outlook.com ([40.107.136.80] helo=AUS01-ME1-obe.outbound.protection.outlook.com) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ircI5-0005xm-PO for psycopg@postgresql.org; Wed, 15 Jan 2020 06:36:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ir1Yd/LeSrFKtdrIkt4PcfkIVzATEgDeciKLB5vNJlS4+T2EQEn+RQlLNqudZpq3V3qW3fwtQXNkEUupbFKftA7qQHYSHHvZOOcfuZn7YG3v+dbDZvZAg7vh8eNnR5XFTLpyyyAqglEQqvvOEjJJdX8YsWXAk61pS9jjsfM39ATz7QQ4OKrrKZS8ZiBTIObPge+rLux8pPLoAOXhJ+SuaXrIkBVymjxTRkJ8wDW1bpTEOCLIFfok/2p8hYR+p1PT/9TGZ7bCZmHwJTzNtFZCHInRLV4aNxQPyp/8C8SrekgrfBP17rxUjloMz/5O566e4ADlDGSy47PVvtTHusspPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EW/HYN9cGB+BmWrkgWK0bGOJFBk4JACBJpd+HTce9RA=; b=hRTFfvV+DgLKb9qRuLAugCrnuqFdCZWZ6ppcwq/VFwXd+hA82y/3m42riQbxgP5Kejsa40eb9F5JBphwFDA6BSivgsm+75kHmjdcVisMON/5H6PlXbaUXxzsZbab8tJS81vp104oHLzDBHQE/R/JXqIT6XPBDspnVjcnemvC4QiTmazKzzWu/y3fkd3U5YTbychC3D+qEdNnCSgcseb147msActBWuttxRaJ3qPU4oShqRl945P39cQg7K6fDYgb9BSFvJ2HoZMKqk1hbUP1Uv1sErRKCOqogAB7ZKnPz/KcxOLM8pwi7voex1CGib9EL2bYQu2jJh7ktHtIQ1/jzg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arq.group; dmarc=pass action=none header.from=arq.group; dkim=pass header.d=arq.group; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arq.group; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EW/HYN9cGB+BmWrkgWK0bGOJFBk4JACBJpd+HTce9RA=; b=EFWAdAhTbZTsqrwZ/hUh6eZQpYZcSYNYs9NRfPET7b/Or5bwe/ONGbzydDk09xwuJ6aqu648N7eSJL1LsGidaopS/1qGN3sR1/Taa7DLMvT+5pF+5kaDsCMEilL2xvuMZeUmrz4BfQyY3RP4LtDhcqGI4xwzcKjFqXVIViIrKVY= Received: from SY2PR01MB2698.ausprd01.prod.outlook.com (52.134.168.19) by SY2PR01MB2233.ausprd01.prod.outlook.com (52.134.188.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.9; Wed, 15 Jan 2020 06:36:27 +0000 Received: from SY2PR01MB2698.ausprd01.prod.outlook.com ([fe80::1eb:a677:5899:30ff]) by SY2PR01MB2698.ausprd01.prod.outlook.com ([fe80::1eb:a677:5899:30ff%7]) with mapi id 15.20.2623.015; Wed, 15 Jan 2020 06:36:27 +0000 From: Anthony Waye To: "psycopg@postgresql.org" Subject: Executing stored procs Thread-Topic: Executing stored procs Thread-Index: AdXLZzcOuNzCUAA0TTm46j/6hb3X3g== Date: Wed, 15 Jan 2020 06:36:26 +0000 Message-ID: Accept-Language: en-AU, en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=anthony.waye@arq.group; x-originating-ip: [101.2.210.1] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 4221e2fc-5623-4ea8-70ff-08d799853f8a x-ms-traffictypediagnostic: SY2PR01MB2233: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:10000; x-forefront-prvs: 02830F0362 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(4636009)(39850400004)(396003)(346002)(376002)(136003)(366004)(199004)(189003)(5660300002)(316002)(86362001)(76116006)(45080400002)(81156014)(71200400001)(861006)(66576008)(66946007)(66556008)(66476007)(66446008)(7696005)(7116003)(64756008)(6506007)(26005)(186003)(9686003)(33656002)(6916009)(2906002)(3480700007)(9326002)(8936002)(52536014)(44832011)(55016002)(478600001)(8676002)(81166006)(46492004)(579004);DIR:OUT;SFP:1101;SCL:1;SRVR:SY2PR01MB2233;H:SY2PR01MB2698.ausprd01.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: arq.group does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 4ilfD5EUTdd/kt4sAfT7/d+jWioVkeycrRNt4JP16dvAX/rtWaKhaTEmYzao1rUeX4JgcLmyqajxvD6QH5IQ0IR6+HH1R6rTThSnpgjdDdyyTe13QKjVe6FX5qU4kl4Qv9WsOB9Ll431yeWQTlh1Ag+zgZLeSz4sZeo1q9q5y8uMF2IcFKP4zoZobqO20SvXeOsanPGrAtcvTJG1/CEISDqcebJC4LNyN8OAzYiFAmvdHcimg2k5NTvEkNtsMD2Q75Y+ua7Gw6j7MGAJ3g7pbBQNqY9lWrJ8UViBpBQfdshmUiYOrssWySghJBOi4zaAZcPw+jBsszi7hI/5BX/mq4XjEnv3HBeiZMDBQEICo59Sp66AHDKvQjH4MiNT9vxkmoRS9VnrtnMapT3G5es1okeFD4nf63DRAgdaOl29PgVehZaVHoxiqkPr+skPAfBESkFLt1f+dRmvBz68V5wl4gAPAMucC9nHLc/TUB6qmSqlwEQzWjakubjbnrtDfr7qOE/ScCD+IUcNiTcgo9RqGw== x-ms-exchange-transport-forked: True Content-Type: multipart/related; boundary="_005_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_"; type="multipart/alternative" MIME-Version: 1.0 X-OriginatorOrg: arq.group X-MS-Exchange-CrossTenant-Network-Message-Id: 4221e2fc-5623-4ea8-70ff-08d799853f8a X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Jan 2020 06:36:27.0203 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 904e03f7-cc20-4ffd-8d15-32929abca38e X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: waDP2vVpm6XnFqsLwYOp8H370qdj6ZpqnNiSppFkfyLa2rUtbKnTbBsXF3i8QrD9fwkTUHvOpr1in5VRaA9cMg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY2PR01MB2233 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --_005_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_ Content-Type: multipart/alternative; boundary="_000_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_" --_000_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, I've been currently trying to execute stored procs with psycopg2 on an AWS = redshift cluster but no matter what I do I can't figure out the syntax for = how to get it to successfully execute. CREATE OR REPLACE PROCEDURE stg_customervip.sp_STG_Customer ( p_Audit= _RunID IN bigint , p_Audit= _RunDTS IN timestamp ) AS $$ BEGIN TRUNCATE table stg_customervip.Customer; INSERT INTO stg_customervip.Customer ( ,Audit_RunID ,Audit_RunDTS ) SELECT ,p_Audit_RunID AS Audit_RunID ,p_Audit_RunDTS AS Audit_RunDTS FROM stg_customervip_temp.customer; END; $$ LANGUAGE plpgsql; try: redshift_conn =3D psycopg2.connect(dbname=3Dargs.redshift_database_name= , host=3Dargs.redshift_address, port=3Dargs.redshift_port, user=3Dr= edshift_creds['username'], password=3Dredshift_creds['password']) except Exception as e: raise(e) rand =3D random.randrange( 15, 45) timestamp =3D datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S") for proc in stored_procs_obj: qry_str =3D sql.SQL("CALL {proc}({int}::bigint, {timestamp}::timestamp)= ").format( proc=3Dsql.Identifier(proc['schemaname'], proc['procedurename']), i= nt=3Dsql.Literal(rand), timestamp=3Dsql.Literal(timestamp)) logger.info(qry_str.as_string(redshift_conn)) logger.info(redshift_conn.closed) redshift_conn.reset() try: with redshift_conn.cursor() as cursor: cursor.execute(qry_str) redshift_conn.commit() logger.info("Query successfully committed") except Exception as e: redshift_conn.close() send_sfn_failure(args.task_token, "Exception", str(e)) raise Essentially results in a SQL query of: CALL "stg_customervip"."sp_stg_custo= mer"(37::bigint, '2020-01-15 05:52:31'::timestamp) If I take that query and run it directly in redshift it runs successfully b= ut via psycopg2 it returns: psycopg2.errors.FeatureNotSupported: TRUNCATE cannot be invoked from a proc= edure that is executing in an atomic context. HINT: Try calling the procedure as a top-level call i.e. not from within an= explicit transaction block. Or, if this procedure (or one of its ancestors= in the call chain) was created with SET config options, recreate the proce= dure without them. CONTEXT: SQL statement "TRUNCATE table stg_customervip.Customer" While that error sounds legitimate I think it might be a redherring because= it does execute successfully if I do it manually against redshift. I've also attempted to try: SELECT "stg_customervip"."sp_stg_customer"(37::= bigint, '2020-01-15 05:52:31'::timestamp) but that returns: [Amazon](500310= ) Invalid operation: stg_customervip.sp_stg_customer(bigint, timestamp with= out time zone) is a procedure; I did notice there was a callproc() function available to call a function o= r a procedure but that doesn't make it any further param1 =3D str(rand) + "::bigint" param2 =3D timestamp + "::timestamp" try: with redshift_conn.cursor() as cursor: cursor.callproc(proc['fullprocedurename'], (param1, param2)= ) redshift_conn.commit() logger.info("Query successfully committed") except Exception as e: redshift_conn.close() send_sfn_failure(args.task_token, "Exception", str(e)) raise returns: psycopg2.errors.WrongObjectType: stg_connect.sp_stg_store("unknown", "unkno= wn") is a procedure HINT: To call a procedure, use CALL. Has anyone encountered this or has any suggerstions? Thanks Anthony Waye Senior Systems Engineer - DevOps (Microsoft) [cid:image001.png@01D5CBBB.6A72A9C0] M 0400167098 D 0732307463 Level 3, 192 Ann Street, Brisbane, QLD 4000 arq.group [cid:image002.png@01D5CBBB.6A72A9C0] The information contained in this email message may be confidential. If you= are not the intended recipient any use, distribution, disclosure or copyin= g of this information is prohibited. If you receive this email in error, pl= ease tell us by return email and delete it and any attachments from your sy= stem. --_000_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

I’ve been currently trying to execute stored p= rocs with psycopg2 on an AWS redshift cluster but no matter what I do I can= ’t figure out the syntax for how to get it to successfully execute.

 

CREATE OR REPL= ACE PROCEDURE stg_customervip.sp_STG_Customer<= span style=3D"font-size:10.5pt;font-family:Consolas;color:#ABB2BF;mso-farea= st-language:EN-AU"> ( 

         &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;         = IN bigint=  ,

         &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;         IN timestamp

         &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;        )

AS $$

BEGIN

TRUNCATE table = stg_customervip.Custo= mer;

 

INSERT INTO st= g_customervip.Custome= r

       (

        ,Audit_RunID   &= nbsp;

        ,Audit_RunDTS=

        )

SELECT <= /p>

        ,p_Audit_RunID  AS Audit_RunID

        ,p_Audit_RunDTS AS Audit_RunDTS

FROM stg_customervip_temp.customer;

END;

$$ LANGUAGE plpgsql; 

 

= try:

    redshift_conn =3D psycopg2.connect(d= bname=3Dargs.reds= hift_database_name, host=3Dargs.redshift_address,

         &nbs= p;            &= nbsp;           &nbs= p;     port=3Dargs.redshift_port,&nbs= p;user=3Dredshift_creds['username'<= /span>], password=3Dredshift_creds['password'])=

= except Exception&nb= sp;as e:<= o:p>

    rais= e(e)

 

rand =3D random.randrange(

    1545)

timestamp =3D datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")

= for proc in stored_procs_obj:<= o:p>

    qry_str =3D sql.SQ= L("CALL {proc}({int}::bigint, {timestamp}::timestamp)").format(

        = proc=3Dsql.Identifier(proc['schemaname'= ], proc['procedurename']), int=3Dsql.Liter= al(rand), tim= estamp=3Dsql.Literal(timestamp))<= /o:p>

    logger.= info(qry_str.as_strin= g(redshift_conn))

    logger.= info(redshift_conn.closed)

    redshift_conn.reset()

    try<= /span>:

        = with redshift_conn.= cursor() = as cursor:<= /o:p>

         &nbs= p;  cursor.execute(qry_str)

         &nbs= p;  redshift_conn.commit()

         &nbs= p;  logger.info("Query successfully committe= d")

    exce= pt Exception as e:

        redshift_c= onn.close()

        send_sfn_failure(args.task_toke= n, "Exception"str(e= ))

        = raise<= /p>

 

Essentially results in a SQL query of: CALL "st= g_customervip"."sp_stg_customer"(37::bigint, '2020-01-15 05:= 52:31'::timestamp)

If I take that query and run it directly in redshift= it runs successfully but via psycopg2 it returns:

 

psyc= opg2.errors.FeatureNotSupported: TRUNCATE cannot be invoked from a procedur= e that is executing in an atomic context.

HINT: = Try calling the procedure as a top-level call i.e. not from within an expli= cit transaction block. Or, if this procedure (or one of its ancestors in the call chain) was created with SET config op= tions, recreate the procedure without them.

CONT= EXT: SQL statement "TRUNCATE table stg_customervip.Customer"=

 

While that error sounds legitimate I think it might = be a redherring because it does execute successfully if I do it manually ag= ainst redshift.

 

I’ve also attempted to try: SELECT "stg_c= ustomervip"."sp_stg_customer"(37::bigint, '2020-01-15 05:52:= 31'::timestamp) but that returns: [Amazon](500310) Invalid operation: stg_c= ustomervip.sp_stg_customer(bigint, timestamp without time zone) is a procedure;

 

I did notice there was a callproc() function availab= le to call a function or a procedure but that doesn’t make it any fur= ther

 

        param1&nbs= p;=3D str(rand) + "::bigint"

        param2&nbs= p;=3D timestamp&= nbsp;+ "::timestamp"

 

        = try:

         &nbs= p;  with redshift_conn.cursor() as cursor:

         &nbs= p;      cursor.cal= lproc(proc['fullproce= durename'], (param1, param2))

         &nbs= p;      redshift_conn.commit()

         &nbs= p;      logger.inf= o("Query su= ccessfully committed")

        = except Exception&nb= sp;as e:<= o:p>

         &nbs= p;  redshift_conn.close()

         &nbs= p;  send_sfn_failure(args.task_token, "Exception&= quot;str(e))

         &nbs= p;  raise

 

returns:

psyc= opg2.errors.WrongObjectType: stg_connect.sp_stg_store("unknown", = "unknown") is a procedure

HINT: = To call a procedure, use CALL.

 

Has anyone encountered this or has any suggerstions?=

 

Thanks

Senior Systems Engineer - DevOps (Microsoft)
=

M  0400167098
D  0732307463

Level 3, 192 Ann Street, Brisbane, QLD 40= 00
arq.group

The information contained in this email message may be confident= ial. If you are not the intended recipient any use, distribution, disclosure or copying of this information is prohib= ited. If you receive this email in error, please tell us by return email an= d delete it and any attachments from your system.

&nbs= p;

 

--_000_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_-- --_005_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_ Content-Type: image/png; name="image001.png" Content-Description: image001.png Content-Disposition: inline; filename="image001.png"; size=3917; creation-date="Wed, 15 Jan 2020 06:36:26 GMT"; modification-date="Wed, 15 Jan 2020 06:36:26 GMT" Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAHIAAABaCAYAAABkIgImAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1 Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOklu c3RhbmNlSUQ9InhtcC5paWQ6RDUwQjk1OTE0RkZEMTFFOEIzQzdDMkI5NDAwODIxMTUiIHhtcE1N OkRvY3VtZW50SUQ9InhtcC5kaWQ6RDUwQjk1OTI0RkZEMTFFOEIzQzdDMkI5NDAwODIxMTUiPiA8 eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENTBCOTU4RjRGRkQx MUU4QjNDN0MyQjk0MDA4MjExNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENTBCOTU5MDRG RkQxMUU4QjNDN0MyQjk0MDA4MjExNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8 L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmu4eXcAAAu7SURBVHja7F0LsFVVGV6Xi2LI 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 --_005_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_ Content-Type: image/png; name="image002.png" Content-Description: image002.png Content-Disposition: inline; filename="image002.png"; size=1288; creation-date="Wed, 15 Jan 2020 06:36:26 GMT"; modification-date="Wed, 15 Jan 2020 06:36:26 GMT" Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1 Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOklu c3RhbmNlSUQ9InhtcC5paWQ6RDk4NEQ3MEU1MDEyMTFFOEIzQzdDMkI5NDAwODIxMTUiIHhtcE1N OkRvY3VtZW50SUQ9InhtcC5kaWQ6RDk4NEQ3MEY1MDEyMTFFOEIzQzdDMkI5NDAwODIxMTUiPiA8 eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEOTg0RDcwQzUwMTIx MUU4QjNDN0MyQjk0MDA4MjExNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEOTg0RDcwRDUw MTIxMUU4QjNDN0MyQjk0MDA4MjExNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8 L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq8cAD4AAAF2SURBVHjaYjxz5owOAwPDIiA2 ZKAvOAHE8UxAYsEAWA4CFkA8l2mALIcBXZADmAbQAQwsOMSfAfFUIP4OxHFAbEBPBzyFWvgGyp8C xJuB2J0WDsAW/BORLAeB30DcTqsQwOaAn1jEvtLTAeFYxCPo6QArIF4PxDZArA3EvUBcRO9c4AfF A5YNyQWfgfgAED8HYmFoCGqQGgVbgZgRDXcgyVdikf8PzSky0JBLB+IQINYEYlMgvkSKA8gBFUBc BcSfsMidAWIXaOFGMwd0E5B/DcRdtHTAf6hZelDMiEXNelo6QASIrwDxRSjei8XsR0D8nlYOyIAm OBhwBGJXHJUcTRxgj0VMG4vYF1o5QAiLGBsWsd+0cgArNesCuoJRB4w6YMAdwAjsmv1HE/sIxHfQ xKSBWAKp1fwCTV4LiDmxtK7R1akDMQ+yXdgaJPxAbIzH0dJQTAgQpY4JWpMNaBo4O4D2nwVFQQwQ zwBifTpbfgqIMwECDADhAj/xR/QIxwAAAABJRU5ErkJggg== --_005_SY2PR01MB269862BBF4F6FC0813C11AC386370SY2PR01MB2698ausp_--