Preparation work:

1.Download the file and save in laptop,then upload the data

sub<- readRDS(file.choose())
View(sub)

2.Translate the column names from Polish to English and open all tables

Ag<-sub$Aging#abstract the table of Aging
View(Ag)
colnames(Ag)<-c("LP","Nr","Account Name","Typ","Wn_Dr","Ma_Cr","Turnover Dr","Turnover Cr","Saldo_Balance","Current","<30","31_60","61_90","90_180","180_360",">1Y","PD","LGD","EAD")
BA<-sub$BankAcc
View(BA)
colnames(BA)<-c("Date","Konto_DR.1.35700.","Konto_CR.1.35700.","Wartosc.1.35700.","Opis.1.35700.")
CA<-sub$ChOA
View(CA)
colnames(CA)<-c("Section","Number","Account name","Class","Typ")
Jo<-sub$Journal
View(Jo)
colnames(Jo)<-c("Date","Konto_DR.1.35700.","Konto_CR.1.35700.","Wartosc.1.35700.","Opis.1.35700.")
Co<-sub$Kontr
View(Co)
colnames(Co)<-c("LP","Nr","Name","Typ","Wn_Dr","Ma_Cr","OB._WN_DR","OB._MA_CR","Saldo_Balance")
TB<-sub$TB
View(TB)
colnames(TB)<-c("Nr","Class","NR.1","Account name","Class","Subclass","Opening Balance","Debit turnover","Credit turnover","Closing balance")
ZPK<-sub$ZPK
View(ZPK)
colnames(ZPK)<-c("Section","Number","Nazwa konta","Account name","Account type")
FAR<-sub$FAR_RST_Final
View(FAR)
colnames(FAR)<-c("LP","Date","Name","City","Depreciation rate","Gross value","Acc.depreciation","Depreciation","Sold","Type","NAME")
PL<-sub$CC_PL
View(PL)
BS<-sub$CC_BS
View(BS)

Question 1: Reconcile the turnover to the T&E

Bil<-BS [c(1,3),]#Abstract total assets and intangible assets from BS
Bil
TBScb<-Bil[2,2]/Bil[1,2]#Calculate the turnover to intangible assets from BS
TBScb
TBSob<-Bil[2,3]/Bil[1,3]
TBSob
Tbs<-c(TBScb,TBSob)#Sort the data
Tbs
Inta<-TB[c(2,6),c(4,7,10)]#Abstract intangible assets and its amortization from TB
Inta
NetintaOB<-Inta[1,2]-Inta[2,2]#Calculate the net intangible assets at the end of previous financial year from TB
NetintaOB
NetintaCB<-Inta[1,3]-Inta[2,3]#Calculate the net intangible assets at the end of current financial year from TB
NetintaCB
Ttbob<-NetintaOB/Bil[1,3]#Calculate the turnover to intangible assets from TB
Ttbob
Ttbcb<-NetintaCB/Bil[1,2]
Ttbcb
Ttb<-c(Ttbcb,Ttbob)#Sort the data
Ttb
IntanDiff<- Ttb-Tbs#Calculate the difference of turnover to intangible assets from TB and BS
IntanDiff

The results of turnover to intangible assets from TB and BS at the end of current financial and at the end of previous financial year can be seen as follows:

#[1] -0.04354692 -0.02782982

Question 2: Make an analytical review of fixed assets B/O + Increases - Decreases Reclassification BZ for gross and net worth. Analytically check the accrual for the reasonableness of the depreciation charge.

FixBs<-BS[7,]#Abstract fixed assets from BS
View(FixBs)
FixTb<-TB[c(1,5),c(4,7,8,9,10)]#Abstract fixed assets and accumulated depreciation from TB
View(FixTb)
FixTbOB<-FixTb[1,2]-FixTb[2,2]#Calculate the net value of fixed assets at previous financial year
FixTbOB
FixTbCB<-FixTb[1,5]-FixTb[2,5]#Calculate the net value of fixed assets at current financial year
FixTbCB
FixDiff<-c(FixTbOB-FixBs[1,3],FixTbCB-FixBs[1,2])#Compare the results from TB and BS
FixDiff

The value of fixed assets from TB and BS at the end of previous financial and at the end of current financial year can be seen as follows:

#[1] -640895.4 -673582.5

It is clear from the TB that the Gross Value of fixed assets has increased(15930.52->22894.136) during the year and it is reasonable to assume that accumulated depreciation should also increase, but the year-end amount of accumulated depreciation(7943.673) in the TB is lower than the beginning of the year(12100.92).Therefore the current year depreciation charge is not reasonable

Question 3:Check the fixed assets register for arithmetic accuracy.

Fix03<-FAR[,c(11,2,5,6,7,8)]#Extract "NAME""Date""Depreciation rate""Gross value""Acc.Deprecition"and "Depreciation" from FAR
View(Fix03)
Fix03$Dep<-Fix03$`Depreciation rate`*Fix03$`Gross value`#Recalculate the depreciation of the fixed assets
Fix03$DepDiff<-Fix03$Dep-Fix03$Depreciation#Compare the depreciation after recalculating with the original depreciation in the table
sum_depDiff<-sum(Fix03$DepDiff)
sum_depDiff
Fix03$ClosingDate<-as.Date("2023-04-30")#Create a new column and insert the current time from Jouranl
Fix03$Date<-as.Date(Fix03$Date)#Change the format of the date
library(lubridate)
Fix03$MonthDiff<-interval(Fix03$Date,Fix03$ClosingDate)%/% months(1)#Calculate the number of month between purchase time and current time
Fix03$Acc.dep<-(Fix03$Dep/12)*Fix03$MonthDiff#Recalculate the accumulated dep.
Fix03$Acc.dep<-ifelse(Fix03$Acc.dep>Fix03$`Gross value`,Fix03$`Gross value`,Fix03$Acc.dep)#If the result is higher than gross value,then the true answer is gross value,otherwise Acc.dep
Fix03$Acc.depDiff<-(Fix03$Acc.dep-Fix03$Acc.depreciation)#Calculate the difference between original Acc.dep. and recalculated Acc.dep
sum_Acc.depDiff<-sum(Fix03$Acc.depDiff)
sum_Acc.depDiff

The difference is:

#[1] -1309377

Question 4: lnvalidate the provision for receivables. Prospective and retrospective.

Ag_subset<-Ag[Ag$Typ=="Odbiorca",]#Make an extraction based on the keyword “Odbiorca”of Typ column in Ag
View(Ag_subset)
Ag_subset$Provision<-rowSums(Ag_subset[,11:16])#calculate the sum of bad debt for each customer in the whole payment period
sumPro<-sum(Ag_subset$Provision)#calculate the sum of bad debts
sumPro
Ag_subset$EL<-Ag_subset$PD*Ag_subset$LGD*Ag_subset$EAD#calculate EL for each customer 
sumEL<-sum(Ag_subset$EL)
sumEL
ProTB<-TB[36,]#Extract provision of bad debts for trade receivable
View(ProTB)
Diff_1<-sumPro-ProTB[1,10]#Compare the provision from TB with the sum of bad debt based on aging analysis
Diff_1
Diff_2<-sumEL-ProTB[1,10]#Compare the provision from TB with the sum of bad debt based on prospective approach
Diff_2

