<?php
$trackingSolutionConfigurations = array ( TRACKING_SERVICE_UNKNOWN
=> array ( 'name' => 'Unknown' ,
'active' => false ,
's2s' => false ,
) ,
'completionPhase' => array ( 's2s' => false ,
)
) ,
TRACKING_SERVICE_S2S
=> array ( 'name' => 'Server2Server' ,
'active' => true ,
'regex' => '/.*/' ,
'regexDynamicKey' => 'dynamicParameterSyntax' ,
's2s' => false ,
) ,
'completionPhase' => array ( 's2s' => true ,
)
) ,
TRACKING_SERVICE_SUPERSONIC_SDK
=> array ( 'name' => 'Supersonic Tracking SDK' ,
'active' => true ,
'notManaged' => true ,
's2s' => false ,
) ,
'completionPhase' => array ( 's2s' => false ,
)
) ,
TRACKING_SERVICE_PIXEL
=> array ( 'name' => 'Pixel Tracking' ,
'active' => false ,
's2s' => false ,
) ,
'completionPhase' => array ( 's2s' => false ,
)
) ,
TRACKING_SERVICE_AD_EVEN
=> array ( // Adjust 'name' => 'AdEven/adjust.io' ,
'active' => true ,
'regex' => '/^http[s]?:\/\/app\.adjust\.(io|com)\/.*$/' , // if you make changes in this regex, note that changes may be required in the sanitization of this url
's2s' => true ,
'params' => '&idfa={idfa}&gps_adid={aid}&s2s=1' ,
) ,
'completionPhase' => array ( 's2s' => true ,
)
) ,
TRACKING_SERVICE_AD_X
=> array ( 'name' => 'Ad-X' ,
'active' => true ,
'regex' => '/^http[s]?:\/\/ad-x\.co\.uk\/API\/click\/.*\/NET\/{DynamicParameter}___[0-9]*\/SupersonicAds\?.*$/' , //'/^http[s]?:\/\/ad-x\.co\.uk\/API\/click.*$/'
'regexDynamicKey' => 'id' ,
's2s' => true ,
'params' => '&redirect=off&ipaddress={ip}' ,
'deliveryToggle' => true , // temp configuration
) ,
'completionPhase' => array ( 's2s' => true ,
)
) ,
TRACKING_SERVICE_APPS_FLYER
=> array ( 'name' => 'AppsFlyer' ,
'active' => true ,
'regex' => '/^(?=.*\bclickid={DynamicParameter}(&|$))(?=.*\bpid=supersonicads_int(&|$))http[s]?:\/\/app\.appsflyer\.com\/[^?]+\?(?:[^&]+)(?:&[^&]+)*$/' ,
's2s' => true ,
'params' => '&redirect=false&idfa={idfa}&advertising_id={aid}&af_cost_model={CostModel}&af_cost_value={CostModelValue}&af_cost_currency=USD' ,
) ,
'completionPhase' => array ( 's2s' => true ,
'2ndCallbackParams' => array ( 'app_id' => '' , 'authentication' => '' ) , // Publisher perspective )
) ,
TRACKING_SERVICE_AP_SALAR
=> array ( 'name' => 'ApSalar' ,
'active' => false ,
'regex' => '/^http[s]?:\/\/ad\.apsalar\.com\/api\/v1\/.*$/' ,
's2s' => true ,
'params' => '&redirect=false' ,
'deliveryToggle' => true , // temp configuration
) ,
'completionPhase' => array ( 's2s' => true ,
)
) ,
TRACKING_SERVICE_BBB
=> array ( 'name' => 'BigBlueBubble' ,
'active' => false ,
'regex' => '/^http[s]?:\/\/ua\.bbbgame\.net\/api\/msm\/track\?event=click.*$/' ,
's2s' => true ,
'params' => '&redirect=0' ,
'deliveryToggle' => true , // temp configuration
) ,
'completionPhase' => array ( 's2s' => true ,
)
) ,
TRACKING_SERVICE_KOCHAVA
=> array ( 'name' => 'Kochava' ,
'active' => true ,
'regex' => '/^http[s]?:\/\/control\.kochava\.com\/[^?]+\?(([^&]+)&)*click_id={DynamicParameter}(&([^&]+))*$/' ,
's2s' => true ,
'params' => '&pbr=1&device_ua={ua}&ip_address={ip}' ,
'deliveryToggle' => true , // temp configuration
) ,
'completionPhase' => array ( 's2s' => true ,
)
) ,
TRACKING_SERVICE_TAP_STREAM
=> array ( 'name' => 'Tapstream' ,
'active' => false ,
'regex' => '/^http[s]?:\/\/(api\.)?taps\.io\/.*$/' ,
's2s' => true ,
'params' => '&__tsip={ip}&__tsredirect=0&__tshardware-android-advertising-id={aid}' ,
'deliveryToggle' => true , // temp configuration
) ,
'completionPhase' => array ( 's2s' => true ,
) ,
) ,
TRACKING_SERVICE_TENJIN
=> array ( 'name' => 'Tenjin' ,
'active' => true ,
'regex' => '/^https:\/\/track\.tenjin\.io.+click\/[^?]*\?(([^&]+)&)*((remote_click_id={DynamicParameter}&(([^&]+)&)*advertising_id={DeviceIds\[(IFA|AID)\]})|(advertising_id={DeviceIds\[(IFA|AID)\]}&(([^&]+)&)*remote_click_id={DynamicParameter}))/' ,
's2s' => false ,
) ,
'completionPhase' => array ( 's2s' => true ,
)
) ,
TRACKING_SERVICE_TUNE
=> array ( // Tune 'name' => 'Tune' ,
'active' => true ,
'regex' => '/^(?=.*\baction=click(&|$))(?=.*\bpublisher_id=[\d]+(&|$))(?=.*\bsite_id=[\d]+(&|$))(?=.*\bref_id={DynamicParameter}(&|$))http[s]?:\/\/(?:(?:[\d]+\.api-[\d]{2})|(?:hastrk[\d]+)|(?:[\d]+\.measurementapi))\.com\/serve\?(?:[^&]+)(?:&[^&]+)*$/' ,
'impressionPhase' => array ( 'params' => '&device_ip={ip}&response_format=json' ,
) ,
's2s' => true ,
'params' => '&google_aid={aid}&ios_ifa={ifa}&device_ip={ip}&response_format=json' ,
'useEncryption' => true , // Because encryption is on - no CostModel place holders
) ,
'completionPhase' => array ( 's2s' => true ,
) ,
) ,
) ;
$trackingServices = $trackingSolutionConfigurations ;
$inactiveTrackingServices = array ( ) ;
foreach ( $trackingServices as $serviceId => & $serviceData ) {
// Only when a tracking service is not managed by advertiser, the flag is being checked
$managedAdvertiserLogic = ! isset ( $serviceData [ 'notManaged' ] ) ?
true : ! true && $serviceData [ 'notManaged' ] ;
$isActiveTracking = $serviceData [ 'active' ] && $managedAdvertiserLogic ;
$serviceData [ 'id' ] = $serviceId ;
unset ( $serviceData [ 'active' ] ) ; unset ( $serviceData [ 'notManaged' ] ) ;
if ( ! $isActiveTracking ) {
unset ( $trackingServices [ $serviceId ] ) ; $inactiveTrackingServices [ $serviceId ] = $serviceData ;
}
}
if ( $onlyActive ) {
} else {
print_r ( array ( 'trackingServices' => $trackingServices , 'inactiveTrackingServices' => $inactiveTrackingServices ) ) ; }
PD9waHAKCiAgICAgICAgJHRyYWNraW5nU29sdXRpb25Db25maWd1cmF0aW9ucyA9IGFycmF5ICgKCQkJVFJBQ0tJTkdfU0VSVklDRV9VTktOT1dOID0+IGFycmF5ICgKCQkJCSduYW1lJyA9PiAnVW5rbm93bicsCgkJCQknYWN0aXZlJyA9PiBmYWxzZSwKICAgICAgICAgICAgICAgICdjbGlja1BoYXNlJyA9PiBhcnJheSAoCiAgICAgICAgICAgICAgICAgICAgJ3MycycgPT4gZmFsc2UsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ2NvbXBsZXRpb25QaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgKQoJCQkpLAoJCQlUUkFDS0lOR19TRVJWSUNFX1MyUyA9PiBhcnJheSAoCgkJCQknbmFtZScgPT4gJ1NlcnZlcjJTZXJ2ZXInLAoJCQkJJ2FjdGl2ZScgPT4gdHJ1ZSwKCQkJCSdyZWdleCcgPT4gJy8uKi8nLAoJCQkJJ3JlZ2V4RHluYW1pY0tleScgPT4gJ2R5bmFtaWNQYXJhbWV0ZXJTeW50YXgnLAogICAgICAgICAgICAgICAgJ2NsaWNrUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiBmYWxzZSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnY29tcGxldGlvblBoYXNlJyA9PiBhcnJheSAoCiAgICAgICAgICAgICAgICAgICAgJ3MycycgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICkKCQkJKSwKCQkJVFJBQ0tJTkdfU0VSVklDRV9TVVBFUlNPTklDX1NESyA9PiBhcnJheSAoCgkJCQknbmFtZScgPT4gJ1N1cGVyc29uaWMgVHJhY2tpbmcgU0RLJywKCQkJCSdhY3RpdmUnID0+IHRydWUsCgkJCQknbm90TWFuYWdlZCcgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICdjbGlja1BoYXNlJyA9PiBhcnJheSAoCiAgICAgICAgICAgICAgICAgICAgJ3MycycgPT4gZmFsc2UsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ2NvbXBsZXRpb25QaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApLAoJCQlUUkFDS0lOR19TRVJWSUNFX1BJWEVMID0+IGFycmF5ICgKCQkJCSduYW1lJyA9PiAnUGl4ZWwgVHJhY2tpbmcnLAoJCQkJJ2FjdGl2ZScgPT4gZmFsc2UsCiAgICAgICAgICAgICAgICAnY2xpY2tQaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdjb21wbGV0aW9uUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiBmYWxzZSwKICAgICAgICAgICAgICAgICkKCQkJKSwKICAgICAgICAgICAgVFJBQ0tJTkdfU0VSVklDRV9BRF9FVkVOID0+IGFycmF5KCAvLyBBZGp1c3QKICAgICAgICAgICAgICAgICduYW1lJyA9PiAnQWRFdmVuL2FkanVzdC5pbycsCgkJCQknYWN0aXZlJyA9PiB0cnVlLAoJCQkJJ3JlZ2V4JyA9PiAnL15odHRwW3NdPzpcL1wvYXBwXC5hZGp1c3RcLihpb3xjb20pXC8uKiQvJywgLy8gaWYgeW91IG1ha2UgY2hhbmdlcyBpbiB0aGlzIHJlZ2V4LCBub3RlIHRoYXQgY2hhbmdlcyBtYXkgYmUgcmVxdWlyZWQgaW4gdGhlIHNhbml0aXphdGlvbiBvZiB0aGlzIHVybAogICAgICAgICAgICAgICAgJ2NsaWNrUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgICAgICdwYXJhbXMnID0+ICcmaWRmYT17aWRmYX0mZ3BzX2FkaWQ9e2FpZH0mczJzPTEnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdjb21wbGV0aW9uUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApLAoJCQlUUkFDS0lOR19TRVJWSUNFX0FEX1ggPT4gYXJyYXkoCgkJCQknbmFtZScgPT4gJ0FkLVgnLAoJCQkJJ2FjdGl2ZScgPT4gdHJ1ZSwKCQkJCSdyZWdleCcgPT4gJy9eaHR0cFtzXT86XC9cL2FkLXhcLmNvXC51a1wvQVBJXC9jbGlja1wvLipcL05FVFwve0R5bmFtaWNQYXJhbWV0ZXJ9X19fWzAtOV0qXC9TdXBlcnNvbmljQWRzXD8uKiQvJywgLy8nL15odHRwW3NdPzpcL1wvYWQteFwuY29cLnVrXC9BUElcL2NsaWNrLiokLycKCQkJCSdyZWdleER5bmFtaWNLZXknID0+ICdpZCcsCiAgICAgICAgICAgICAgICAnY2xpY2tQaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IHRydWUsCiAgICAgICAgICAgICAgICAgICAgJ3BhcmFtcycgPT4gJyZyZWRpcmVjdD1vZmYmaXBhZGRyZXNzPXtpcH0nLAogICAgICAgICAgICAgICAgICAgICdkZWxpdmVyeVRvZ2dsZScgPT4gdHJ1ZSwgLy8gdGVtcCBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ2NvbXBsZXRpb25QaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IHRydWUsCiAgICAgICAgICAgICAgICApCgkJCSksCiAgICAgICAgICAgIFRSQUNLSU5HX1NFUlZJQ0VfQVBQU19GTFlFUiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICduYW1lJyA9PiAnQXBwc0ZseWVyJywKCQkJCSdhY3RpdmUnID0+IHRydWUsCiAgICAgICAgICAgICAgICAncmVnZXgnID0+ICcvXig/PS4qXGJjbGlja2lkPXtEeW5hbWljUGFyYW1ldGVyfSgmfCQpKSg/PS4qXGJwaWQ9c3VwZXJzb25pY2Fkc19pbnQoJnwkKSlodHRwW3NdPzpcL1wvYXBwXC5hcHBzZmx5ZXJcLmNvbVwvW14/XStcPyg/OlteJl0rKSg/OiZbXiZdKykqJC8nLAogICAgICAgICAgICAgICAgJ2NsaWNrUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgICAgICdwYXJhbXMnID0+ICcmcmVkaXJlY3Q9ZmFsc2UmaWRmYT17aWRmYX0mYWR2ZXJ0aXNpbmdfaWQ9e2FpZH0mYWZfY29zdF9tb2RlbD17Q29zdE1vZGVsfSZhZl9jb3N0X3ZhbHVlPXtDb3N0TW9kZWxWYWx1ZX0mYWZfY29zdF9jdXJyZW5jeT1VU0QnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdjb21wbGV0aW9uUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgICAgICcybmRDYWxsYmFja1BhcmFtcycgPT4gYXJyYXkoJ2FwcF9pZCcgPT4gJycsJ2F1dGhlbnRpY2F0aW9uJyA9PiAnJyksIC8vIFB1Ymxpc2hlciBwZXJzcGVjdGl2ZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApLAoJCQlUUkFDS0lOR19TRVJWSUNFX0FQX1NBTEFSID0+IGFycmF5KAoJCQkJJ25hbWUnID0+ICdBcFNhbGFyJywKCQkJCSdhY3RpdmUnID0+IGZhbHNlLAoJCQkJJ3JlZ2V4JyA9PiAnL15odHRwW3NdPzpcL1wvYWRcLmFwc2FsYXJcLmNvbVwvYXBpXC92MVwvLiokLycsCiAgICAgICAgICAgICAgICAnY2xpY2tQaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IHRydWUsCiAgICAgICAgICAgICAgICAgICAgJ3BhcmFtcycgPT4gJyZyZWRpcmVjdD1mYWxzZScsCiAgICAgICAgICAgICAgICAgICAgJ2RlbGl2ZXJ5VG9nZ2xlJyA9PiB0cnVlLCAvLyB0ZW1wIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnY29tcGxldGlvblBoYXNlJyA9PiBhcnJheSAoCiAgICAgICAgICAgICAgICAgICAgJ3MycycgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICkKCQkJKSwKCQkJVFJBQ0tJTkdfU0VSVklDRV9CQkIgPT4gYXJyYXkoCgkJCQknbmFtZScgPT4gJ0JpZ0JsdWVCdWJibGUnLAoJCQkJJ2FjdGl2ZScgPT4gZmFsc2UsCgkJCQkncmVnZXgnID0+ICcvXmh0dHBbc10/OlwvXC91YVwuYmJiZ2FtZVwubmV0XC9hcGlcL21zbVwvdHJhY2tcP2V2ZW50PWNsaWNrLiokLycsCgkJCQknY2xpY2tQaGFzZScgPT4gYXJyYXkgKAoJCQkJCSdzMnMnID0+IHRydWUsCgkJCQkJJ3BhcmFtcycgPT4gJyZyZWRpcmVjdD0wJywKCQkJCQknZGVsaXZlcnlUb2dnbGUnID0+IHRydWUsIC8vIHRlbXAgY29uZmlndXJhdGlvbgoJCQkJKSwKCQkJCSdjb21wbGV0aW9uUGhhc2UnID0+IGFycmF5ICgKCQkJCQknczJzJyA9PiB0cnVlLAoJCQkJKQoJCQkpLAogICAgICAgICAgICBUUkFDS0lOR19TRVJWSUNFX0tPQ0hBVkEgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ0tvY2hhdmEnLAoJCQkJJ2FjdGl2ZScgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICdyZWdleCcgPT4gJy9eaHR0cFtzXT86XC9cL2NvbnRyb2xcLmtvY2hhdmFcLmNvbVwvW14/XStcPygoW14mXSspJikqY2xpY2tfaWQ9e0R5bmFtaWNQYXJhbWV0ZXJ9KCYoW14mXSspKSokLycsCiAgICAgICAgICAgICAgICAnY2xpY2tQaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IHRydWUsCiAgICAgICAgICAgICAgICAgICAgJ3BhcmFtcycgPT4gJyZwYnI9MSZkZXZpY2VfdWE9e3VhfSZpcF9hZGRyZXNzPXtpcH0nLAogICAgICAgICAgICAgICAgICAgICdkZWxpdmVyeVRvZ2dsZScgPT4gdHJ1ZSwgLy8gdGVtcCBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ2NvbXBsZXRpb25QaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IHRydWUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCgkJCVRSQUNLSU5HX1NFUlZJQ0VfVEFQX1NUUkVBTSA9PiBhcnJheSgKICAgICAgICAgICAgICAgICduYW1lJyA9PiAnVGFwc3RyZWFtJywKCQkJCSdhY3RpdmUnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgJ3JlZ2V4JyA9PiAnL15odHRwW3NdPzpcL1wvKGFwaVwuKT90YXBzXC5pb1wvLiokLycsCgkJCQknY2xpY2tQaGFzZScgPT4gYXJyYXkgKAoJCQkJCSdzMnMnID0+IHRydWUsCgkJCQkJJ3BhcmFtcycgPT4gJyZfX3RzaXA9e2lwfSZfX3RzcmVkaXJlY3Q9MCZfX3RzaGFyZHdhcmUtYW5kcm9pZC1hZHZlcnRpc2luZy1pZD17YWlkfScsCgkJCQkJJ2RlbGl2ZXJ5VG9nZ2xlJyA9PiB0cnVlLCAvLyB0ZW1wIGNvbmZpZ3VyYXRpb24KCQkJCSksCgkJCQknY29tcGxldGlvblBoYXNlJyA9PiBhcnJheSAoCgkJCQkJJ3MycycgPT4gdHJ1ZSwKCQkJCSksCiAgICAgICAgICAgICksCgkJCVRSQUNLSU5HX1NFUlZJQ0VfVEVOSklOICA9PiBhcnJheSgKCQkJCSduYW1lJyA9PiAnVGVuamluJywKCQkJCSdhY3RpdmUnID0+IHRydWUsCgkJCQkncmVnZXgnID0+ICcvXmh0dHBzOlwvXC90cmFja1wudGVuamluXC5pby4rY2xpY2tcL1teP10qXD8oKFteJl0rKSYpKigocmVtb3RlX2NsaWNrX2lkPXtEeW5hbWljUGFyYW1ldGVyfSYoKFteJl0rKSYpKmFkdmVydGlzaW5nX2lkPXtEZXZpY2VJZHNcWyhJRkF8QUlEKVxdfSl8KGFkdmVydGlzaW5nX2lkPXtEZXZpY2VJZHNcWyhJRkF8QUlEKVxdfSYoKFteJl0rKSYpKnJlbW90ZV9jbGlja19pZD17RHluYW1pY1BhcmFtZXRlcn0pKS8nLAogICAgICAgICAgICAgICAgJ2NsaWNrUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiBmYWxzZSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnY29tcGxldGlvblBoYXNlJyA9PiBhcnJheSAoCiAgICAgICAgICAgICAgICAgICAgJ3MycycgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICkKCQkJKSwKCQkJVFJBQ0tJTkdfU0VSVklDRV9UVU5FID0+IGFycmF5KCAvLyBUdW5lCgkJCQknbmFtZScgPT4gJ1R1bmUnLAoJCQkJJ2FjdGl2ZScgPT4gdHJ1ZSwKCQkJCSdyZWdleCcgPT4gJy9eKD89LipcYmFjdGlvbj1jbGljaygmfCQpKSg/PS4qXGJwdWJsaXNoZXJfaWQ9W1xkXSsoJnwkKSkoPz0uKlxic2l0ZV9pZD1bXGRdKygmfCQpKSg/PS4qXGJyZWZfaWQ9e0R5bmFtaWNQYXJhbWV0ZXJ9KCZ8JCkpaHR0cFtzXT86XC9cLyg/Oig/OltcZF0rXC5hcGktW1xkXXsyfSl8KD86aGFzdHJrW1xkXSspfCg/OltcZF0rXC5tZWFzdXJlbWVudGFwaSkpXC5jb21cL3NlcnZlXD8oPzpbXiZdKykoPzomW14mXSspKiQvJywKICAgICAgICAgICAgICAgICdpbXByZXNzaW9uUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAncGFyYW1zJyA9PiAnJmRldmljZV9pcD17aXB9JnJlc3BvbnNlX2Zvcm1hdD1qc29uJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnY2xpY2tQaGFzZScgPT4gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzMnMnID0+IHRydWUsCiAgICAgICAgICAgICAgICAgICAgJ3BhcmFtcycgPT4gJyZnb29nbGVfYWlkPXthaWR9Jmlvc19pZmE9e2lmYX0mZGV2aWNlX2lwPXtpcH0mcmVzcG9uc2VfZm9ybWF0PWpzb24nLAogICAgICAgICAgICAgICAgICAgICd1c2VFbmNyeXB0aW9uJyA9PiB0cnVlLCAvLyBCZWNhdXNlIGVuY3J5cHRpb24gaXMgb24gLSBubyBDb3N0TW9kZWwgcGxhY2UgaG9sZGVycwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdjb21wbGV0aW9uUGhhc2UnID0+IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAnczJzJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgKSwKCQkJKSwKICAgICAgICApOwoKCgkJJHRyYWNraW5nU2VydmljZXMgPSAkdHJhY2tpbmdTb2x1dGlvbkNvbmZpZ3VyYXRpb25zOwoJCSRpbmFjdGl2ZVRyYWNraW5nU2VydmljZXMgPSBhcnJheSgpOwoKCQlmb3JlYWNoICgkdHJhY2tpbmdTZXJ2aWNlcyBhcyAkc2VydmljZUlkID0+ICYkc2VydmljZURhdGEpIHsKICAgICAgICAgICAgLy8gT25seSB3aGVuIGEgdHJhY2tpbmcgc2VydmljZSBpcyBub3QgbWFuYWdlZCBieSBhZHZlcnRpc2VyLCB0aGUgZmxhZyBpcyBiZWluZyBjaGVja2VkCgkJCSRtYW5hZ2VkQWR2ZXJ0aXNlckxvZ2ljID0gIWlzc2V0KCRzZXJ2aWNlRGF0YVsnbm90TWFuYWdlZCddKSA/IHRydWUgOgoJCQkJIXRydWUgJiYgJHNlcnZpY2VEYXRhWydub3RNYW5hZ2VkJ107CgoJCQkkaXNBY3RpdmVUcmFja2luZyA9ICRzZXJ2aWNlRGF0YVsnYWN0aXZlJ10gJiYgJG1hbmFnZWRBZHZlcnRpc2VyTG9naWM7CgkJCSRzZXJ2aWNlRGF0YVsnaWQnXSA9ICRzZXJ2aWNlSWQ7CgkJCXVuc2V0KCRzZXJ2aWNlRGF0YVsnYWN0aXZlJ10pOwoJCQl1bnNldCgkc2VydmljZURhdGFbJ25vdE1hbmFnZWQnXSk7CgoJCQlpZiAoISRpc0FjdGl2ZVRyYWNraW5nKXsKCQkJCXVuc2V0KCR0cmFja2luZ1NlcnZpY2VzWyRzZXJ2aWNlSWRdKTsKCQkJCSRpbmFjdGl2ZVRyYWNraW5nU2VydmljZXNbJHNlcnZpY2VJZF0gPSAkc2VydmljZURhdGE7CgkJCX0KCQl9CgoJCWlmICgkb25seUFjdGl2ZSkgewoJCQlwcmludF9yKCR0cmFja2luZ1NlcnZpY2VzKTsKCQl9IGVsc2V7CgkJCXByaW50X3IoYXJyYXkoJ3RyYWNraW5nU2VydmljZXMnID0+ICR0cmFja2luZ1NlcnZpY2VzLCAnaW5hY3RpdmVUcmFja2luZ1NlcnZpY2VzJyA9PiAkaW5hY3RpdmVUcmFja2luZ1NlcnZpY2VzKSk7CgkJfQoKCg==