// ĠCopyright Ġ 2 0 2 1 ĠThe ĠCross - Media ĠMeasurement ĠAuthors Ċ // Ċ // ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ // Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ċ // ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ // ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ // ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ // Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ċ package Ġorg . wf an et . measurement . load test . dat apro vider Ċ Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . logging . Logger Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . emit All Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġorg . wf an et . an ys k etch . Any Sketch Ċ import Ġorg . wf an et . an ys k etch . Sketch Ċ import Ġorg . wf an et . an ys k etch . Sketch Config Ċ import Ġorg . wf an et . an ys k etch . Sketch Config Kt . index Spec Ċ import Ġorg . wf an et . an ys k etch . Sketch Config Kt . value Spec Ċ import Ġorg . wf an et . an ys k etch . Sketch Protos Ċ import Ġorg . wf an et . an ys k etch . crypto . Combine El G amal Public Keys Request Ċ import Ġorg . wf an et . an ys k etch . crypto . Combine El G amal Public Keys Response Ċ import Ġorg . wf an et . an ys k etch . crypto . El G amal PublicKey Ġas ĠAny Sketch El G amal PublicKey Ċ import Ġorg . wf an et . an ys k etch . crypto . Encrypt Sketch Request Ċ import Ġorg . wf an et . an ys k etch . crypto . Encrypt Sketch Response Ċ import Ġorg . wf an et . an ys k etch . crypto . Sketch Encrypt er Adapter Ċ import Ġorg . wf an et . an ys k etch . distribution Ċ import Ġorg . wf an et . an ys k etch . exponent ial Distribution Ċ import Ġorg . wf an et . an ys k etch . oracle Distribution Ċ import Ġorg . wf an et . an ys k etch . sketch Config Ċ import Ġorg . wf an et . an ys k etch . uniform Distribution Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Certificates Grpc Kt . Certificates Coroutine Stub Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . El G amal PublicKey Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Event Groups Grpc Kt . Event Groups Coroutine Stub Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Ful fill Re quisition Request Kt . body Chunk Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Ful fill Re quisition Request Kt . header Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Liquid Leg ions Sketch Params Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . List Re quis itions Request Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Measurement Spec Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Protocol Config Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Re quisition Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Re quisition Ful fillment Grpc Kt . Re quisition Ful fillment Coroutine Stub Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Re quisition Spec Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Re quis itions Grpc Kt . Re quis itions Coroutine Stub Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . Signed Data Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . create Event Group Request Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . event Group Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . ful fill Re quisition Request Ċ import Ġorg . wf an et . measurement . api . v 2 alpha . get Certificate Request Ċ import Ġorg . wf an et . measurement . common . as Buffered Flow Ċ import Ġorg . wf an et . measurement . common . crypto . PrivateKey Handle Ċ import Ġorg . wf an et . measurement . common . crypto . Signing Key Handle Ċ import Ġorg . wf an et . measurement . common . crypto . read Certificate Ċ import Ġorg . wf an et . measurement . common . load Library Ċ import Ġorg . wf an et . measurement . common . log And Suppress Exception Suspend Ċ import Ġorg . wf an et . measurement . common . th rott ler . Minimum Interval Th rott ler Ċ import Ġorg . wf an et . measurement . consent . client . dat apro vider . compute Re quisition Fingerprint Ċ import Ġorg . wf an et . measurement . consent . client . dat apro vider . decrypt Re quisition Spec Ċ import Ġorg . wf an et . measurement . consent . client . dat apro vider . verify Measurement Spec Ċ import Ġorg . wf an et . measurement . consent . client . dat apro vider . verify Re quisition Spec Ċ import Ġorg . wf an et . measurement . load test . storage . Sketch Store Ċ Ċ data Ġclass ĠEd pData ( ĊĠ Ġ/** ĠThe ĠE DP 's Ġpublic ĠAPI Ġresource Ġname . Ġ*/ ĊĠ Ġval Ġname : ĠString , ĊĠ Ġ/** ĠThe ĠE DP 's Ġdisplay Ġname . Ġ*/ ĊĠ Ġval ĠdisplayName : ĠString , ĊĠ Ġ/** ĠThe ĠE DP 's Ġconsent Ġsignal ing Ġencryption Ġkey . Ġ*/ ĊĠ Ġval Ġencryption Key : ĠPrivate Key Handle , ĊĠ Ġ/** ĠThe ĠE DP 's Ġconsent Ġsignal ing Ġsigning Ġkey . Ġ*/ ĊĠ Ġval Ġsigning Key : ĠSign ing Key Handle Ċ ) Ċ Ċ /** ĠA Ġsimulator Ġhandling ĠE DP Ġbus inesses . Ġ*/ Ċ class ĠEd p Simulator ( ĊĠ Ġprivate Ġval Ġed pData : ĠEd pData , ĊĠ Ġprivate Ġval Ġmeasurement Consumer Name : ĠString , ĊĠ Ġprivate Ġval Ġcertificates Stub : ĠC ertificates Coroutine Stub , ĊĠ Ġprivate Ġval Ġevent Groups Stub : ĠEvent Groups Coroutine Stub , ĊĠ Ġprivate Ġval Ġrequis itions Stub : ĠRe quis itions Coroutine Stub , ĊĠ Ġprivate Ġval Ġre quisition Ful fillment Stub : ĠRe quisition Ful fillment Coroutine Stub , ĊĠ Ġprivate Ġval Ġsketch Store : ĠSk etch Store , ĊĠ Ġprivate Ġval Ġevent Query : ĠEvent Query , ĊĠ Ġprivate Ġval Ġth rott ler : ĠMinimum Interval Th rott ler Ċ ) Ġ{ ĊĊĠ Ġ/** ĠA Ġsequence Ġof Ġoperations Ġdone Ġin Ġthe Ġsimulator . Ġ*/ ĊĠ Ġsuspend Ġfun Ġprocess () Ġ{ ĊĠĠĠ Ġcreate Event Group () ĊĠĠĠ Ġth rott ler . loop On Ready Ġ{ ĊĠĠĠĠĠ Ġlog And Suppress Exception Suspend Ġ{ Ġexecute Re quisition Ful fill ing Workflow () Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠCreates Ġan Ġevent Group Ġfor Ġthe ĠMC . Ġ*/ ĊĠ Ġprivate Ġsuspend Ġfun Ġcreate Event Group () Ġ{ ĊĠĠĠ Ġval Ġevent Group Ġ= ĊĠĠĠĠĠ Ġevent Groups Stub . create Event Group ( ĊĠĠĠĠĠĠĠ Ġcreate Event Group Request Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġed pData . name ĊĠĠĠĠĠĠĠĠĠ Ġevent Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Group Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement Consumer Ġ= Ġmeasurement Consumer Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Group Reference Id Ġ= Ġ" 0 0 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġlogger . info (" Successfully Ġcreated Ġevent Group Ġ${ event Group . name } ...") ĊĠ Ġ} ĊĊĠ Ġ/** ĠExec utes Ġthe Ġre quisition Ġfulfill ment Ġworkflow . Ġ*/ ĊĠ Ġprivate Ġsuspend Ġfun Ġexecute Re quisition Ful fill ing Workflow () Ġ{ ĊĠĠĠ Ġlogger . info (" Executing Ġre quisition Ful fill ing Workflow ...") ĊĠĠĠ Ġval Ġre quisition Ġ= Ġget Re quisition () ĊĠĠĠ Ġif Ġ( requis ition Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġlogger . info (" No Ġun fulfilled Ġre quisition . ĠPol ling Ġagain Ġlater ...") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġlogger . info (" Processing Ġre quisition Ġ${ requis ition . name } ...") ĊĊĠĠĠ Ġif Ġ( requis ition . protocol Config . protocol Case Ġ!= ĠProtocol Config . Protocol Case . LI Q UID _ LEG IONS _ V 2 ) Ġ{ ĊĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠ Ġ" Skipping Ġre quisition Ġ${ requis ition . name }, Ġonly ĠLI Q UID _ LEG IONS _ V 2 Ġis Ġsupported ..." ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmeasurement Consumer Certificate Ġ= ĊĠĠĠĠĠ Ġcertificates Stub . get Certificate ( ĊĠĠĠĠĠĠĠ Ġget Certificate Request Ġ{ Ġname Ġ= Ġre quisition . measurement Consumer Certificate Ġ} ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġmeasurement Spec Ġ= ĠMeasurement Spec . parseFrom ( requis ition . measurement Spec . data ) ĊĠĠĠ Ġval Ġmeasurement Consumer Certificate X 5 0 9 Ġ= Ġread Certificate ( measurement Consumer Certificate . x 5 0 9 Der ) ĊĠĠĠ Ġif Ġ(! verify Measurement Spec ( ĊĠĠĠĠĠĠĠ Ġmeasurement Spec Signature Ġ= Ġre quisition . measurement Spec . signature , ĊĠĠĠĠĠĠĠ Ġmeasurement Spec Ġ= Ġmeasurement Spec , ĊĠĠĠĠĠĠĠ Ġmeasurement Consumer Certificate Ġ= Ġmeasurement Consumer Certificate X 5 0 9 , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġlogger . info (" Re quisition Ful fillment Workflow Ġfailed Ġdue Ġto : Ġinvalid Ġmeasurement Spec .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġre quisition Fingerprint Ġ= Ġcompute Re quisition Fingerprint ( requis ition ) ĊĠĠĠ Ġval Ġsigned Re quisition Spec : ĠSigned Data Ġ= ĊĠĠĠĠĠ Ġdecrypt Re quisition Spec ( requis ition . encrypted Re quisition Spec , Ġed pData . encryption Key ) ĊĠĠĠ Ġval Ġre quisition Spec Ġ= ĠRe quisition Spec . parseFrom ( signed Re quisition Spec . data ) ĊĠĠĠ Ġif Ġ(! verify Re quisition Spec ( ĊĠĠĠĠĠĠĠ Ġre quisition Spec Signature Ġ= Ġsigned Re quisition Spec . signature , ĊĠĠĠĠĠĠĠ Ġre quisition Spec Ġ= Ġre quisition Spec , ĊĠĠĠĠĠĠĠ Ġmeasurement Consumer Certificate Ġ= Ġmeasurement Consumer Certificate X 5 0 9 , ĊĠĠĠĠĠĠĠ Ġmeasurement Spec Ġ= Ġmeasurement Spec , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġlogger . info (" Re quisition Ful fillment Workflow Ġfailed Ġdue Ġto : Ġinvalid Ġre quisition Spec .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcombined PublicKey Ġ= ĊĠĠĠĠĠ Ġre quisition . get Combined PublicKey ( requis ition . protocol Config . liquid Leg ions V 2 . elli ptic Curve Id ) ĊĠĠĠ Ġval Ġsketch Config Ġ= Ġre quisition . protocol Config . liquid Leg ions V 2 . sketch Params . to Sketch Config () ĊĠĠĠ Ġval Ġsketch Ġ= Ġgenerate Sketch ( sketch Config ) ĊĊĠĠĠ Ġsketch Store . write ( requis ition . name , Ġsketch . to ByteString ()) ĊĠĠĠ Ġval Ġsketch Chunks : ĠFlow < ByteString > Ġ= ĊĠĠĠĠĠ Ġencrypt Sketch ( sketch , Ġcombined PublicKey , Ġre quisition . protocol Config . liquid Leg ions V 2 ) ĊĠĠĠ Ġfulfill Re quisition ( ĊĠĠĠĠĠ Ġre quisition . name , ĊĠĠĠĠĠ Ġre quisition Fingerprint , ĊĠĠĠĠĠ Ġre quisition Spec . nonce , ĊĠĠĠĠĠ Ġsketch Chunks ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Sketch ( ĊĠĠĠ Ġsketch Config : ĠSk etch Config , ĊĠ Ġ): ĠSk etch Ġ{ ĊĠĠĠ Ġlogger . info (" Generating ĠSk etch ...") ĊĠĠĠ Ġval Ġany Sketch : ĠAny Sketch Ġ= ĠSk etch Protos . to Any Sketch ( sketch Config ) ĊĊĠĠĠ Ġ// ĠTODO (@ wang ya op w ): Ġget Ġthe Ġquery Parameter Ġfrom ĠEvent Filters Ġwhen ĠEvent Filters Ġis Ġimplemented . ĊĠĠĠ Ġval Ġquery Parameter Ġ= ĊĠĠĠĠĠ ĠQuery Parameter ( ĊĠĠĠĠĠĠĠ Ġed p DisplayName Ġ= Ġed pData . displayName , ĊĠĠĠĠĠĠĠ Ġbegin Date Ġ= Ġ" 2 0 2 1 - 0 3 - 0 1 ", ĊĠĠĠĠĠĠĠ ĠendDate Ġ= Ġ" 2 0 2 1 - 0 3 - 2 8 ", ĊĠĠĠĠĠĠĠ Ġsex Ġ= ĠS ex . F EM ALE , ĊĠĠĠĠĠĠĠ Ġage Group Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġsocial Grade Ġ= ĠSocial Grade . ABC 1 , ĊĠĠĠĠĠĠĠ Ġcomplete Ġ= ĠComplete . COMPLETE ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġevent Query . getUser Virtual Ids ( query Parameter ). forEach Ġ{ ĊĠĠĠĠĠ Ġany Sketch . insert ( it , Ġmap Of (" frequency " Ġto Ġ 1 L )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠSk etch Protos . from Any Sketch ( any Sketch , Ġsketch Config ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġencrypt Sketch ( ĊĠĠĠ Ġsketch : ĠSk etch , ĊĠĠĠ Ġcombined PublicKey : ĠAny Sketch El G amal PublicKey , ĊĠĠĠ Ġprotocol Config : ĠProtocol Config . Liquid Leg ions V 2 ĊĠ Ġ): ĠFlow < ByteString > Ġ{ ĊĠĠĠ Ġlogger . info (" Encrypt ing ĠSk etch ...") ĊĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠ ĠEncrypt Sketch Request . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . sketch Ġ= Ġsketch ĊĠĠĠĠĠĠĠĠĠ Ġel G amal Keys Ġ= Ġcombined PublicKey ĊĠĠĠĠĠĠĠĠĠ Ġcurve Id Ġ= Ġprotocol Config . elli ptic Curve Id . to Long () ĊĠĠĠĠĠĠĠĠĠ Ġmaximum Value Ġ= Ġprotocol Config . maximum Frequency ĊĠĠĠĠĠĠĠĠĠ Ġdestroyed Register Strategy Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEncrypt Sketch Request . Destroyed Register Strategy . FLAG GED _ KEY Ġ// Ġfor ĠLL _ V 2 Ġprotocol ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( wang ya op w ): Ġadd Ġpublisher Ġnoise ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġval Ġresponse Ġ= ĊĠĠĠĠĠ ĠEncrypt Sketch Response . parseFrom ( Sketch Encrypt er Adapter . Encrypt Sketch ( request . toByteArray ())) ĊĊĠĠĠ Ġreturn Ġresponse . encrypted Sketch . as Buffered Flow ( 1 0 2 4 ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġfulfill Re quisition ( ĊĠĠĠ Ġre quisition Name : ĠString , ĊĠĠĠ Ġre quisition Fingerprint : ĠByte String , ĊĠĠĠ Ġnonce : ĠLong , ĊĠĠĠ Ġdata : ĠFlow < ByteString > ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġlogger . info (" Ful fill ing Ġre quisition Ġ$ requis ition Name ...") ĊĠĠĠ Ġre quisition Ful fillment Stub . ful fill Re quisition ( ĊĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠ Ġfulfill Re quisition Request Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġre quisition Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . requis ition Fingerprint Ġ= Ġre quisition Fingerprint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . nonce Ġ= Ġnonce ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġemit All ( data . map Ġ{ Ġfulfill Re quisition Request Ġ{ Ġbody Chunk Ġ= Ġbody Chunk Ġ{ Ġthis . data Ġ= Ġit Ġ} Ġ} Ġ}) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠRe quisition . get Combined PublicKey ( curve Id : ĠInt ): ĠAny Sketch El G amal PublicKey Ġ{ ĊĠĠĠ Ġlogger . info (" Getting Ġcombined Ġpublic Ġkey ...") ĊĠĠĠ Ġval ĠlistOf Keys Ġ= Ġthis . du ch ies List . map Ġ{ Ġit . get El G amal Key () Ġ} ĊĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠ ĠCombine El G amal Public Keys Request . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . curve Id Ġ= Ġcurve Id . to Long () ĊĠĠĠĠĠĠĠĠĠ Ġit . addAll El G amal Keys ( listOf Keys ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġreturn ĠCombine El G amal Public Keys Response . parseFrom ( ĊĠĠĠĠĠĠĠ ĠSk etch Encrypt er Adapter . Combine El G amal Public Keys ( request . toByteArray ()) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. el G amal Keys ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġget Re quisition (): ĠRe quisition ? Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠ ĠList Re quis itions Request . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġed pData . name ĊĠĠĠĠĠĠĠĠĠ Ġfilter Builder . add States ( Re quisition . State . UN FUL FIL LED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġreturn Ġrequis itions Stub . list Re quis itions ( request ). requis itions List . first OrNull () ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ġ= ĠLogger . getLogger ( this :: class . java . name ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġload Library ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" sketch _ encrypt er _ adapter ", ĊĠĠĠĠĠĠĠ Ġdirectory Path Ġ= ĊĠĠĠĠĠĠĠĠĠ ĠPaths . get ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" any _ sketch _ java ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" src ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" main ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" wf an et ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" an ys k etch ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" crypto " ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠRe quisition . D uch y Entry . get El G amal Key (): ĠAny Sketch El G amal PublicKey Ġ{ ĊĠ Ġval Ġkey Ġ= ĠEl G amal PublicKey . parseFrom ( this . value . liquid Leg ions V 2 . el G amal PublicKey . data ) ĊĠ Ġreturn ĠAny Sketch El G amal PublicKey . newBuilder () ĊĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠ Ġit . generator Ġ= Ġkey . generator ĊĠĠĠĠĠ Ġit . element Ġ= Ġkey . element ĊĠĠĠ Ġ} ĊĠĠĠ Ġ. build () Ċ } Ċ Ċ private Ġfun ĠLi quid Leg ions Sketch Params . to Sketch Config (): ĠSk etch Config Ġ{ ĊĠ Ġreturn Ġsketch Config Ġ{ ĊĠĠĠ Ġindexes Ġ+= ĊĠĠĠĠĠ Ġindex Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Index " ĊĠĠĠĠĠĠĠ Ġdistribution Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġdistribution Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexponential Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexponential Distribution Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate Ġ= Ġdecay Rate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Values Ġ= ĠmaxSize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvalues Ġ+= ĊĠĠĠĠĠ Ġvalue Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Sampling Indicator " ĊĠĠĠĠĠĠĠ Ġag gregator Ġ= ĠSk etch Config . Value Spec . Aggregator . UNIQUE ĊĠĠĠĠĠĠĠ Ġdistribution Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġdistribution Ġ{ Ġuniform Ġ= Ġuniform Distribution Ġ{ Ġnum Values Ġ= Ġsampling Indicator Size Ġ} Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvalues Ġ+= ĊĠĠĠĠĠ Ġvalue Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Frequency " ĊĠĠĠĠĠĠĠ Ġag gregator Ġ= ĠSk etch Config . Value Spec . Aggregator . SUM ĊĠĠĠĠĠĠĠ Ġdistribution Ġ= Ġdistribution Ġ{ Ġoracle Ġ= Ġoracle Distribution Ġ{ Ġkey Ġ= Ġ" frequency " Ġ} Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