The differences based on aging analysis and prospective approach are:

#[1] 12439568

#[1] 153575.9

The provision which stated in TB can not cover the bad debt based on aging analysis and prospective approach,so that there is a need for adjustment

Question 5:For items above the PM, make a search for unaccounted liabilities.

Question 6:Reconcile the equity position to the KRS extract.

EquTB<-TB[c(99,100,101,102,109,110,111),c(4,7,10)]#Extract rows that related to equity from TB
View(EquTB)
EquTBOB<-EquTB[1,2]+EquTB[2,2]+EquTB[3,2]+EquTB[4,2]+EquTB[5,2]-EquTB[6,2]-EquTB[7,2]#Calculated the equity ant the end of previous financial year
EquTBOB
EquTBCB<-EquTB[1,3]+EquTB[2,3]+EquTB[3,3]+EquTB[4,3]+EquTB[5,3]-EquTB[6,3]-EquTB[7,3]#Calculated the equity ant the end of current financial year
EquTBCB
Equ_01<-c(EquTBOB,EquTBCB)
View(Equ_01)
EquBS<-BS[50,]#Extract equity from BS
View(EquBS)
EquDiff<-c(EquTBOB-EquBS[1,3],EquTBCB-EquBS[1,2])#Compare the results from TB with the data in BS
EquDiff

The differences at the end of previous financial year and at the end of current financial year are:

[1] -538014.9 -553514.9

Question 7: Take a sample of fixed assets and check the calculation of depreciation.

sample(c(1:113),10,replace = FALSE)#Pick 10 number from 1 to 113 at random
Fix07<-FAR[c(77,109,111,80,99,49,75,42,89,59),c(11,2,5,6,7,8,9)]#Extract corresponding rows according to the number
View(Fix07)
Fix07$Closingdate<-as.Date("2023-04-30")#Create a new column and insert the current time from Jouranl
Fix07$Date<-as.Date(Fix07$Date)#Change the format of the date
library(lubridate)
Fix07$MonthDiff <- interval( Fix07$Date,Fix07$Closingdate)%/% months(1)#Calculate the number of month between purchase time and current time
print(Fix07)
Fix07$Dep<-Fix07$`Depreciation rate`*Fix07$`Gross value`#Recalculate the dep.
Fix07$DepDiff<-Fix07$Dep-Fix07$Depreciation#Calculate the difference between recalcuted dep. and original data
sum_DepDiff<-sum(Fix07$DepDiff)
sum_DepDiff

The difference of the the sum of dep. is 0:

[1] 0

Check the calculation of accumulated dep.

Fix07$Acc.dep<-(Fix07$Dep/12)*Fix07$MonthDiff
Fix07$Acc.dep<-ifelse(Fix07$Acc.dep>Fix07$`Gross value`,Fix07$`Gross value`,Fix07$Acc.dep)
Fix07$Acc.depDiff<-(Fix07$Acc.dep-Fix07$Acc.depreciation)
sum_Acc.depDiff<-sum(Fix07$Acc.depDiff)
sum_Acc.depDiff

The difference is:

[1] 42057.35

Question 8: Calculate the correctness of the calculation of interest on liabilities. Assume a rate of 8% pa.

Extract short-term loan and long-term loan from Jo and BA respectively

Jo_subset<-Jo[Jo$Opis.1.35700.=="Kredyty bankowe d??ugoterminowe",]
View(Jo_subset)
Jo_subset_2<-Jo[Jo$Opis.1.35700.=="Kredyty bankowe kr??tkoterminowe",]
View(Jo_subset_2)
Jo_subset<-Jo_subset[c(1:239),]
View(Jo_subset)
BA_subset<-BA[BA$Opis.1.35700.=="Kredyty bankowe d??ugoterminowe",]
View(BA_subset)
BA_subset_2<-BA[BA$Opis.1.35700.=="Kredyty bankowe kr??tkoterminowe",]
View(BA_subset_2)

Question9: Write the audit program for provisions.

Test on provisions
A provision is a liability of uncertain timing or amount that should only be recognized:
(1).An entity has a present obligation (legal or constructive) as a result of past event;
(2).It is probable(50%) that an outflow of economic resources will be required to settle the obligation;
(3).A reliable estimate can be made of the amount of the obligation
Therefore the test on provisions could based on its definition
Substantive  process
(1)Present obligation
==>Constructive obligation
a: Have they crested a valid expectation in other parties that they will discharge the obligation?
b: Discuss with the directors as to whether they have formally announced their intention,to confirm that a present obligation exists at the year end. If announced before the year end, review supporting documentation to verify that the decision has been formally announced.
c: Review evidence of the past practices, published policies and statements made
==>Legal obligation
a: Discuss with the management the nature of the issue, to ensure that a full understanding of the issue it is obtained and to  assess  whether the obligation exists.
b: Review of correspondence and other documentation to assess whether the company has a present obligation as a result of past event
(2)Probable outflow
a: Review the post year-end period to identity whether any payments have been made
b: Discuss the position with similar past provisions with the directors. Were these provisions eventually settled?
c: Review the board minutes and any company correspondence to assertion whether it is probable  the that payments will be paid by reviewing the supporting evidence
d:Write and send and enquiry letter to the company’s lawyers to obtain their views as to the probability of the claim being successful
e: Obtain a written representation from the directors to confirm the completeness of the of the provision,by confirming their view that the chances of a successful claim are remote and no provision or contingent liability is required.
(3)Reliable estimate
a: Obtain a breakdown of the calculation and cast it to ensure completeness, agree components of the calculation to supporting documentation.
b: Review any correspondence to assess whether the company has s reliable estimate of any potential payments can be made.

Question10: Write a general audit program

A general audit program mainly includes two parts:
1.Overall audit strategy: It is used to determine the scope of the audit; reporting objectives, timing; audit direction and audit resources. At this stage it is necessary to confirm, for example: 
(1) The appropriateness of the audit scope; 
(2) The reasonableness of the time budget; 
(3) The appropriateness of the selection and  
(4) The determination of the appropriate level of materiality
2.Specific audit plan: This phase consists of three main steps: risk assessment, further audit procedures and other audit procedures
(1)Risk assessment (IR): Understanding the entity and its environment. Assess the risk of material misstatement at the financial statement and assertion level
(2)Further audit procedures:=>There are two types of procedures:
a: Tests of control (CR): To test the effectiveness of the entity’s internal controls in preventing or detecting material misstatements
b: Substantive procedures (DR): To detect material misstatements. This can be done in two ways: First of all,tests of detail.For example, vouching amounts back to invoices, physical inspection of assets; Moreover, we can use analytical procedures, for example variance analysis, ratio analysis & proof in total.
(3)However, we also need to judging the needs for the test of fraud, going concern and relative-party transaction etc. by our professional.
LS0tDQp0aXRsZTogIkF1ZGl0IGxhYiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClByZXBhcmF0aW9uIHdvcms6DQoNCjEuRG93bmxvYWQgdGhlIGZpbGUgYW5kIHNhdmUgaW4gbGFwdG9wLHRoZW4gdXBsb2FkIHRoZSBkYXRhDQpgYGB7cn0NCnN1YjwtIHJlYWRSRFMoZmlsZS5jaG9vc2UoKSkNClZpZXcoc3ViKQ0KYGBgDQoyLlRyYW5zbGF0ZSB0aGUgY29sdW1uIG5hbWVzIGZyb20gUG9saXNoIHRvIEVuZ2xpc2ggYW5kIG9wZW4gYWxsIHRhYmxlcw0KYGBge3J9DQpBZzwtc3ViJEFnaW5nI2Fic3RyYWN0IHRoZSB0YWJsZSBvZiBBZ2luZw0KVmlldyhBZykNCmNvbG5hbWVzKEFnKTwtYygiTFAiLCJOciIsIkFjY291bnQgTmFtZSIsIlR5cCIsIlduX0RyIiwiTWFfQ3IiLCJUdXJub3ZlciBEciIsIlR1cm5vdmVyIENyIiwiU2FsZG9fQmFsYW5jZSIsIkN1cnJlbnQiLCI8MzAiLCIzMV82MCIsIjYxXzkwIiwiOTBfMTgwIiwiMTgwXzM2MCIsIj4xWSIsIlBEIiwiTEdEIiwiRUFEIikNCkJBPC1zdWIkQmFua0FjYw0KVmlldyhCQSkNCmNvbG5hbWVzKEJBKTwtYygiRGF0ZSIsIktvbnRvX0RSLjEuMzU3MDAuIiwiS29udG9fQ1IuMS4zNTcwMC4iLCJXYXJ0b3NjLjEuMzU3MDAuIiwiT3Bpcy4xLjM1NzAwLiIpDQpDQTwtc3ViJENoT0ENClZpZXcoQ0EpDQpjb2xuYW1lcyhDQSk8LWMoIlNlY3Rpb24iLCJOdW1iZXIiLCJBY2NvdW50IG5hbWUiLCJDbGFzcyIsIlR5cCIpDQpKbzwtc3ViJEpvdXJuYWwNClZpZXcoSm8pDQpjb2xuYW1lcyhKbyk8LWMoIkRhdGUiLCJLb250b19EUi4xLjM1NzAwLiIsIktvbnRvX0NSLjEuMzU3MDAuIiwiV2FydG9zYy4xLjM1NzAwLiIsIk9waXMuMS4zNTcwMC4iKQ0KQ288LXN1YiRLb250cg0KVmlldyhDbykNCmNvbG5hbWVzKENvKTwtYygiTFAiLCJOciIsIk5hbWUiLCJUeXAiLCJXbl9EciIsIk1hX0NyIiwiT0IuX1dOX0RSIiwiT0IuX01BX0NSIiwiU2FsZG9fQmFsYW5jZSIpDQpUQjwtc3ViJFRCDQpWaWV3KFRCKQ0KY29sbmFtZXMoVEIpPC1jKCJOciIsIkNsYXNzIiwiTlIuMSIsIkFjY291bnQgbmFtZSIsIkNsYXNzIiwiU3ViY2xhc3MiLCJPcGVuaW5nIEJhbGFuY2UiLCJEZWJpdCB0dXJub3ZlciIsIkNyZWRpdCB0dXJub3ZlciIsIkNsb3NpbmcgYmFsYW5jZSIpDQpaUEs8LXN1YiRaUEsNClZpZXcoWlBLKQ0KY29sbmFtZXMoWlBLKTwtYygiU2VjdGlvbiIsIk51bWJlciIsIk5hendhIGtvbnRhIiwiQWNjb3VudCBuYW1lIiwiQWNjb3VudCB0eXBlIikNCkZBUjwtc3ViJEZBUl9SU1RfRmluYWwNClZpZXcoRkFSKQ0KY29sbmFtZXMoRkFSKTwtYygiTFAiLCJEYXRlIiwiTmFtZSIsIkNpdHkiLCJEZXByZWNpYXRpb24gcmF0ZSIsIkdyb3NzIHZhbHVlIiwiQWNjLmRlcHJlY2lhdGlvbiIsIkRlcHJlY2lhdGlvbiIsIlNvbGQiLCJUeXBlIiwiTkFNRSIpDQpQTDwtc3ViJENDX1BMDQpWaWV3KFBMKQ0KQlM8LXN1YiRDQ19CUw0KVmlldyhCUykNCmBgYA0KDQoNClF1ZXN0aW9uIDE6IFJlY29uY2lsZSB0aGUgdHVybm92ZXIgdG8gdGhlIFQmRQ0KDQoNCmBgYHtyfQ0KQmlsPC1CUyBbYygxLDMpLF0jQWJzdHJhY3QgdG90YWwgYXNzZXRzIGFuZCBpbnRhbmdpYmxlIGFzc2V0cyBmcm9tIEJTDQpCaWwNClRCU2NiPC1CaWxbMiwyXS9CaWxbMSwyXSNDYWxjdWxhdGUgdGhlIHR1cm5vdmVyIHRvIGludGFuZ2libGUgYXNzZXRzIGZyb20gQlMNClRCU2NiDQpUQlNvYjwtQmlsWzIsM10vQmlsWzEsM10NClRCU29iDQpUYnM8LWMoVEJTY2IsVEJTb2IpI1NvcnQgdGhlIGRhdGENClRicw0KSW50YTwtVEJbYygyLDYpLGMoNCw3LDEwKV0jQWJzdHJhY3QgaW50YW5naWJsZSBhc3NldHMgYW5kIGl0cyBhbW9ydGl6YXRpb24gZnJvbSBUQg0KSW50YQ0KTmV0aW50YU9CPC1JbnRhWzEsMl0tSW50YVsyLDJdI0NhbGN1bGF0ZSB0aGUgbmV0IGludGFuZ2libGUgYXNzZXRzIGF0IHRoZSBlbmQgb2YgcHJldmlvdXMgZmluYW5jaWFsIHllYXIgZnJvbSBUQg0KTmV0aW50YU9CDQpOZXRpbnRhQ0I8LUludGFbMSwzXS1JbnRhWzIsM10jQ2FsY3VsYXRlIHRoZSBuZXQgaW50YW5naWJsZSBhc3NldHMgYXQgdGhlIGVuZCBvZiBjdXJyZW50IGZpbmFuY2lhbCB5ZWFyIGZyb20gVEINCk5ldGludGFDQg0KVHRib2I8LU5ldGludGFPQi9CaWxbMSwzXSNDYWxjdWxhdGUgdGhlIHR1cm5vdmVyIHRvIGludGFuZ2libGUgYXNzZXRzIGZyb20gVEINClR0Ym9iDQpUdGJjYjwtTmV0aW50YUNCL0JpbFsxLDJdDQpUdGJjYg0KVHRiPC1jKFR0YmNiLFR0Ym9iKSNTb3J0IHRoZSBkYXRhDQpUdGINCkludGFuRGlmZjwtIFR0Yi1UYnMjQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIG9mIHR1cm5vdmVyIHRvIGludGFuZ2libGUgYXNzZXRzIGZyb20gVEIgYW5kIEJTDQpJbnRhbkRpZmYNCmBgYA0KVGhlIHJlc3VsdHMgb2YgdHVybm92ZXIgdG8gaW50YW5naWJsZSBhc3NldHMgZnJvbSBUQiBhbmQgQlMgYXQgdGhlIGVuZCBvZiBjdXJyZW50IGZpbmFuY2lhbCBhbmQgYXQgdGhlIGVuZCBvZiBwcmV2aW91cyBmaW5hbmNpYWwgeWVhciBjYW4gYmUgc2VlbiBhcyBmb2xsb3dzOiAgDQoNCg0KICAgICNbMV0gLTAuMDQzNTQ2OTIgLTAuMDI3ODI5ODINClF1ZXN0aW9uIDI6IE1ha2UgYW4gYW5hbHl0aWNhbCByZXZpZXcgb2YgZml4ZWQgYXNzZXRzIEIvTyArIEluY3JlYXNlcyAtIERlY3JlYXNlcyBSZWNsYXNzaWZpY2F0aW9uIEJaIGZvciBncm9zcyBhbmQgbmV0IHdvcnRoLiBBbmFseXRpY2FsbHkgY2hlY2sgdGhlIGFjY3J1YWwgZm9yIHRoZSByZWFzb25hYmxlbmVzcyBvZiB0aGUgZGVwcmVjaWF0aW9uIGNoYXJnZS4NCg0KICAgIA0KYGBge3J9DQpGaXhCczwtQlNbNyxdI0Fic3RyYWN0IGZpeGVkIGFzc2V0cyBmcm9tIEJTDQpWaWV3KEZpeEJzKQ0KRml4VGI8LVRCW2MoMSw1KSxjKDQsNyw4LDksMTApXSNBYnN0cmFjdCBmaXhlZCBhc3NldHMgYW5kIGFjY3VtdWxhdGVkIGRlcHJlY2lhdGlvbiBmcm9tIFRCDQpWaWV3KEZpeFRiKQ0KRml4VGJPQjwtRml4VGJbMSwyXS1GaXhUYlsyLDJdI0NhbGN1bGF0ZSB0aGUgbmV0IHZhbHVlIG9mIGZpeGVkIGFzc2V0cyBhdCBwcmV2aW91cyBmaW5hbmNpYWwgeWVhcg0KRml4VGJPQg0KRml4VGJDQjwtRml4VGJbMSw1XS1GaXhUYlsyLDVdI0NhbGN1bGF0ZSB0aGUgbmV0IHZhbHVlIG9mIGZpeGVkIGFzc2V0cyBhdCBjdXJyZW50IGZpbmFuY2lhbCB5ZWFyDQpGaXhUYkNCDQpGaXhEaWZmPC1jKEZpeFRiT0ItRml4QnNbMSwzXSxGaXhUYkNCLUZpeEJzWzEsMl0pI0NvbXBhcmUgdGhlIHJlc3VsdHMgZnJvbSBUQiBhbmQgQlMNCkZpeERpZmYNCmBgYCAgICANClRoZSB2YWx1ZSBvZiBmaXhlZCBhc3NldHMgZnJvbSBUQiBhbmQgQlMgYXQgdGhlIGVuZCBvZiBwcmV2aW91cyBmaW5hbmNpYWwgYW5kIGF0IHRoZSBlbmQgb2YgY3VycmVudCBmaW5hbmNpYWwgeWVhciBjYW4gYmUgc2VlbiBhcyBmb2xsb3dzOiAgICANCiAgIA0KICAgICNbMV0gLTY0MDg5NS40IC02NzM1ODIuNQ0KSXQgaXMgY2xlYXIgZnJvbSB0aGUgVEIgdGhhdCB0aGUgR3Jvc3MgVmFsdWUgb2YgZml4ZWQgYXNzZXRzIGhhcyBpbmNyZWFzZWQoMTU5MzAuNTItPjIyODk0LjEzNikgZHVyaW5nIHRoZSB5ZWFyIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGFzc3VtZSB0aGF0IGFjY3VtdWxhdGVkIGRlcHJlY2lhdGlvbiBzaG91bGQgYWxzbyBpbmNyZWFzZSwgYnV0IHRoZSB5ZWFyLWVuZCBhbW91bnQgb2YgYWNjdW11bGF0ZWQgZGVwcmVjaWF0aW9uKDc5NDMuNjczKSBpbiB0aGUgVEIgaXMgbG93ZXIgdGhhbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5ZWFyKDEyMTAwLjkyKS5UaGVyZWZvcmUgdGhlIGN1cnJlbnQgeWVhciBkZXByZWNpYXRpb24gY2hhcmdlIGlzIG5vdCByZWFzb25hYmxlICAgIA0KDQpRdWVzdGlvbiAzOkNoZWNrIHRoZSBmaXhlZCBhc3NldHMgcmVnaXN0ZXIgZm9yIGFyaXRobWV0aWMgYWNjdXJhY3kuDQoNCmBgYHtyfQ0KRml4MDM8LUZBUlssYygxMSwyLDUsNiw3LDgpXSNFeHRyYWN0ICJOQU1FIiJEYXRlIiJEZXByZWNpYXRpb24gcmF0ZSIiR3Jvc3MgdmFsdWUiIkFjYy5EZXByZWNpdGlvbiJhbmQgIkRlcHJlY2lhdGlvbiIgZnJvbSBGQVINClZpZXcoRml4MDMpDQpGaXgwMyREZXA8LUZpeDAzJGBEZXByZWNpYXRpb24gcmF0ZWAqRml4MDMkYEdyb3NzIHZhbHVlYCNSZWNhbGN1bGF0ZSB0aGUgZGVwcmVjaWF0aW9uIG9mIHRoZSBmaXhlZCBhc3NldHMNCkZpeDAzJERlcERpZmY8LUZpeDAzJERlcC1GaXgwMyREZXByZWNpYXRpb24jQ29tcGFyZSB0aGUgZGVwcmVjaWF0aW9uIGFmdGVyIHJlY2FsY3VsYXRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgZGVwcmVjaWF0aW9uIGluIHRoZSB0YWJsZQ0Kc3VtX2RlcERpZmY8LXN1bShGaXgwMyREZXBEaWZmKQ0Kc3VtX2RlcERpZmYNCkZpeDAzJENsb3NpbmdEYXRlPC1hcy5EYXRlKCIyMDIzLTA0LTMwIikjQ3JlYXRlIGEgbmV3IGNvbHVtbiBhbmQgaW5zZXJ0IHRoZSBjdXJyZW50IHRpbWUgZnJvbSBKb3VyYW5sDQpGaXgwMyREYXRlPC1hcy5EYXRlKEZpeDAzJERhdGUpI0NoYW5nZSB0aGUgZm9ybWF0IG9mIHRoZSBkYXRlDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCkZpeDAzJE1vbnRoRGlmZjwtaW50ZXJ2YWwoRml4MDMkRGF0ZSxGaXgwMyRDbG9zaW5nRGF0ZSklLyUgbW9udGhzKDEpI0NhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1vbnRoIGJldHdlZW4gcHVyY2hhc2UgdGltZSBhbmQgY3VycmVudCB0aW1lDQpGaXgwMyRBY2MuZGVwPC0oRml4MDMkRGVwLzEyKSpGaXgwMyRNb250aERpZmYjUmVjYWxjdWxhdGUgdGhlIGFjY3VtdWxhdGVkIGRlcC4NCkZpeDAzJEFjYy5kZXA8LWlmZWxzZShGaXgwMyRBY2MuZGVwPkZpeDAzJGBHcm9zcyB2YWx1ZWAsRml4MDMkYEdyb3NzIHZhbHVlYCxGaXgwMyRBY2MuZGVwKSNJZiB0aGUgcmVzdWx0IGlzIGhpZ2hlciB0aGFuIGdyb3NzIHZhbHVlLHRoZW4gdGhlIHRydWUgYW5zd2VyIGlzIGdyb3NzIHZhbHVlLG90aGVyd2lzZSBBY2MuZGVwDQpGaXgwMyRBY2MuZGVwRGlmZjwtKEZpeDAzJEFjYy5kZXAtRml4MDMkQWNjLmRlcHJlY2lhdGlvbikjQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JpZ2luYWwgQWNjLmRlcC4gYW5kIHJlY2FsY3VsYXRlZCBBY2MuZGVwDQpzdW1fQWNjLmRlcERpZmY8LXN1bShGaXgwMyRBY2MuZGVwRGlmZikNCnN1bV9BY2MuZGVwRGlmZg0KYGBgDQpUaGUgZGlmZmVyZW5jZSBpczogDQogICANCiAgICAjWzFdIC0xMzA5Mzc3DQpRdWVzdGlvbiA0OiBsbnZhbGlkYXRlIHRoZSBwcm92aXNpb24gZm9yIHJlY2VpdmFibGVzLiBQcm9zcGVjdGl2ZSBhbmQgcmV0cm9zcGVjdGl2ZS4gIA0KDQpgYGB7cn0NCkFnX3N1YnNldDwtQWdbQWckVHlwPT0iT2RiaW9yY2EiLF0jTWFrZSBhbiBleHRyYWN0aW9uIGJhc2VkIG9uIHRoZSBrZXl3b3JkIOKAnE9kYmlvcmNh4oCdb2YgVHlwIGNvbHVtbiBpbiBBZw0KVmlldyhBZ19zdWJzZXQpDQpBZ19zdWJzZXQkUHJvdmlzaW9uPC1yb3dTdW1zKEFnX3N1YnNldFssMTE6MTZdKSNjYWxjdWxhdGUgdGhlIHN1bSBvZiBiYWQgZGVidCBmb3IgZWFjaCBjdXN0b21lciBpbiB0aGUgd2hvbGUgcGF5bWVudCBwZXJpb2QNCnN1bVBybzwtc3VtKEFnX3N1YnNldCRQcm92aXNpb24pI2NhbGN1bGF0ZSB0aGUgc3VtIG9mIGJhZCBkZWJ0cw0Kc3VtUHJvDQpBZ19zdWJzZXQkRUw8LUFnX3N1YnNldCRQRCpBZ19zdWJzZXQkTEdEKkFnX3N1YnNldCRFQUQjY2FsY3VsYXRlIEVMIGZvciBlYWNoIGN1c3RvbWVyIA0Kc3VtRUw8LXN1bShBZ19zdWJzZXQkRUwpDQpzdW1FTA0KUHJvVEI8LVRCWzM2LF0jRXh0cmFjdCBwcm92aXNpb24gb2YgYmFkIGRlYnRzIGZvciB0cmFkZSByZWNlaXZhYmxlDQpWaWV3KFByb1RCKQ0KRGlmZl8xPC1zdW1Qcm8tUHJvVEJbMSwxMF0jQ29tcGFyZSB0aGUgcHJvdmlzaW9uIGZyb20gVEIgd2l0aCB0aGUgc3VtIG9mIGJhZCBkZWJ0IGJhc2VkIG9uIGFnaW5nIGFuYWx5c2lzDQpEaWZmXzENCkRpZmZfMjwtc3VtRUwtUHJvVEJbMSwxMF0jQ29tcGFyZSB0aGUgcHJvdmlzaW9uIGZyb20gVEIgd2l0aCB0aGUgc3VtIG9mIGJhZCBkZWJ0IGJhc2VkIG9uIHByb3NwZWN0aXZlIGFwcHJvYWNoDQpEaWZmXzINCmBgYA0KVGhlIGRpZmZlcmVuY2VzIGJhc2VkIG9uIGFnaW5nIGFuYWx5c2lzIGFuZCBwcm9zcGVjdGl2ZSBhcHByb2FjaCBhcmU6DQogICAgDQogICAgI1sxXSAxMjQzOTU2OA0KICAgIA0KICAgICNbMV0gMTUzNTc1LjkNClRoZSBwcm92aXNpb24gd2hpY2ggc3RhdGVkIGluIFRCIGNhbiBub3QgY292ZXIgdGhlIGJhZCBkZWJ0IGJhc2VkIG9uIGFnaW5nIGFuYWx5c2lzIGFuZCBwcm9zcGVjdGl2ZSBhcHByb2FjaCxzbyB0aGF0IHRoZXJlIGlzIGEgbmVlZCBmb3IgYWRqdXN0bWVudA0KDQpRdWVzdGlvbiA177yaRm9yIGl0ZW1zIGFib3ZlIHRoZSBQTSwgbWFrZSBhIHNlYXJjaCBmb3IgdW5hY2NvdW50ZWQgbGlhYmlsaXRpZXMuDQoNClF1ZXN0aW9uIDY6UmVjb25jaWxlIHRoZSBlcXVpdHkgcG9zaXRpb24gdG8gdGhlIEtSUyBleHRyYWN0Lg0KYGBge3J9DQpFcXVUQjwtVEJbYyg5OSwxMDAsMTAxLDEwMiwxMDksMTEwLDExMSksYyg0LDcsMTApXSNFeHRyYWN0IHJvd3MgdGhhdCByZWxhdGVkIHRvIGVxdWl0eSBmcm9tIFRCDQpWaWV3KEVxdVRCKQ0KRXF1VEJPQjwtRXF1VEJbMSwyXStFcXVUQlsyLDJdK0VxdVRCWzMsMl0rRXF1VEJbNCwyXStFcXVUQls1LDJdLUVxdVRCWzYsMl0tRXF1VEJbNywyXSNDYWxjdWxhdGVkIHRoZSBlcXVpdHkgYW50IHRoZSBlbmQgb2YgcHJldmlvdXMgZmluYW5jaWFsIHllYXINCkVxdVRCT0INCkVxdVRCQ0I8LUVxdVRCWzEsM10rRXF1VEJbMiwzXStFcXVUQlszLDNdK0VxdVRCWzQsM10rRXF1VEJbNSwzXS1FcXVUQls2LDNdLUVxdVRCWzcsM10jQ2FsY3VsYXRlZCB0aGUgZXF1aXR5IGFudCB0aGUgZW5kIG9mIGN1cnJlbnQgZmluYW5jaWFsIHllYXINCkVxdVRCQ0INCkVxdV8wMTwtYyhFcXVUQk9CLEVxdVRCQ0IpDQpWaWV3KEVxdV8wMSkNCkVxdUJTPC1CU1s1MCxdI0V4dHJhY3QgZXF1aXR5IGZyb20gQlMNClZpZXcoRXF1QlMpDQpFcXVEaWZmPC1jKEVxdVRCT0ItRXF1QlNbMSwzXSxFcXVUQkNCLUVxdUJTWzEsMl0pI0NvbXBhcmUgdGhlIHJlc3VsdHMgZnJvbSBUQiB3aXRoIHRoZSBkYXRhIGluIEJTDQpFcXVEaWZmDQpgYGANClRoZSBkaWZmZXJlbmNlcyBhdCB0aGUgZW5kIG9mIHByZXZpb3VzIGZpbmFuY2lhbCB5ZWFyIGFuZCBhdCB0aGUgZW5kIG9mIGN1cnJlbnQgZmluYW5jaWFsIHllYXIgYXJlOiAgIA0KDQogICAgWzFdIC01MzgwMTQuOSAtNTUzNTE0LjkNClF1ZXN0aW9uIDc6IFRha2UgYSBzYW1wbGUgb2YgZml4ZWQgYXNzZXRzIGFuZCBjaGVjayB0aGUgY2FsY3VsYXRpb24gb2YgZGVwcmVjaWF0aW9uLg0KYGBge3J9DQpzYW1wbGUoYygxOjExMyksMTAscmVwbGFjZSA9IEZBTFNFKSNQaWNrIDEwIG51bWJlciBmcm9tIDEgdG8gMTEzIGF0IHJhbmRvbQ0KRml4MDc8LUZBUltjKDc3LDEwOSwxMTEsODAsOTksNDksNzUsNDIsODksNTkpLGMoMTEsMiw1LDYsNyw4LDkpXSNFeHRyYWN0IGNvcnJlc3BvbmRpbmcgcm93cyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlcg0KVmlldyhGaXgwNykNCkZpeDA3JENsb3NpbmdkYXRlPC1hcy5EYXRlKCIyMDIzLTA0LTMwIikjQ3JlYXRlIGEgbmV3IGNvbHVtbiBhbmQgaW5zZXJ0IHRoZSBjdXJyZW50IHRpbWUgZnJvbSBKb3VyYW5sDQpGaXgwNyREYXRlPC1hcy5EYXRlKEZpeDA3JERhdGUpI0NoYW5nZSB0aGUgZm9ybWF0IG9mIHRoZSBkYXRlDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCkZpeDA3JE1vbnRoRGlmZiA8LSBpbnRlcnZhbCggRml4MDckRGF0ZSxGaXgwNyRDbG9zaW5nZGF0ZSklLyUgbW9udGhzKDEpI0NhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1vbnRoIGJldHdlZW4gcHVyY2hhc2UgdGltZSBhbmQgY3VycmVudCB0aW1lDQpwcmludChGaXgwNykNCkZpeDA3JERlcDwtRml4MDckYERlcHJlY2lhdGlvbiByYXRlYCpGaXgwNyRgR3Jvc3MgdmFsdWVgI1JlY2FsY3VsYXRlIHRoZSBkZXAuDQpGaXgwNyREZXBEaWZmPC1GaXgwNyREZXAtRml4MDckRGVwcmVjaWF0aW9uI0NhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHJlY2FsY3V0ZWQgZGVwLiBhbmQgb3JpZ2luYWwgZGF0YQ0Kc3VtX0RlcERpZmY8LXN1bShGaXgwNyREZXBEaWZmKQ0Kc3VtX0RlcERpZmYNCmBgYA0KVGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHRoZSBzdW0gb2YgZGVwLiBpcyAwOg0KDQogICAgWzFdIDANCkNoZWNrIHRoZSBjYWxjdWxhdGlvbiBvZiBhY2N1bXVsYXRlZCBkZXAuDQogICAgDQpgYGB7cn0NCkZpeDA3JEFjYy5kZXA8LShGaXgwNyREZXAvMTIpKkZpeDA3JE1vbnRoRGlmZg0KRml4MDckQWNjLmRlcDwtaWZlbHNlKEZpeDA3JEFjYy5kZXA+Rml4MDckYEdyb3NzIHZhbHVlYCxGaXgwNyRgR3Jvc3MgdmFsdWVgLEZpeDA3JEFjYy5kZXApDQpGaXgwNyRBY2MuZGVwRGlmZjwtKEZpeDA3JEFjYy5kZXAtRml4MDckQWNjLmRlcHJlY2lhdGlvbikNCnN1bV9BY2MuZGVwRGlmZjwtc3VtKEZpeDA3JEFjYy5kZXBEaWZmKQ0Kc3VtX0FjYy5kZXBEaWZmDQpgYGAgICAgDQpUaGUgZGlmZmVyZW5jZSBpczoNCiAgICANCiAgICBbMV0gNDIwNTcuMzUNCg0KUXVlc3Rpb24gODogQ2FsY3VsYXRlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUNCmNhbGN1bGF0aW9uIG9mIGludGVyZXN0IG9uIGxpYWJpbGl0aWVzLiBBc3N1bWUgYSByYXRlIG9mIDglIHBhLg0KDQpFeHRyYWN0IHNob3J0LXRlcm0gbG9hbiBhbmQgbG9uZy10ZXJtIGxvYW4gZnJvbSBKbyBhbmQgQkEgcmVzcGVjdGl2ZWx5DQpgYGB7cn0NCkpvX3N1YnNldDwtSm9bSm8kT3Bpcy4xLjM1NzAwLj09IktyZWR5dHkgYmFua293ZSBkPz91Z290ZXJtaW5vd2UiLF0NClZpZXcoSm9fc3Vic2V0KQ0KSm9fc3Vic2V0XzI8LUpvW0pvJE9waXMuMS4zNTcwMC49PSJLcmVkeXR5IGJhbmtvd2Uga3I/P3Rrb3Rlcm1pbm93ZSIsXQ0KVmlldyhKb19zdWJzZXRfMikNCkpvX3N1YnNldDwtSm9fc3Vic2V0W2MoMToyMzkpLF0NClZpZXcoSm9fc3Vic2V0KQ0KQkFfc3Vic2V0PC1CQVtCQSRPcGlzLjEuMzU3MDAuPT0iS3JlZHl0eSBiYW5rb3dlIGQ/P3Vnb3Rlcm1pbm93ZSIsXQ0KVmlldyhCQV9zdWJzZXQpDQpCQV9zdWJzZXRfMjwtQkFbQkEkT3Bpcy4xLjM1NzAwLj09IktyZWR5dHkgYmFua293ZSBrcj8/dGtvdGVybWlub3dlIixdDQpWaWV3KEJBX3N1YnNldF8yKQ0KYGBgICAgIA0KDQoNCg0KDQoNCg0KDQoNCg0KDQpRdWVzdGlvbjk6IFdyaXRlIHRoZSBhdWRpdCBwcm9ncmFtIGZvciBwcm92aXNpb25zLg0KDQogICAgVGVzdCBvbiBwcm92aXNpb25zDQogICAgQSBwcm92aXNpb24gaXMgYSBsaWFiaWxpdHkgb2YgdW5jZXJ0YWluIHRpbWluZyBvciBhbW91bnQgdGhhdCBzaG91bGQgb25seSBiZSByZWNvZ25pemVkOg0KICAgICgxKS5BbiBlbnRpdHkgaGFzIGEgcHJlc2VudCBvYmxpZ2F0aW9uIChsZWdhbCBvciBjb25zdHJ1Y3RpdmUpIGFzIGEgcmVzdWx0IG9mIHBhc3QgZXZlbnQ7DQogICAgKDIpLkl0IGlzIHByb2JhYmxlKDUwJSkgdGhhdCBhbiBvdXRmbG93IG9mIGVjb25vbWljIHJlc291cmNlcyB3aWxsIGJlIHJlcXVpcmVkIHRvIHNldHRsZSB0aGUgb2JsaWdhdGlvbjsNCiAgICAoMykuQSByZWxpYWJsZSBlc3RpbWF0ZSBjYW4gYmUgbWFkZSBvZiB0aGUgYW1vdW50IG9mIHRoZSBvYmxpZ2F0aW9uDQogICAgVGhlcmVmb3JlIHRoZSB0ZXN0IG9uIHByb3Zpc2lvbnMgY291bGQgYmFzZWQgb24gaXRzIGRlZmluaXRpb24NCiAgICBTdWJzdGFudGl2ZSAgcHJvY2Vzcw0KICAgICgxKVByZXNlbnQgb2JsaWdhdGlvbg0KICAgID09PkNvbnN0cnVjdGl2ZSBvYmxpZ2F0aW9uDQogICAgYTogSGF2ZSB0aGV5IGNyZXN0ZWQgYSB2YWxpZCBleHBlY3RhdGlvbiBpbiBvdGhlciBwYXJ0aWVzIHRoYXQgdGhleSB3aWxsIGRpc2NoYXJnZSB0aGUgb2JsaWdhdGlvbj8NCiAgICBiOiBEaXNjdXNzIHdpdGggdGhlIGRpcmVjdG9ycyBhcyB0byB3aGV0aGVyIHRoZXkgaGF2ZSBmb3JtYWxseSBhbm5vdW5jZWQgdGhlaXIgaW50ZW50aW9uLHRvIGNvbmZpcm0gdGhhdCBhIHByZXNlbnQgb2JsaWdhdGlvbiBleGlzdHMgYXQgdGhlIHllYXIgZW5kLiBJZiBhbm5vdW5jZWQgYmVmb3JlIHRoZSB5ZWFyIGVuZCwgcmV2aWV3IHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiB0byB2ZXJpZnkgdGhhdCB0aGUgZGVjaXNpb24gaGFzIGJlZW4gZm9ybWFsbHkgYW5ub3VuY2VkLg0KICAgIGM6IFJldmlldyBldmlkZW5jZSBvZiB0aGUgcGFzdCBwcmFjdGljZXMsIHB1Ymxpc2hlZCBwb2xpY2llcyBhbmQgc3RhdGVtZW50cyBtYWRlDQogICAgPT0+TGVnYWwgb2JsaWdhdGlvbg0KICAgIGE6IERpc2N1c3Mgd2l0aCB0aGUgbWFuYWdlbWVudCB0aGUgbmF0dXJlIG9mIHRoZSBpc3N1ZSwgdG8gZW5zdXJlIHRoYXQgYSBmdWxsIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGlzc3VlIGl0IGlzIG9idGFpbmVkIGFuZCB0byAgYXNzZXNzICB3aGV0aGVyIHRoZSBvYmxpZ2F0aW9uIGV4aXN0cy4NCiAgICBiOiBSZXZpZXcgb2YgY29ycmVzcG9uZGVuY2UgYW5kIG90aGVyIGRvY3VtZW50YXRpb24gdG8gYXNzZXNzIHdoZXRoZXIgdGhlIGNvbXBhbnkgaGFzIGEgcHJlc2VudCBvYmxpZ2F0aW9uIGFzIGEgcmVzdWx0IG9mIHBhc3QgZXZlbnQNCiAgICAoMilQcm9iYWJsZSBvdXRmbG93DQogICAgYTogUmV2aWV3IHRoZSBwb3N0IHllYXItZW5kIHBlcmlvZCB0byBpZGVudGl0eSB3aGV0aGVyIGFueSBwYXltZW50cyBoYXZlIGJlZW4gbWFkZQ0KICAgIGI6IERpc2N1c3MgdGhlIHBvc2l0aW9uIHdpdGggc2ltaWxhciBwYXN0IHByb3Zpc2lvbnMgd2l0aCB0aGUgZGlyZWN0b3JzLiBXZXJlIHRoZXNlIHByb3Zpc2lvbnMgZXZlbnR1YWxseSBzZXR0bGVkPw0KICAgIGM6IFJldmlldyB0aGUgYm9hcmQgbWludXRlcyBhbmQgYW55IGNvbXBhbnkgY29ycmVzcG9uZGVuY2UgdG8gYXNzZXJ0aW9uIHdoZXRoZXIgaXQgaXMgcHJvYmFibGUgIHRoZSB0aGF0IHBheW1lbnRzIHdpbGwgYmUgcGFpZCBieSByZXZpZXdpbmcgdGhlIHN1cHBvcnRpbmcgZXZpZGVuY2UNCiAgICBkOldyaXRlIGFuZCBzZW5kIGFuZCBlbnF1aXJ5IGxldHRlciB0byB0aGUgY29tcGFueeKAmXMgbGF3eWVycyB0byBvYnRhaW4gdGhlaXIgdmlld3MgYXMgdG8gdGhlIHByb2JhYmlsaXR5IG9mIHRoZSBjbGFpbSBiZWluZyBzdWNjZXNzZnVsDQogICAgZTogT2J0YWluIGEgd3JpdHRlbiByZXByZXNlbnRhdGlvbiBmcm9tIHRoZSBkaXJlY3RvcnMgdG8gY29uZmlybSB0aGUgY29tcGxldGVuZXNzIG9mIHRoZSBvZiB0aGUgcHJvdmlzaW9uLGJ5IGNvbmZpcm1pbmcgdGhlaXIgdmlldyB0aGF0IHRoZSBjaGFuY2VzIG9mIGEgc3VjY2Vzc2Z1bCBjbGFpbSBhcmUgcmVtb3RlIGFuZCBubyBwcm92aXNpb24gb3IgY29udGluZ2VudCBsaWFiaWxpdHkgaXMgcmVxdWlyZWQuDQogICAgKDMpUmVsaWFibGUgZXN0aW1hdGUNCiAgICBhOiBPYnRhaW4gYSBicmVha2Rvd24gb2YgdGhlIGNhbGN1bGF0aW9uIGFuZCBjYXN0IGl0IHRvIGVuc3VyZSBjb21wbGV0ZW5lc3MsIGFncmVlIGNvbXBvbmVudHMgb2YgdGhlIGNhbGN1bGF0aW9uIHRvIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4NCiAgICBiOiBSZXZpZXcgYW55IGNvcnJlc3BvbmRlbmNlIHRvIGFzc2VzcyB3aGV0aGVyIHRoZSBjb21wYW55IGhhcyBzIHJlbGlhYmxlIGVzdGltYXRlIG9mIGFueSBwb3RlbnRpYWwgcGF5bWVudHMgY2FuIGJlIG1hZGUuDQogICAgDQpRdWVzdGlvbjEwOiBXcml0ZSBhIGdlbmVyYWwgYXVkaXQgcHJvZ3JhbQ0KDQogICAgQSBnZW5lcmFsIGF1ZGl0IHByb2dyYW0gbWFpbmx5IGluY2x1ZGVzIHR3byBwYXJ0czoNCiAgICAxLk92ZXJhbGwgYXVkaXQgc3RyYXRlZ3k6IEl0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzY29wZSBvZiB0aGUgYXVkaXQ7IHJlcG9ydGluZyBvYmplY3RpdmVzLCB0aW1pbmc7IGF1ZGl0IGRpcmVjdGlvbiBhbmQgYXVkaXQgcmVzb3VyY2VzLiBBdCB0aGlzIHN0YWdlIGl0IGlzIG5lY2Vzc2FyeSB0byBjb25maXJtLCBmb3IgZXhhbXBsZTogDQogICAgKDEpIFRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdGhlIGF1ZGl0IHNjb3BlOyANCiAgICAoMikgVGhlIHJlYXNvbmFibGVuZXNzIG9mIHRoZSB0aW1lIGJ1ZGdldDsgDQogICAgKDMpIFRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdGhlIHNlbGVjdGlvbiBhbmQgIA0KICAgICg0KSBUaGUgZGV0ZXJtaW5hdGlvbiBvZiB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwgb2YgbWF0ZXJpYWxpdHkNCiAgICAyLlNwZWNpZmljIGF1ZGl0IHBsYW46IFRoaXMgcGhhc2UgY29uc2lzdHMgb2YgdGhyZWUgbWFpbiBzdGVwczogcmlzayBhc3Nlc3NtZW50LCBmdXJ0aGVyIGF1ZGl0IHByb2NlZHVyZXMgYW5kIG90aGVyIGF1ZGl0IHByb2NlZHVyZXMNCiAgICAoMSlSaXNrIGFzc2Vzc21lbnQgKElSKTogVW5kZXJzdGFuZGluZyB0aGUgZW50aXR5IGFuZCBpdHMgZW52aXJvbm1lbnQuIEFzc2VzcyB0aGUgcmlzayBvZiBtYXRlcmlhbCBtaXNzdGF0ZW1lbnQgYXQgdGhlIGZpbmFuY2lhbCBzdGF0ZW1lbnQgYW5kIGFzc2VydGlvbiBsZXZlbA0KICAgICgyKUZ1cnRoZXIgYXVkaXQgcHJvY2VkdXJlczo9PlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcHJvY2VkdXJlczoNCiAgICBhOiBUZXN0cyBvZiBjb250cm9sIChDUik6IFRvIHRlc3QgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIGVudGl0eeKAmXMgaW50ZXJuYWwgY29udHJvbHMgaW4gcHJldmVudGluZyBvciBkZXRlY3RpbmcgbWF0ZXJpYWwgbWlzc3RhdGVtZW50cw0KICAgIGI6IFN1YnN0YW50aXZlIHByb2NlZHVyZXMgKERSKTogVG8gZGV0ZWN0IG1hdGVyaWFsIG1pc3N0YXRlbWVudHMuIFRoaXMgY2FuIGJlIGRvbmUgaW4gdHdvIHdheXM6IEZpcnN0IG9mIGFsbCx0ZXN0cyBvZiBkZXRhaWwuRm9yIGV4YW1wbGUsIHZvdWNoaW5nIGFtb3VudHMgYmFjayB0byBpbnZvaWNlcywgcGh5c2ljYWwgaW5zcGVjdGlvbiBvZiBhc3NldHM7IE1vcmVvdmVyLCB3ZSBjYW4gdXNlIGFuYWx5dGljYWwgcHJvY2VkdXJlcywgZm9yIGV4YW1wbGUgdmFyaWFuY2UgYW5hbHlzaXMsIHJhdGlvIGFuYWx5c2lzICYgcHJvb2YgaW4gdG90YWwuDQogICAgKDMpSG93ZXZlciwgd2UgYWxzbyBuZWVkIHRvIGp1ZGdpbmcgdGhlIG5lZWRzIGZvciB0aGUgdGVzdCBvZiBmcmF1ZCwgZ29pbmcgY29uY2VybiBhbmQgcmVsYXRpdmUtcGFydHkgdHJhbnNhY3Rpb24gZXRjLiBieSBvdXIgcHJvZmVzc2lvbmFsLg0KDQoNCg0KDQoNCg0KDQoNCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCg==