Introduzione
Texas Realty Insights ha richiesto un’analisi approfondita del
mercato immobiliare texano per il periodo 2010–2014. L’obiettivo è
identificare tendenze storiche, valutare l’efficacia delle inserzioni
immobiliari e fornire insight strategici basati su dati concreti. Il
dataset include informazioni mensili su vendite, prezzi, volumi e
inventario per diverse città del Texas.
Attraverso un approccio statistico e visivo, questo report guiderà
l’azienda nell’ottimizzazione delle strategie di vendita, evidenziando
le città più dinamiche e i periodi più favorevoli per il mercato.
0. Esplorazione dataset
l numero totale di record nel dataset è: 240
1. Analisi delle variabili
di seguito una tabella riassuntiva sulle variabili del data set
realestate_texas.csv
city |
Categoriale |
Nome della città: variabile cardine su cui basare l’analisi
condizionata |
year |
Quantitativa |
Anno di riferimento: variabile tempo utilizzabile per analizzare il
trend delle vendite negli anni |
month |
Categoriale |
Mese (da 1 a 12): variabile tempo utilizzabile per analizzare il
trend nei mesi dell’anno più prolifici |
sales |
Quantitativa |
Numero di vendite: variabile utilizzabile per determinare sull’asse
Y la quantità di vendite per ciascuna città o mese/anno |
volume |
Quantitativa |
Valore totale delle vendite (milioni di $) |
median_price |
Quantitativa |
Prezzo mediano di vendita: utilizzabile per analizzare il valore del
mercato nel tempo, nello spazio e rispetto ad altri indicatori |
listings |
Quantitativa |
Numero di annunci attivi: variabile utilizzabile per analizzare la
correlazione tra annunci e vendite |
months_inventory |
Quantitativa |
Mesi necessari per vendere tutte le case disponibili: variabile
utilizzabile per |
2. Indici di posizione - Analisi della variabilità e
dell’asimmetria
Calcola Indici di posizione, variabilità e forma per tutte le
variabili per le quali ha senso farlo, per le altre crea una
distribuzione di frequenza.
Tabella- Indici di posizione, variabilità e asimmetria per variabili quantitative
| Variabile |
Media |
Deviazione_Standard |
Coeff_Variazione |
Minimo |
Massimo |
Skewness |
Kurtosis |
| sales |
192.29 |
79.65 |
0.41 |
79.00 |
423.00 |
0.72 |
2.69 |
| volume |
31.01 |
16.65 |
0.54 |
8.17 |
83.55 |
0.88 |
3.18 |
| median_price |
132665.42 |
22662.15 |
0.17 |
73800.00 |
180000.00 |
-0.36 |
2.38 |
| listings |
1738.02 |
752.71 |
0.43 |
743.00 |
3296.00 |
0.65 |
2.21 |
| months_inventory |
9.19 |
2.30 |
0.25 |
3.40 |
14.90 |
0.04 |
2.83 |
Tabella- Frequenza delle osservazioni per città
| Città |
Numero di osservazioni |
| Beaumont |
60 |
| Bryan-College Station |
60 |
| Tyler |
60 |
| Wichita Falls |
60 |
3. Identificazione delle variabili con maggiore variabilità e
asimmetria
Determina: - Qual è la variabile con la più alta variabilità - Qual è
la variabile con la distribuzione più asimmetrica

4. Creazione di classi per una variabile quantitativa
Seleziona una variabile quantitativa (es. sales o median_price) e
suddividila in classi. Crea una distribuzione di frequenze e rappresenta
i dati con un grafico a barre. Calcola l’indice di eterogeneità Gini e
discuti i risultati.

Calcola l’indice di eterogeneità Gini
Gini index sales = 0.2311
Commenti:
Un valore di Gini pari a 0.2311 indica una disuguaglianza
moderata-bassa nella distribuzione delle vendite. Questo significa che,
pur esistendo differenze tra le osservazioni, la maggior parte dei
valori di sales si concentra in un intervallo relativamente omogeneo. Lo
conferma anche il grafico a barre: la classe (100,200) domina
nettamente, mentre le classi estreme sono poco rappresentate.
5. Calcolo della probabilità
Qual è la probabilità che, presa una riga a caso di questo dataset,
essa riporti la città “Beaumont”? E la probabilità che riporti il mese
di Luglio? E la probabilità che riporti il mese di dicembre 2012?
Probabilità che la città sia Beaumont = 25 %
Probabilità che il mese sia Luglio = 8.3 %
Probabilità che il mese sia dicembre 2012 = 1.7 %
6. Creazione di nuove variabili
Crea una nuova colonna che calcoli il prezzo medio degli immobili
utilizzando le variabili disponibili
La seguente tabella mostra i primi 5 record della nuova colonna
prezzo_mediodel dataframe che contiene prezzo_medio =
volume/sales
| prezzo_medio |
| 170627 |
| 163796 |
| 157698 |
| 134095 |
| 142738 |
Prova a creare una colonna che misuri l’efficacia degli annunci di
vendita. Commenta e discuti i risultati La seguente tabella mostra i
primi 5 record della nuova colonna efficacia_annuncio del
dataframe che contiente il prezzo_medio = volume/sales
Questa metrica indica quanti immobili sono stati venduti rispetto al
numero di annunci attivi. In altre parole:
Valori vicini a 1 → quasi ogni annuncio ha portato a una vendita →
molto efficace
Valori < 1 → non tutti gli annunci hanno generato vendite → meno
efficace
| efficacia_annuncio |
| 0.0541422 |
| 0.0680958 |
| 0.1077561 |
| 0.1170960 |
| 0.1140599 |
Colonna creata nel dataset come da immagine.
La nuova variabile è stata subito utilizzata per creare il grafico
“efficacia degl annunci per città”.
Il seguente grafico dell’efficacia degli annunci per città mostra
infatti come gli annunci siano mediamente più efficaci nella città di
Bryan-Collage Station

7. Analisi condizionata
Usa il pacchetto dplyr o il linguaggio base di R per effettuare
analisi statistiche condizionate per città, anno e mese. Genera dei
summary (media, deviazione standard) e rappresenta graficamente i
risultati.
7.1 Statistiche condizionate per città
–Il grafico mette a confronto il prezzo medio per ogni Città. La
città di Bryan-College Station risulta la città con il
prezzo medio più alto.

7.2 Statistiche condizionate per anno
–Il grafico mostra l’andamento del prezzo medio su base annua.
L’andamento subisce un ribasso dal 2010 al 2011 per poi riprendere in
crescente fino al 2014

7.3 Statistiche condizionate per mese
–Il grafico mostra l’andamento del prezzo medio su base mensile per
evidenziare una “variazione stagionale”
Il grafico mostra un trend al rialzo del prezzi medi a partire da
Aprile. I mesi iniziali sono quelli con il prezzo medio inferiore
rispetto nell’anno.
Giugno è il mese con il picco di prezzo medio pù
alto

8. Creazione di visualizzazioni con ggplot2
Visual 1: Confronto volume fatturato derivante dalle vendite
(YoY)

il 2014 è l’anno con il volume più alto di vendite
espresse in milioni di dollari
Visual 2: Confronto delle vendite MoM (filtrabile per anno)
Il grafico mostra che nei mesi centrali dell’anno
sono concentrate più vendite. Giugno è il mese Top.
Gennaio il mese peggiore
Visual 3: Andamento delle vendite per città e nel tempo
Il grafico mostra che Tyler è la top city per
vendite di sempre

Visual 4: Andamento delle vendite per città e nel tempo
Il grafico interattivo mostra l’andamento delle vendite per città nel
tempo ed effettuare eventuali previsioni future
La città di Tyler storicamente è quella con vendite
maggiori anche se superata nel Luglio 2013 da Bryan-Collage
Station
Visual 5: Andamento delle vendite per città su base mensile
Il grafico interattivo mostra la distribuzione del totale vendite
delle città su base mensile
Visual 6: Andamento prezzo medio nel tempo (filtrabile per
anno)
Il grafico interattivo mostra il trend del prezzo medio nel tempo per
individuare cali o aumenti nel periodo ed effettuare eventuali
previsioni future
Visual 7: Confrono prezzo medio per città
Il grafico mette a confronto il prezzo medio delle città.
Bryan-Collage Station risulta la città con il prezzo
medio più alto

Visual 8: Correlazione tra le vatiabili annunci e vendite di
casa
C’è una relazione positiva tra annunci e vendite: più annunci, più
vendite .
Il valore r = 0.62 indica una buona correlazione, ma non perfetta
Il p-value molto basso conferma che la correlazione non è dovuta al
caso

Pearson's product-moment correlation
data: dati$listings and dati$sales
t = 12.212, df = 238, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5361890 0.6928509
sample estimates:
cor
0.6206765
Add-on insight
⏱️ Il tempo medio per vendere le inserzioni è: 9.19 mesi
Nella città di Tyler mediamente si impiega più tempo a vendere gli
immobili (11.3 mesi), mentre Bryan-Collage Station è
quella con mediamente minor tempo(7.5 mesi) .

LS0tDQp0aXRsZTogIlByb2dldHRvIGFuYWxpc2kgdmVuZGl0ZSBpbW1vYmlsaSBpbiBUZXhhcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgSW50cm9kdXppb25lDQpUZXhhcyBSZWFsdHkgSW5zaWdodHMgaGEgcmljaGllc3RvIHVu4oCZYW5hbGlzaSBhcHByb2ZvbmRpdGEgZGVsIG1lcmNhdG8gaW1tb2JpbGlhcmUgdGV4YW5vIHBlciBpbCBwZXJpb2RvIDIwMTDigJMyMDE0LiBM4oCZb2JpZXR0aXZvIMOoIGlkZW50aWZpY2FyZSB0ZW5kZW56ZSBzdG9yaWNoZSwgdmFsdXRhcmUgbOKAmWVmZmljYWNpYSBkZWxsZSBpbnNlcnppb25pIGltbW9iaWxpYXJpIGUgZm9ybmlyZSBpbnNpZ2h0IHN0cmF0ZWdpY2kgYmFzYXRpIHN1IGRhdGkgY29uY3JldGkuIElsIGRhdGFzZXQgaW5jbHVkZSBpbmZvcm1hemlvbmkgbWVuc2lsaSBzdSB2ZW5kaXRlLCBwcmV6emksIHZvbHVtaSBlIGludmVudGFyaW8gcGVyIGRpdmVyc2UgY2l0dMOgIGRlbCBUZXhhcy4NCg0KQXR0cmF2ZXJzbyB1biBhcHByb2NjaW8gc3RhdGlzdGljbyBlIHZpc2l2bywgcXVlc3RvIHJlcG9ydCBndWlkZXLDoCBs4oCZYXppZW5kYSBuZWxs4oCZb3R0aW1penphemlvbmUgZGVsbGUgc3RyYXRlZ2llIGRpIHZlbmRpdGEsIGV2aWRlbnppYW5kbyBsZSBjaXR0w6AgcGnDuSBkaW5hbWljaGUgZSBpIHBlcmlvZGkgcGnDuSBmYXZvcmV2b2xpIHBlciBpbCBtZXJjYXRvLg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCiMg8J+TmiBDYXJpY2FtZW50byBkZWxsZSBsaWJyZXJpZSBuZWNlc3NhcmllDQoNCmxpYnJhcnkoZHBseXIpICAgICAgICAjIE1hbmlwb2xhemlvbmUgZGVpIGRhdGkNCmxpYnJhcnkoZ2dwbG90MikgICAgICAjIEdyYWZpY2kgc3RhdGljaQ0KbGlicmFyeShwbG90bHkpICAgICAgICMgR3JhZmljaSBpbnRlcmF0dGl2aQ0KbGlicmFyeShjcm9zc3RhbGspICAgICMgRmlsdHJpIGludGVyYXR0aXZpIGNvbmRpdmlzaQ0KbGlicmFyeShic3BsdXMpICAgICAgICMgTGF5b3V0IGludGVyYXR0aXZvIGNvbiBic2NvbHMoKQ0KbGlicmFyeShzY2FsZXMpICAgICAgICMgRm9ybWF0dGF6aW9uZSBudW1lcmljYSAoZXRpY2hldHRlLCBhc3NpKQ0KbGlicmFyeShyZWFkcikgICAgICAgICMgTGV0dHVyYSBmaWxlIENTViAoc2UgdXNhdG8pDQojIE9wemlvbmFsaQ0KbGlicmFyeShEVCkgICAgICAgICAgICMgVGFiZWxsZSBpbnRlcmF0dGl2ZQ0KbGlicmFyeShrYWJsZUV4dHJhKSAgICMgVGFiZWxsZSBzdGF0aWNoZSBlbGVnYW50aQ0KbGlicmFyeSh0aWR5cikgICAgICAgICMgUmlzdHJ1dHR1cmF6aW9uZSBkYXRpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICAgIyBHZXN0aW9uZSBkYXRlDQpsaWJyYXJ5KGUxMDcxKQ0KbGlicmFyeShtb21lbnRzKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGF0aSA8LSByZWFkLmNzdigicmVhbGVzdGF0ZV90ZXhhcy5jc3YiKQ0KYGBgDQoNCiMjIyAwLiBFc3Bsb3JhemlvbmUgZGF0YXNldA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KaGVhZChkYXRpKQ0KbnVtZXJvX3JlY29yZCA8LSBucm93KGRhdGkpDQpjYXQocGFzdGUoImwgbnVtZXJvIHRvdGFsZSBkaSByZWNvcmQgbmVsIGRhdGFzZXQgw6g6IiwgbnVtZXJvX3JlY29yZCwgIlxuIikpDQoNCg0KYGBgDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIDEuIEFuYWxpc2kgZGVsbGUgdmFyaWFiaWxpDQpkaSBzZWd1aXRvIHVuYSB0YWJlbGxhIHJpYXNzdW50aXZhIHN1bGxlIHZhcmlhYmlsaSBkZWwgZGF0YSBzZXQgcmVhbGVzdGF0ZV90ZXhhcy5jc3YNCg0KfCBWYXJpYWJpbGUgICAgICAgICAgfCBUaXBvICAgICAgICAgfCBEZXNjcml6aW9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgYGNpdHlgICAgICAgICAgICAgIHwgQ2F0ZWdvcmlhbGUgIHwgTm9tZSBkZWxsYSBjaXR0w6A6IHZhcmlhYmlsZSBjYXJkaW5lIHN1IGN1aSBiYXNhcmUgbCdhbmFsaXNpIGNvbmRpemlvbmF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYHllYXJgICAgICAgICAgICAgIHwgUXVhbnRpdGF0aXZhIHwgQW5ubyBkaSByaWZlcmltZW50bzogdmFyaWFiaWxlIHRlbXBvIHV0aWxpenphYmlsZSBwZXIgYW5hbGl6emFyZSBpbCB0cmVuZCBkZWxsZSB2ZW5kaXRlIG5lZ2xpIGFubmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYG1vbnRoYCAgICAgICAgICAgIHwgQ2F0ZWdvcmlhbGUgIHwgTWVzZSAoZGEgMSBhIDEyKTogdmFyaWFiaWxlIHRlbXBvIHV0aWxpenphYmlsZSBwZXIgYW5hbGl6emFyZSBpbCB0cmVuZCBuZWkgbWVzaSBkZWxsJ2Fubm8gcGnDuSBwcm9saWZpY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgc2FsZXNgICAgICAgICAgICAgfCBRdWFudGl0YXRpdmEgfCBOdW1lcm8gZGkgdmVuZGl0ZTogdmFyaWFiaWxlIHV0aWxpenphYmlsZSBwZXIgZGV0ZXJtaW5hcmUgc3VsbCdhc3NlIFkgbGEgcXVhbnRpdMOgIGRpIHZlbmRpdGUgcGVyIGNpYXNjdW5hIGNpdHTDoCBvIG1lc2UvYW5ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgdm9sdW1lYCAgICAgICAgICAgfCBRdWFudGl0YXRpdmEgfCBWYWxvcmUgdG90YWxlIGRlbGxlIHZlbmRpdGUgKG1pbGlvbmkgZGkgJCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgbWVkaWFuX3ByaWNlYCAgICAgfCBRdWFudGl0YXRpdmEgfCBQcmV6em8gbWVkaWFubyBkaSB2ZW5kaXRhOiB1dGlsaXp6YWJpbGUgcGVyIGFuYWxpenphcmUgaWwgdmFsb3JlIGRlbCBtZXJjYXRvIG5lbCB0ZW1wbywgbmVsbG8gc3BhemlvIGUgcmlzcGV0dG8gYWQgYWx0cmkgaW5kaWNhdG9yaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgbGlzdGluZ3NgICAgICAgICAgfCBRdWFudGl0YXRpdmEgfCBOdW1lcm8gZGkgYW5udW5jaSBhdHRpdmk6IHZhcmlhYmlsZSB1dGlsaXp6YWJpbGUgcGVyIGFuYWxpenphcmUgbGEgY29ycmVsYXppb25lIHRyYSBhbm51bmNpIGUgdmVuZGl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBtb250aHNfaW52ZW50b3J5YCB8IFF1YW50aXRhdGl2YSB8IE1lc2kgbmVjZXNzYXJpIHBlciB2ZW5kZXJlIHR1dHRlIGxlIGNhc2UgZGlzcG9uaWJpbGk6IHZhcmlhYmlsZSB1dGlsaXp6YWJpbGUgcGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMgMi4gSW5kaWNpIGRpIHBvc2l6aW9uZSAtIEFuYWxpc2kgZGVsbGEgdmFyaWFiaWxpdMOgIGUgZGVsbCdhc2ltbWV0cmlhDQpDYWxjb2xhIEluZGljaSBkaSBwb3NpemlvbmUsIHZhcmlhYmlsaXTDoCBlIGZvcm1hIHBlciB0dXR0ZSBsZSB2YXJpYWJpbGkgcGVyIGxlIHF1YWxpIGhhIHNlbnNvIGZhcmxvLCBwZXIgbGUgYWx0cmUgY3JlYSB1bmEgZGlzdHJpYnV6aW9uZSBkaSBmcmVxdWVuemEuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIFNlbGV6aW9uYSBsZSB2YXJpYWJpbGkNCnZhcmlhYmlsaSA8LSBkYXRpICU+JQ0KICBzZWxlY3Qoc2FsZXMsIHZvbHVtZSwgbWVkaWFuX3ByaWNlLCBsaXN0aW5ncywgbW9udGhzX2ludmVudG9yeSkNCg0KIyBDYWxjb2xhIGdsaSBpbmRpY2kNCnRhYmVsbGFfdmFyIDwtIHRpYmJsZSgNCiAgVmFyaWFiaWxlID0gYygic2FsZXMiLCAidm9sdW1lIiwgIm1lZGlhbl9wcmljZSIsICJsaXN0aW5ncyIsICJtb250aHNfaW52ZW50b3J5IiksDQogIE1lZGlhID0gc2FwcGx5KHZhcmlhYmlsaSwgbWVhbiksDQogIERldmlhemlvbmVfU3RhbmRhcmQgPSBzYXBwbHkodmFyaWFiaWxpLCBzZCksDQogIENvZWZmX1ZhcmlhemlvbmUgPSBzYXBwbHkodmFyaWFiaWxpLCBzZCkgLyBzYXBwbHkodmFyaWFiaWxpLCBtZWFuKSwNCiAgTWluaW1vID0gc2FwcGx5KHZhcmlhYmlsaSwgbWluKSwNCiAgTWFzc2ltbyA9IHNhcHBseSh2YXJpYWJpbGksIG1heCksDQogIFNrZXduZXNzID0gc2FwcGx5KHZhcmlhYmlsaSwgc2tld25lc3MpLA0KICBLdXJ0b3NpcyA9IHNhcHBseSh2YXJpYWJpbGksIGt1cnRvc2lzKQ0KKSAlPiUNCiAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC54LCAyKSkpDQoNCiMgVmlzdWFsaXp6YSBsYSB0YWJlbGxhDQp0YWJlbGxhX3ZhciAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJUYWJlbGxhLSBJbmRpY2kgZGkgcG9zaXppb25lLCB2YXJpYWJpbGl0w6AgZSBhc2ltbWV0cmlhIHBlciB2YXJpYWJpbGkgcXVhbnRpdGF0aXZlIikgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImxlZnQiDQogICkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp0YWJsZV9jaXR0YSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGkkY2l0eSkpDQpjb2xuYW1lcyh0YWJsZV9jaXR0YSkgPC0gYygiQ2l0dMOgIiwgIk51bWVybyBkaSBvc3NlcnZhemlvbmkiKQ0KDQprYWJsZSh0YWJsZV9jaXR0YSwgY2FwdGlvbiA9ICJUYWJlbGxhLSBGcmVxdWVuemEgZGVsbGUgb3NzZXJ2YXppb25pIHBlciBjaXR0w6AiKQ0KYGBgDQoNCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIDMuIElkZW50aWZpY2F6aW9uZSBkZWxsZSB2YXJpYWJpbGkgY29uIG1hZ2dpb3JlIHZhcmlhYmlsaXTDoCBlIGFzaW1tZXRyaWENCkRldGVybWluYTogLSBRdWFsIMOoIGxhIHZhcmlhYmlsZSBjb24gbGEgcGnDuSBhbHRhIHZhcmlhYmlsaXTDoCAtIFF1YWwgw6ggbGEgdmFyaWFiaWxlIGNvbiBsYSBkaXN0cmlidXppb25lIHBpw7kgYXNpbW1ldHJpY2ENCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQoNCiMgUHJlcGFyYSBpIGRhdGkgaW4gZm9ybWF0byBsdW5nbw0KZGF0aV9sb25nIDwtIGRhdGkgJT4lDQogIHNlbGVjdChzYWxlcywgdm9sdW1lLCBtZWRpYW5fcHJpY2UsIGxpc3RpbmdzLCBtb250aHNfaW52ZW50b3J5KSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZhcmlhYmlsZSIsIHZhbHVlc190byA9ICJWYWxvcmUiKQ0KDQojIENhbGNvbGEgbGEgbWVkaWEgcGVyIG9nbmkgdmFyaWFiaWxlDQptZWRpZSA8LSBkYXRpX2xvbmcgJT4lDQogIGdyb3VwX2J5KFZhcmlhYmlsZSkgJT4lDQogIHN1bW1hcmlzZShNZWRpYSA9IG1lYW4oVmFsb3JlKSkNCg0KIyBDcmVhIGlsIGdyYWZpY28gY29uIGNvbG9yZSB1bmljbw0KZ2dwbG90KGRhdGlfbG9uZywgYWVzKHggPSBWYWxvcmUpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gImdyZXk2MCIsIGFscGhhID0gMC42LCBjb2xvciA9ICJncmV5MzAiLCBsaW5ld2lkdGggPSAxKSArDQogIGdlb21fdmxpbmUoZGF0YSA9IG1lZGllLCBhZXMoeGludGVyY2VwdCA9IE1lZGlhKSwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuOCkgKw0KICBmYWNldF93cmFwKH5WYXJpYWJpbGUsIHNjYWxlcyA9ICJmcmVlIiwgbmNvbCA9IDIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IE5VTEwpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJHcmFmaWNvIGRpc3RyaWJ1emlvbmUgZGVsbGUgdmFyaWFiaWxpIHF1YW50aXRhdGl2ZSIsDQogICAgeCA9ICIiLA0KICAgIHkgPSBOVUxMDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KYGBgDQoNCg0KDQoNCiMjIyBDb21tZW50aSBwdW50byAyIGUgcHVudG8gMzoNCg0KTGEgdmFyaWFiaWxlIGBjaXR5YCBwcmVzZW50YSB1bmEgZGlzdHJpYnV6aW9uZSB1bmlmb3JtZSwgY29uIGZyZXF1ZW56ZSBpZGVudGljaGUgcGVyIGNpYXNjdW5hIG1vZGFsaXTDoC5cYnINClF1ZXN0byBzdWdnZXJpc2NlIGNoZSBpbCBkYXRhc2V0IMOoIGJpbGFuY2lhdG8gcmlzcGV0dG8gYWxsYSByYXBwcmVzZW50YXppb25lIGRlbGxlIGNpdHTDoCBhbmFsaXp6YXRlLg0KDQpMYSB0YWJlbGxhICJJbmRpY2kgZGkgdmFyaWFiaWxpdMOgIiBlIGFzaW1tZXRyaWEgcGVyIHZhcmlhYmlsaSBxdWFudGl0YXRpdmUgbW9zdHJhIGludmVjZSBnbGkgaW5kaWNpIGRpIHZhcmlhYmlsaXTDoCBlIGRpIGZvcm1hIHBlciBjaW5xdWUgdmFyaWFiaWxpIHF1YW50aXRhdGl2ZSBkZWwgZGF0YXNldC4NCg0KLSAqKlZhcmlhYmlsaXTDoCoqOiBMZSB2YXJpYWJpbGkgYHZvbHVtZWAgZSBgbGlzdGluZ3NgIHByZXNlbnRhbm8gbGEgbWFnZ2lvcmUgZGlzcGVyc2lvbmUgcmVsYXRpdmEgKENWID0gMC41NCBlIDAuNDMpLCBpbmRpY2FuZG8gdW4nZWxldmF0YSBldGVyb2dlbmVpdMOgIHRyYSBsZSBvc3NlcnZhemlvbmkuIEFsIGNvbnRyYXJpbywgYG1lZGlhbl9wcmljZWAgcmlzdWx0YSBsYSBwacO5IHN0YWJpbGUgKENWID0gMC4xNyksIHN1Z2dlcmVuZG8gY2hlIGkgcHJlenppIG1lZGkgZGkgdmVuZGl0YSB2YXJpYW5vIG1lbm8gcmlzcGV0dG8gYWQgYWx0cmkgaW5kaWNhdG9yaS4NCg0KLSAqKkFzaW1tZXRyaWEgKFNrZXduZXNzKSoqOiBMZSB2YXJpYWJpbGkgYHNhbGVzYCwgYHZvbHVtZWAgZSBgbGlzdGluZ3NgIG1vc3RyYW5vIHVuYSAqKmFzaW1tZXRyaWEgcG9zaXRpdmEqKiwgY29uIHVuYSBjb2RhIHBpw7kgbHVuZ2EgdmVyc28gZGVzdHJhLiBRdWVzdG8gaW1wbGljYSBsYSBwcmVzZW56YSBkaSB2YWxvcmkgb2NjYXNpb25hbG1lbnRlIG1vbHRvIGVsZXZhdGkuIGBtZWRpYW5fcHJpY2VgIGhhIHVuYSAqKmFzaW1tZXRyaWEgbmVnYXRpdmEgbW9kZXJhdGEqKiAoLTAuMzYpLCBpbmRpY2FuZG8gdW5hIGxlZ2dlcmEgY29uY2VudHJhemlvbmUgZGkgdmFsb3JpIHBpw7kgYWx0aS4gYG1vbnRoc19pbnZlbnRvcnlgIMOoIHF1YXNpIHNpbW1ldHJpY2EgKHNrZXduZXNzIOKJiCAwKS4NCg0KLSAqKkZvcm1hIGRlbGxhIGRpc3RyaWJ1emlvbmUgKEt1cnRvc2lzKSoqOiBUdXR0ZSBsZSB2YXJpYWJpbGkgaGFubm8gdmFsb3JpIGRpIGt1cnRvc2lzIGNvbXByZXNpIHRyYSAyLjIgZSAzLjIsIHZpY2luaSBhIHF1ZWxsaSBkaSB1bmEgZGlzdHJpYnV6aW9uZSBub3JtYWxlIChrdXJ0b3NpcyA9IDMpLiBgdm9sdW1lYCBlIGBzYWxlc2Agc29ubyBsZWdnZXJtZW50ZSAqKmxlcHRvY3VydGljaGUqKiwgY29uIHVuYSBtYWdnaW9yZSBjb25jZW50cmF6aW9uZSBhdHRvcm5vIGFsbGEgbWVkaWEgZSBjb2RlIHBpw7kgcHJvbnVuY2lhdGUuXGJyDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCg0KIyMjIDQuIENyZWF6aW9uZSBkaSBjbGFzc2kgcGVyIHVuYSB2YXJpYWJpbGUgcXVhbnRpdGF0aXZhDQpTZWxlemlvbmEgdW5hIHZhcmlhYmlsZSBxdWFudGl0YXRpdmEgKGVzLiBzYWxlcyBvIG1lZGlhbl9wcmljZSkgZSBzdWRkaXZpZGlsYSBpbiBjbGFzc2kuIENyZWEgdW5hIGRpc3RyaWJ1emlvbmUgZGkgZnJlcXVlbnplIGUgcmFwcHJlc2VudGEgaSBkYXRpIGNvbiB1biBncmFmaWNvIGEgYmFycmUuIENhbGNvbGEgbOKAmWluZGljZSBkaSBldGVyb2dlbmVpdMOgIEdpbmkgZSBkaXNjdXRpIGkgcmlzdWx0YXRpLg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIFN1ZGRpdmlkZSAnc2FsZXMnIGluIGNsYXNzaQ0KYnJlYWtzIDwtIHByZXR0eShkYXRpJHNhbGVzLCBuID0gNCkNCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKHNhbGVzX2NsYXNzaSA9IGN1dChzYWxlcywgYnJlYWtzID0gYnJlYWtzLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIHJpZ2h0ID0gRkFMU0UpKQ0KDQojIENhbGNvbGEgbGEgZnJlcXVlbnphDQpmcmVxdWVuemUgPC0gZGF0aSAlPiUNCiAgY291bnQoc2FsZXNfY2xhc3NpKSAlPiUNCiAgbXV0YXRlKEZyZXF1ZW56YV9yZWxhdGl2YSA9IG4gLyBzdW0obikpDQoNCiMgR3JhZmljbyBhIGJhcnJlIGNvbiBldGljaGV0dGUNCmdncGxvdChmcmVxdWVuemUsIGFlcyh4ID0gc2FsZXNfY2xhc3NpLCB5ID0gbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZ3JleSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjMsIHNpemUgPSA0KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGlzdHJpYnV6aW9uZSBkZWxsZSB2ZW5kaXRlIFtzYWxlc10gcGVyIGNsYXNzaSIsDQogICAgeCA9ICJDbGFzc2kgZGkgc2FsZXMiLA0KICAgIHkgPSAiRnJlcXVlbnphIGFzc29sdXRhIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBmdW56aW9uZSBjYWxjb2xvIGluZGljZSBHaW5pDQpnaW5pLmluZGV4IDwtIGZ1bmN0aW9uKHgpIHsNCiAgeCA8LSBzb3J0KHgpICAgICAgICAgICAgICAjIE9yZGluYSBpIHZhbG9yaQ0KICBuIDwtIGxlbmd0aCh4KSAgICAgICAgICAgICMgTnVtZXJvIGRpIG9zc2VydmF6aW9uaQ0KICBHIDwtIHN1bSgoMiAqIDE6biAtIG4gLSAxKSAqIHgpIC8gKG4gKiBzdW0oeCkpICAjIEZvcm11bGEgR2luaQ0KICByZXR1cm4oRykNCn0NCg0KYGBgDQoNCkNhbGNvbGEgbOKAmWluZGljZSBkaSBldGVyb2dlbmVpdMOgIEdpbmkNCmBgYHtyIGVjaG89RkFMU0V9DQpnaW5pX3NhbGVzIDwtIGdpbmkuaW5kZXgoZGF0aSRzYWxlcykNCmNhdCgiR2luaSBpbmRleCBzYWxlcyA9Iiwgcm91bmQoZ2luaV9zYWxlcywgNCksICJcbiIpDQoNCmBgYA0KDQpDb21tZW50aTpcYnINCg0KVW4gdmFsb3JlIGRpIEdpbmkgcGFyaSBhIDAuMjMxMSBpbmRpY2EgdW5hIGRpc3VndWFnbGlhbnphIG1vZGVyYXRhLWJhc3NhIG5lbGxhIGRpc3RyaWJ1emlvbmUgZGVsbGUgdmVuZGl0ZS4gUXVlc3RvIHNpZ25pZmljYSBjaGUsIHB1ciBlc2lzdGVuZG8gZGlmZmVyZW56ZSB0cmEgbGUgb3NzZXJ2YXppb25pLCBsYSBtYWdnaW9yIHBhcnRlIGRlaSB2YWxvcmkgZGkgc2FsZXMgc2kgY29uY2VudHJhIGluIHVuIGludGVydmFsbG8gcmVsYXRpdmFtZW50ZSBvbW9nZW5lby4gTG8gY29uZmVybWEgYW5jaGUgaWwgZ3JhZmljbyBhIGJhcnJlOiBsYSBjbGFzc2UgKDEwMCwyMDApIGRvbWluYSBuZXR0YW1lbnRlLCBtZW50cmUgbGUgY2xhc3NpIGVzdHJlbWUgc29ubyBwb2NvIHJhcHByZXNlbnRhdGUuDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCg0KIyMjIDUuIENhbGNvbG8gZGVsbGEgcHJvYmFiaWxpdMOgDQoNClF1YWwgw6ggbGEgcHJvYmFiaWxpdMOgIGNoZSwgcHJlc2EgdW5hIHJpZ2EgYSBjYXNvIGRpIHF1ZXN0byBkYXRhc2V0LCBlc3NhIHJpcG9ydGkgbGEgY2l0dMOgIOKAnEJlYXVtb2504oCdPyBFIGxhIHByb2JhYmlsaXTDoCBjaGUgcmlwb3J0aSBpbCBtZXNlIGRpIEx1Z2xpbz8gRSBsYSBwcm9iYWJpbGl0w6AgY2hlIHJpcG9ydGkgaWwgbWVzZSBkaSBkaWNlbWJyZSAyMDEyPw0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQojIE51bWVybyB0b3RhbGUgZGkgcmlnaGUNCm5fdG90YWxlIDwtIG5yb3coZGF0aSkNCg0KIyBQcm9iYWJpbGl0w6AgY2hlIGxhIGNpdHTDoCBzaWEgIkJlYXVtb250Ig0KcF9iZWF1bW9udCA8LSBzdW0oZGF0aSRjaXR5ID09ICJCZWF1bW9udCIpIC8gbl90b3RhbGUgKjEwMA0KDQojIFByb2JhYmlsaXTDoCBjaGUgaWwgbWVzZSBzaWEgTHVnbGlvIChtZXNlIDcpDQpwX2x1Z2xpbyA8LSBzdW0oZGF0aSRtb250aCA9PSA3KSAvIG5fdG90YWxlICogMTAwDQoNCiMgUHJvYmFiaWxpdMOgIGNoZSBpbCBtZXNlIHNpYSBkaWNlbWJyZSAyMDEyDQpwX2RpY2VtYnJlXzIwMTIgPC0gc3VtKGRhdGkkbW9udGggPT0gMTIgJiBkYXRpJHllYXIgPT0gMjAxMikgLyBuX3RvdGFsZSAqMTAwDQoNCiMgU3RhbXBhIGRlaSByaXN1bHRhdGkNCmNhdCgiUHJvYmFiaWxpdMOgIGNoZSBsYSBjaXR0w6Agc2lhIEJlYXVtb250ID0iLCByb3VuZChwX2JlYXVtb250LCAxKSwgIiVcbiIpDQpjYXQoIlByb2JhYmlsaXTDoCBjaGUgaWwgbWVzZSBzaWEgTHVnbGlvID0iLCByb3VuZChwX2x1Z2xpbywgMSksICIlXG4iKQ0KY2F0KCJQcm9iYWJpbGl0w6AgY2hlIGlsIG1lc2Ugc2lhIGRpY2VtYnJlIDIwMTIgPSIsIHJvdW5kKHBfZGljZW1icmVfMjAxMiwgMSksICIlXG4iKQ0KDQoNCmBgYA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCiMjIDYuIENyZWF6aW9uZSBkaSBudW92ZSB2YXJpYWJpbGkNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkYXRpIDwtIGRhdGkgJT4lDQogIG11dGF0ZShkYXRlID0gbWFrZV9kYXRlKHllYXIsIG1vbnRoLCAxKSkNCmBgYA0KDQoNCg0KQ3JlYSB1bmEgbnVvdmEgY29sb25uYSBjaGUgY2FsY29saSBpbCBwcmV6em8gbWVkaW8gZGVnbGkgaW1tb2JpbGkgdXRpbGl6emFuZG8gbGUgdmFyaWFiaWxpIGRpc3BvbmliaWxpXGJyDQoNCkxhIHNlZ3VlbnRlIHRhYmVsbGEgbW9zdHJhIGkgcHJpbWkgNSByZWNvcmQgZGVsbGEgbnVvdmEgY29sb25uYSBgcHJlenpvX21lZGlvYGRlbCBkYXRhZnJhbWUgY2hlIGNvbnRpZW5lIHByZXp6b19tZWRpbyA9IHZvbHVtZS9zYWxlcw0KYGBge3IgZWNobz1GQUxTRX0NCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKHByZXp6b19tZWRpbyA9IHJvdW5kKCh2b2x1bWUgLyBzYWxlcykgKiAxZTYsMCkpDQpkYXRpICU+JQ0KICBzZWxlY3QocHJlenpvX21lZGlvKSAlPiUNCiAgaGVhZCg1KSAlPiUNCiAga2FibGUoYWxpZ24gPSAibCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkNCg0KYGBgDQoNCg0KDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KUHJvdmEgYSBjcmVhcmUgdW5hIGNvbG9ubmEgY2hlIG1pc3VyaSBs4oCZZWZmaWNhY2lhIGRlZ2xpIGFubnVuY2kgZGkgdmVuZGl0YS4gQ29tbWVudGEgZSBkaXNjdXRpIGkgcmlzdWx0YXRpDQpMYSBzZWd1ZW50ZSB0YWJlbGxhIG1vc3RyYSBpIHByaW1pIDUgcmVjb3JkIGRlbGxhIG51b3ZhIGNvbG9ubmEgYGVmZmljYWNpYV9hbm51bmNpb2AgZGVsIGRhdGFmcmFtZSBjaGUgY29udGllbnRlIGlsIHByZXp6b19tZWRpbyA9IHZvbHVtZS9zYWxlcw0KDQpRdWVzdGEgbWV0cmljYSBpbmRpY2EgcXVhbnRpIGltbW9iaWxpIHNvbm8gc3RhdGkgdmVuZHV0aSByaXNwZXR0byBhbCBudW1lcm8gZGkgYW5udW5jaSBhdHRpdmkuIEluIGFsdHJlIHBhcm9sZToNCg0KVmFsb3JpIHZpY2luaSBhIDEg4oaSIHF1YXNpIG9nbmkgYW5udW5jaW8gaGEgcG9ydGF0byBhIHVuYSB2ZW5kaXRhIOKGkiBtb2x0byBlZmZpY2FjZQ0KDQpWYWxvcmkgPCAxIOKGkiBub24gdHV0dGkgZ2xpIGFubnVuY2kgaGFubm8gZ2VuZXJhdG8gdmVuZGl0ZSDihpIgbWVubyBlZmZpY2FjZQ0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKGVmZmljYWNpYV9hbm51bmNpbyA9IGlmZWxzZShsaXN0aW5ncyA+IDAsIHNhbGVzIC8gbGlzdGluZ3MsIE5BKSkNCmRhdGkgJT4lDQogIHNlbGVjdChlZmZpY2FjaWFfYW5udW5jaW8pICU+JQ0KICBoZWFkKDUpICU+JQ0KICBrYWJsZShhbGlnbiA9ICJsIikgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KDQpgYGANCg0KQ29sb25uYSBjcmVhdGEgbmVsIGRhdGFzZXQgY29tZSBkYSBpbW1hZ2luZS4gXGJyDQoNCkxhIG51b3ZhIHZhcmlhYmlsZSDDqCBzdGF0YSBzdWJpdG8gdXRpbGl6emF0YSBwZXIgY3JlYXJlIGlsIGdyYWZpY28gImVmZmljYWNpYSBkZWdsIGFubnVuY2kgcGVyIGNpdHTDoCIuDQoNCg0KSWwgc2VndWVudGUgZ3JhZmljbyBkZWxsJ2VmZmljYWNpYSBkZWdsaSBhbm51bmNpIHBlciBjaXR0w6AgbW9zdHJhIGluZmF0dGkgY29tZSBnbGkgYW5udW5jaSBzaWFubyBtZWRpYW1lbnRlIHBpw7kgZWZmaWNhY2kgbmVsbGEgY2l0dMOgIGRpIGBCcnlhbi1Db2xsYWdlIFN0YXRpb25gDQpgYGB7ciBlY2hvPUZBTFNFIH0NCg0KZ2dwbG90KGRhdGksIGFlcyh4ID0gY2l0eSwgeSA9IGVmZmljYWNpYV9hbm51bmNpbykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkVmZmljYWNpYSBkZWdsaSBhbm51bmNpIHBlciBjaXR0w6AiLCB5ID0gIlZlbmRpdGUgLyBBbm51bmNpIikNCg0KYGBgDQoNCg0KDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyA3LiBBbmFsaXNpIGNvbmRpemlvbmF0YQ0KDQoNClVzYSBpbCBwYWNjaGV0dG8gZHBseXIgbyBpbCBsaW5ndWFnZ2lvIGJhc2UgZGkgUiBwZXIgZWZmZXR0dWFyZSBhbmFsaXNpIHN0YXRpc3RpY2hlIGNvbmRpemlvbmF0ZSBwZXIgY2l0dMOgLCBhbm5vIGUgbWVzZS4gR2VuZXJhIGRlaSBzdW1tYXJ5IChtZWRpYSwgZGV2aWF6aW9uZSBzdGFuZGFyZCkgZSByYXBwcmVzZW50YSBncmFmaWNhbWVudGUgaSByaXN1bHRhdGkuDQoNCg0KIyMjIyA3LjEgU3RhdGlzdGljaGUgY29uZGl6aW9uYXRlIHBlciBjaXR0w6ANCg0KDQotLUlsIGdyYWZpY28gbWV0dGUgYSBjb25mcm9udG8gaWwgcHJlenpvIG1lZGlvIHBlciBvZ25pIENpdHTDoC4gTGEgY2l0dMOgIGRpIGBCcnlhbi1Db2xsZWdlIFN0YXRpb25gIHJpc3VsdGEgbGEgY2l0dMOgIGNvbiBpbCBwcmV6em8gbWVkaW8gcGnDuSBhbHRvLlxicg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Kc3RhdGlzdGljaGVfY2l0dGEgPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkoY2l0eSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX3ByaWNlID0gbWVhbihtZWRpYW5fcHJpY2UpLCBzZF9wcmljZSA9IHNkKG1lZGlhbl9wcmljZSkpDQoNCnByaW50KHN0YXRpc3RpY2hlX2NpdHRhKQ0KDQpnZ3Bsb3Qoc3RhdGlzdGljaGVfY2l0dGEsIGFlcyh4ID0gcmVvcmRlcihjaXR5LCBtZWFuX3ByaWNlKSwgeSA9IG1lYW5fcHJpY2UpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImdyZXkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiR3JhZmljbyBwcmV6em8gbWVkaW8gcGVyIGNpdHTDoCIsDQogICAgeCA9ICJDaXR0w6AiLA0KICAgIHkgPSAiUHJlenpvIG1lZGlvIg0KICApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KYGBgDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMjIDcuMiBTdGF0aXN0aWNoZSBjb25kaXppb25hdGUgcGVyIGFubm8NCg0KLS1JbCBncmFmaWNvIG1vc3RyYSBsJ2FuZGFtZW50byBkZWwgcHJlenpvIG1lZGlvIHN1IGJhc2UgYW5udWEuXGJyDQoNCkwnYW5kYW1lbnRvIHN1YmlzY2UgdW4gcmliYXNzbyBkYWwgMjAxMCBhbCAyMDExIHBlciBwb2kgcmlwcmVuZGVyZSBpbiBjcmVzY2VudGUgZmlubyBhbCBgMjAxNGBcYnINCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Kc3RhdGlzdGljaGVfYW5ubyA8LSBkYXRpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcHJpY2UgPSBtZWFuKG1lZGlhbl9wcmljZSksIHNkX3ByaWNlID0gc2QobWVkaWFuX3ByaWNlKSkNCg0KcHJpbnQoc3RhdGlzdGljaGVfYW5ubykNCg0KDQpnZ3Bsb3Qoc3RhdGlzdGljaGVfYW5ubywgYWVzKHggPSB5ZWFyLCB5ID0gbWVhbl9wcmljZSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyYXkiLCBzaXplID0gMS4yKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzJjN2ZiOCIsIHNpemUgPSAyKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtZWFuX3ByaWNlLCAwKSksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMuNSkrDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiR3JhZmljbyBwcmV6em8gbWVkaW8gcGVyIGFubm8iLA0KICAgIHggPSAiQW5ubyIsDQogICAgeSA9ICJQcmV6em8gbWVkaW8iDQogICkNCg0KDQoNCmBgYA0KDQoNCg0KDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMjIDcuMyBTdGF0aXN0aWNoZSBjb25kaXppb25hdGUgcGVyIG1lc2UNCg0KLS1JbCBncmFmaWNvIG1vc3RyYSBsJ2FuZGFtZW50byBkZWwgcHJlenpvIG1lZGlvIHN1IGJhc2UgbWVuc2lsZSBwZXIgZXZpZGVuemlhcmUgdW5hICJ2YXJpYXppb25lIHN0YWdpb25hbGUiXGJyDQoNCklsIGdyYWZpY28gbW9zdHJhIHVuIHRyZW5kIGFsIHJpYWx6byBkZWwgcHJlenppIG1lZGkgYSBwYXJ0aXJlIGRhIEFwcmlsZS4gSSBtZXNpIGluaXppYWxpIHNvbm8gcXVlbGxpIGNvbiBpbCBwcmV6em8gbWVkaW8gaW5mZXJpb3JlIHJpc3BldHRvIG5lbGwnYW5uby5cYnINCg0KKipHaXVnbm8qKiDDqCBpbCBtZXNlIGNvbiBpbCBwaWNjbyBkaSBwcmV6em8gbWVkaW8gcMO5IGFsdG8NCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCnN0YXRpc3RpY2hlX21lc2UgPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkobW9udGgsIG1vbnRoX25hbWUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9wcmljZSA9IG1lYW4obWVkaWFuX3ByaWNlLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkX3ByaWNlID0gc2QobWVkaWFuX3ByaWNlLCBuYS5ybSA9IFRSVUUpDQogICkgJT4lDQogIGFycmFuZ2UobW9udGgpDQoNCnByaW50KHN0YXRpc3RpY2hlX21lc2UpDQoNCmdncGxvdChzdGF0aXN0aWNoZV9tZXNlLCBhZXMoeCA9IGZhY3Rvcihtb250aF9uYW1lLCBsZXZlbHMgPSBtb250aC5uYW1lKSwgeSA9IG1lYW5fcHJpY2UsIGdyb3VwID0gMSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyYXkiLCBzaXplID0gMS4yKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzJjN2ZiOCIsIHNpemUgPSAyKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHJlenpvIG1lZGlvIHBlciBtZXNlIiwNCiAgICB4ID0gIk1vbnRoIiwNCiAgICB5ID0gIlByZXp6byBtZWRpbyINCiAgKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCg0KYGBgDQoNCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCiMjIDguIENyZWF6aW9uZSBkaSB2aXN1YWxpenphemlvbmkgY29uIGdncGxvdDINCg0KDQojIyMgVmlzdWFsIDE6IENvbmZyb250byB2b2x1bWUgZmF0dHVyYXRvIGRlcml2YW50ZSBkYWxsZSB2ZW5kaXRlIChZb1kpDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCnZlbmRpdGVfYW5udWFsaSA8LSBkYXRpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKHZvbHVtZV9taWxpb25pID0gc3VtKHNhbGVzLCBuYS5ybSA9IFRSVUUpKQ0KDQpnZ3Bsb3QodmVuZGl0ZV9hbm51YWxpLCBhZXMoeCA9IGZhY3Rvcih5ZWFyKSwgeSA9IHZvbHVtZV9taWxpb25pKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmF5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodm9sdW1lX21pbGlvbmksIDEpKSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlZvbHVtZSB2ZW5kaXRlIGFubnVhbGkgKG1pbGlvbmkgZGkgJCkiLA0KICAgIHggPSAiQW5ubyIsDQogICAgeSA9ICJWb2x1bWUgdG90YWxlIChtaWxpb25pIGRpICQpIg0KICApDQoNCmBgYA0KDQoNCmlsICoqMjAxNCoqIMOoIGwnYW5ubyBjb24gaWwgdm9sdW1lIHBpw7kgYWx0byBkaSB2ZW5kaXRlIGVzcHJlc3NlIGluIG1pbGlvbmkgZGkgZG9sbGFyaQ0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KIyMjIFZpc3VhbCAyOiBDb25mcm9udG8gZGVsbGUgdmVuZGl0ZSBNb00gKGZpbHRyYWJpbGUgcGVyIGFubm8pDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmRhdGkgPC0gZGF0aSAlPiUNCiAgbXV0YXRlKA0KICAgIG1vbnRoX25hbWUgPSBmYWN0b3IobW9udGgubmFtZVttb250aF0sIGxldmVscyA9IG1vbnRoLm5hbWUpLA0KICAgIHllYXIgPSBhcy5jaGFyYWN0ZXIoeWVhcikNCiAgKQ0KDQpzaGFyZWRfZGF0aSA8LSBTaGFyZWREYXRhJG5ldyhkYXRpKQ0KDQpic2NvbHMoDQogIHdpZHRocyA9IGMoNiwgMTIpLA0KICBmaWx0ZXJfc2VsZWN0KCJhbm5vIiwgIlNlbGV6aW9uYSBhbm5vOiIsIHNoYXJlZF9kYXRpLCB+eWVhciksDQogIHBsb3RfbHkoc2hhcmVkX2RhdGksIHggPSB+bW9udGhfbmFtZSwgeSA9IH5zYWxlcywgdHlwZSA9ICJiYXIiLA0KICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiZ3JheSIpKSAlPiUNCiAgICBsYXlvdXQodGl0bGUgPSAiVG90YWxlIHZlbmRpdGUgbWVuc2lsaSIsIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNZXNlIiwgdGlja2FuZ2xlID0gNDUpKQ0KKQ0KYGBgDQoNCklsIGdyYWZpY28gbW9zdHJhIGNoZSAqKm5laSBtZXNpIGNlbnRyYWxpIGRlbGwnYW5ubyoqIHNvbm8gY29uY2VudHJhdGUgcGnDuSB2ZW5kaXRlLg0KKipHaXVnbm8qKiDDqCBpbCBtZXNlIFRvcC4gKipHZW5uYWlvKiogaWwgbWVzZSBwZWdnaW9yZQ0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIyMgVmlzdWFsIDM6IEFuZGFtZW50byBkZWxsZSB2ZW5kaXRlIHBlciBjaXR0w6AgZSBuZWwgdGVtcG8NCg0KSWwgZ3JhZmljbyBtb3N0cmEgY2hlICoqVHlsZXIqKiDDqCBsYSB0b3AgY2l0eSBwZXIgdmVuZGl0ZSBkaSBzZW1wcmUNCmBgYHtyfQ0KdmVuZGl0ZV9wZXJfY2l0dGEgPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkoY2l0eSkgJT4lDQogIHN1bW1hcmlzZSh2ZW5kaXRlX3RvdGFsaSA9IHN1bShzYWxlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGFycmFuZ2UoZGVzYyh2ZW5kaXRlX3RvdGFsaSkpDQoNCmdncGxvdCh2ZW5kaXRlX3Blcl9jaXR0YSwgYWVzKHggPSByZW9yZGVyKGNpdHksIHZlbmRpdGVfdG90YWxpKSwgeSA9IHZlbmRpdGVfdG90YWxpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmF5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodmVuZGl0ZV90b3RhbGksIDApKSwgaGp1c3QgPSAxLjksIGNvbG9yID0gIndoaXRlIiwgZm9udGZhY2UgPSAiYm9sZCIpKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRvdGFsZSB2ZW5kaXRlIHBlciBjaXR0w6AiLA0KICAgIHggPSAiQ2l0dMOgIiwNCiAgICB5ID0gIlRvdGFsZSB2ZW5kaXRlIg0KICApICsNCiAgY29vcmRfZmxpcCgpDQoNCg0KYGBgDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KDQojIyMgVmlzdWFsIDQ6IEFuZGFtZW50byBkZWxsZSB2ZW5kaXRlIHBlciBjaXR0w6AgZSBuZWwgdGVtcG8NCklsIGdyYWZpY28gaW50ZXJhdHRpdm8gbW9zdHJhIGwnYW5kYW1lbnRvIGRlbGxlIHZlbmRpdGUgcGVyIGNpdHTDoCBuZWwgdGVtcG8gZWQgZWZmZXR0dWFyZSBldmVudHVhbGkgcHJldmlzaW9uaSBmdXR1cmVcYnINCg0KTGEgY2l0dMOgIGRpICoqVHlsZXIqKiBzdG9yaWNhbWVudGUgw6ggcXVlbGxhIGNvbiB2ZW5kaXRlIG1hZ2dpb3JpIGFuY2hlIHNlIHN1cGVyYXRhIG5lbCBMdWdsaW8gMjAxMyBkYSAqKkJyeWFuLUNvbGxhZ2UgU3RhdGlvbioqDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIENyZWEgdW4gb2dnZXR0byBjb25kaXZpc28gcGVyIGludGVyYXR0aXZpdMOgDQpzaGFyZWRfZGF0aSA8LSBTaGFyZWREYXRhJG5ldyhkYXRpKQ0KDQojIEZpbHRybyBpbnRlcmF0dGl2byBwZXIgY2l0dMOgDQpic2NvbHMoDQogIHdpZHRocyA9IGMoNiwgMTIpLA0KICBmaWx0ZXJfc2VsZWN0KCJjaXR5IiwgIlNlbGV6aW9uYSBjaXR0w6A6Iiwgc2hhcmVkX2RhdGksIH5jaXR5KSwNCiAgcGxvdF9seShzaGFyZWRfZGF0aSwgeCA9IH5kYXRlLCB5ID0gfnNhbGVzLCBjb2xvciA9IH5jaXR5LCB0eXBlID0gInNjYXR0ZXIiLCBtb2RlID0gImxpbmVzIikgJT4lDQogICAgbGF5b3V0KHRpdGxlID0gIkFuZGFtZW50byB2ZW5kaXRlIG5lbCB0ZW1wbyBwZXIgY2l0dMOgIikNCikNCmBgYA0KDQoNCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIFZpc3VhbCA1OiBBbmRhbWVudG8gZGVsbGUgdmVuZGl0ZSBwZXIgY2l0dMOgIHN1IGJhc2UgbWVuc2lsZQ0KSWwgZ3JhZmljbyBpbnRlcmF0dGl2byBtb3N0cmEgbGEgZGlzdHJpYnV6aW9uZSBkZWwgdG90YWxlIHZlbmRpdGUgZGVsbGUgY2l0dMOgIHN1IGJhc2UgbWVuc2lsZQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGF0aSA8LSBkYXRpICU+JQ0KICBtdXRhdGUoeWVhciA9IGFzLmludGVnZXIoeWVhcikpDQoNCnNoYXJlZF9kYXRpIDwtIFNoYXJlZERhdGEkbmV3KGRhdGkgJT4lIG11dGF0ZSh5ZWFyID0gYXMuaW50ZWdlcih5ZWFyKSkpDQoNCg0KIyBGaWx0cm8gcGVyIGFubm8gKyBncmFmaWNvIHN0YWNrZWQNCmJzY29scygNCiAgd2lkdGhzID0gYyg2LCAxMiksDQogIGZpbHRlcl9zZWxlY3QoImFubm8iLCAiU2VsZXppb25hIGFubm86Iiwgc2hhcmVkX2RhdGksIH55ZWFyKSwNCiAgcGxvdF9seShzaGFyZWRfZGF0aSwgeCA9IH5tb250aF9uYW1lLCB5ID0gfm1lZGlhbl9wcmljZSwgY29sb3IgPSB+Y2l0eSwgdHlwZSA9ICJiYXIiKSAlPiUNCiAgICBsYXlvdXQoYmFybW9kZSA9ICJzdGFjayIsIHRpdGxlID0gIlRvdGFsZSB2ZW5kaXRlIG1lbnNpbGkgcGVyIGNpdHTDoCIpDQopDQpgYGANCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCg0KIyMjIFZpc3VhbCA2OiBBbmRhbWVudG8gcHJlenpvIG1lZGlvIG5lbCB0ZW1wbyAoZmlsdHJhYmlsZSBwZXIgYW5ubykNCg0KSWwgZ3JhZmljbyBpbnRlcmF0dGl2byBtb3N0cmEgaWwgdHJlbmQgZGVsIHByZXp6byBtZWRpbyBuZWwgdGVtcG8gcGVyIGluZGl2aWR1YXJlIGNhbGkgbyBhdW1lbnRpIG5lbCBwZXJpb2RvIGVkIGVmZmV0dHVhcmUgZXZlbnR1YWxpIHByZXZpc2lvbmkgZnV0dXJlDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCiMgQ3JlYSB1biBvZ2dldHRvIGNvbmRpdmlzbyBwZXIgaW50ZXJhdHRpdml0w6ANCnNoYXJlZF9kYXRpIDwtIFNoYXJlZERhdGEkbmV3KGRhdGkpDQoNCiMgRmlsdHJvIGludGVyYXR0aXZvIHBlciBjaXR0w6ANCmJzY29scygNCiAgd2lkdGhzID0gYyg2LCAxMiksDQogIGZpbHRlcl9zZWxlY3QoImNpdHkiLCAiU2VsZXppb25hIGNpdHTDoDoiLCBzaGFyZWRfZGF0aSwgfmNpdHkpLA0KICBwbG90X2x5KHNoYXJlZF9kYXRpLCB4ID0gfmRhdGUsIHkgPSB+cHJlenpvX21lZGlvLCBjb2xvciA9IH5jaXR5LCB0eXBlID0gInNjYXR0ZXIiLCBtb2RlID0gImxpbmVzIikgJT4lDQogICAgbGF5b3V0KHRpdGxlID0gIkFuZGFtZW50byBwcmV6em8gbWVkaW8gbmVsIHRlbXBvIikNCikNCmBgYA0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMjIFZpc3VhbCA3OiBDb25mcm9ubyBwcmV6em8gbWVkaW8gcGVyIGNpdHTDoA0KSWwgZ3JhZmljbyBtZXR0ZSBhIGNvbmZyb250byBpbCBwcmV6em8gbWVkaW8gZGVsbGUgY2l0dMOgLlxicg0KDQoqKkJyeWFuLUNvbGxhZ2UgU3RhdGlvbioqIHJpc3VsdGEgbGEgY2l0dMOgIGNvbiBpbCBwcmV6em8gbWVkaW8gcGnDuSBhbHRvDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0aSwgYWVzKHggPSBjaXR5LCB5ID0gcHJlenpvX21lZGlvKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9IE5BLCBjb2xvciA9ICJncmF5MzAiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHJlenpvIG1lZGlvIHBlciBjaXR0w6AiLA0KICAgIHggPSAiQ2l0dMOgIiwNCiAgICB5ID0gIlByZXp6byBtZWRpbyAoaW4gJCkiDQogICkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQpgYGANCg0KDQoNCiMjIyBWaXN1YWwgODogQ29ycmVsYXppb25lIHRyYSBsZSB2YXRpYWJpbGkgYW5udW5jaSBlIHZlbmRpdGUgZGkgY2FzYVxicg0KDQpDJ8OoIHVuYSByZWxhemlvbmUgcG9zaXRpdmEgdHJhIGFubnVuY2kgZSB2ZW5kaXRlOiBwacO5IGFubnVuY2ksIHBpw7kgdmVuZGl0ZSAuXGJyDQoNCklsIHZhbG9yZSByID0gMC42MiBpbmRpY2EgdW5hIGJ1b25hIGNvcnJlbGF6aW9uZSwgbWEgbm9uIHBlcmZldHRhXGJyDQoNCklsIHAtdmFsdWUgbW9sdG8gYmFzc28gY29uZmVybWEgY2hlIGxhIGNvcnJlbGF6aW9uZSBub24gw6ggZG92dXRhIGFsIGNhc28NCg0KYGBge3IgZWNobz1GQUxTRX0NCmdncGxvdChkYXRpLCBhZXMoeCA9IGxpc3RpbmdzLCB5ID0gc2FsZXMpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzJjN2ZiOCIsIHNpemUgPSAyLCBhbHBoYSA9IDAuNikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJncmF5NDAiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29ycmVsYXppb25lIHRyYSBhbm51bmNpIGF0dGl2aSBlIHZlbmRpdGUgZGkgY2FzZSIsDQogICAgeCA9ICJBbm51bmNpIGF0dGl2aSIsDQogICAgeSA9ICJWZW5kaXRlIGRpIGNhc2UiDQogICkNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpjb3IudGVzdChkYXRpJGxpc3RpbmdzLCBkYXRpJHNhbGVzKQ0KDQpgYGANCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyMgQWRkLW9uIGluc2lnaHQNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KdGVtcG9fbWVkaW9fdmVuZGl0YSA8LSBtZWFuKGRhdGkkbW9udGhzX2ludmVudG9yeSwgbmEucm0gPSBUUlVFKQ0KY2F0KCLij7HvuI8gSWwgdGVtcG8gbWVkaW8gcGVyIHZlbmRlcmUgbGUgaW5zZXJ6aW9uaSDDqDoiLCByb3VuZCh0ZW1wb19tZWRpb192ZW5kaXRhLCAyKSwgIm1lc2lcbiIpDQoNCmBgYA0KTmVsbGEgY2l0dMOgIGRpIFR5bGVyIG1lZGlhbWVudGUgc2kgaW1waWVnYSBwacO5IHRlbXBvIGEgdmVuZGVyZSBnbGkgaW1tb2JpbGkgKDExLjMgbWVzaSksIG1lbnRyZSAqKkJyeWFuLUNvbGxhZ2UgU3RhdGlvbioqIMOoIHF1ZWxsYSBjb24gbWVkaWFtZW50ZSBtaW5vciB0ZW1wbyg3LjUgbWVzaSkgIC4gDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkYXRpICU+JQ0KICBncm91cF9ieShjaXR5KSAlPiUNCiAgc3VtbWFyaXNlKHRlbXBvX21lZGlvID0gbWVhbihtb250aHNfaW52ZW50b3J5LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRlbXBvX21lZGlvKSkNCg0KYGBgDQpgYGB7cn0NCiMgQ2FsY29sbyBkZWwgdGVtcG8gbWVkaW8gcGVyIGNpdHTDoA0KdGVtcG9fbWVkaW8gPC0gZGF0aSAlPiUNCiAgZ3JvdXBfYnkoY2l0eSkgJT4lDQogIHN1bW1hcmlzZSh0ZW1wb19tZWRpb19tZXNpID0gbWVhbihtb250aHNfaW52ZW50b3J5LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRlbXBvX21lZGlvX21lc2kpKQ0KDQojIEdyYWZpY28gYSBiYXJyZSBvcml6em9udGFsaQ0KZ2dwbG90KHRlbXBvX21lZGlvLCBhZXMoeCA9IHJlb3JkZXIoY2l0eSwgdGVtcG9fbWVkaW9fbWVzaSksIHkgPSB0ZW1wb19tZWRpb19tZXNpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmF5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodGVtcG9fbWVkaW9fbWVzaSwgMikpLCBoanVzdCA9IDEuMSwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDMuNSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRlbXBvIG1lZGlvIGRpIHZlbmRpdGEgcGVyIGNpdHTDoCIsDQogICAgeCA9ICJDaXR0w6AiLA0KICAgIHkgPSAiVGVtcG8gbWVkaW8gKG1lc2kpIg0KICApICsNCiAgY29vcmRfZmxpcCgpDQoNCg0KYGBgDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQojIENvbmNsdXNpb25pIGZpbmFsaSBkZWwgcHJvZ2V0dG86DQoNCg0KLSBgZGF0YSBzZXRgDQogIC0gKipEaXN0cmlidXppb25lKio6IGlsIGRhdGEgc2V0IG9nZ2V0dG8gZGkgYW5hbGlzaSDDqCBlcXVhbWVudGUgYmlsYW5jaWF0by4gSSBkYXRpIG9zc2VydmFiaWxpIHNvbm8gbnVtZXJpY2FtZW50ZSBlcXVpIHBlciBvZ25pIGNpdHTDoA0KICAtICoqVmFyaWFiaWxpdMOgKio6IExlIHZhcmlhYmlsaSB2b2x1bWUgZSBsaXN0aW5ncyBwcmVzZW50YW5vIGxhIG1hZ2dpb3JlIGRpc3BlcnNpb25lIHJlbGF0aXZhIChDViA9IDAuNTQgZSAwLjQzKSwgaW5kaWNhbmRvIHVu4oCZZWxldmF0YSBldGVyb2dlbmVpdMOgIHRyYSBsZSBvc3NlcnZhemlvbmkuIEFsIGNvbnRyYXJpbywgbWVkaWFuX3ByaWNlIHJpc3VsdGEgbGEgcGnDuSBzdGFiaWxlIChDViA9IDAuMTcpLCBzdWdnZXJlbmRvIGNoZSBpIHByZXp6aSBtZWRpIGRpIHZlbmRpdGEgdmFyaWFubyBtZW5vIHJpc3BldHRvIGFkIGFsdHJpIGluZGljYXRvcmkNCiAgLSAqKkFzaW1tZXRyaWEqKiAoU2tld25lc3MpOiBMZSB2YXJpYWJpbGkgc2FsZXMsIHZvbHVtZSBlIGxpc3RpbmdzIG1vc3RyYW5vIHVuYSBhc2ltbWV0cmlhIHBvc2l0aXZhLCBjb24gdW5hIGNvZGEgcGnDuSBsdW5nYSB2ZXJzbyBkZXN0cmEuIFF1ZXN0byBpbXBsaWNhIGxhIHByZXNlbnphIGRpIHZhbG9yaSBvY2Nhc2lvbmFsbWVudGUgbW9sdG8gZWxldmF0aS4gbWVkaWFuX3ByaWNlIGhhIHVuYSBhc2ltbWV0cmlhIG5lZ2F0aXZhIG1vZGVyYXRhICgtMC4zNiksIGluZGljYW5kbyB1bmEgbGVnZ2VyYSBjb25jZW50cmF6aW9uZSBkaSB2YWxvcmkgcGnDuSBhbHRpLiBtb250aHNfaW52ZW50b3J5IMOoIHF1YXNpIHNpbW1ldHJpY2EgKHNrZXduZXNzIOKJiCAwKQ0KICAtICoqRm9ybWEgZGVsbGEgZGlzdHJpYnV6aW9uZSAoS3VydG9zaXMpKio6IFR1dHRlIGxlIHZhcmlhYmlsaSBoYW5ubyB2YWxvcmkgZGkga3VydG9zaXMgY29tcHJlc2kgdHJhIDIuMiBlIDMuMiwgdmljaW5pIGEgcXVlbGxpIGRpIHVuYSBkaXN0cmlidXppb25lIG5vcm1hbGUgKGt1cnRvc2lzID0gMykuIHZvbHVtZSBlIHNhbGVzIHNvbm8gbGVnZ2VybWVudGUgbGVwdG9jdXJ0aWNoZSwgY29uIHVuYSBtYWdnaW9yZSBjb25jZW50cmF6aW9uZSBhdHRvcm5vIGFsbGEgbWVkaWEgZSBjb2RlIHBpw7kgcHJvbnVuY2lhdGUuDQoNCg0KLSBgQW5hbGlzaSB2YWxvcmUgZGVnbGkgaW1tb2JpbGkgYA0KICAtICoqUHJlenpvIG1lZGlvIGltbW9iaWxpIHBlciBjaXR0w6AqKjogQnJ5YW4tQ29sbGVnZSBTdGF0aW9uIHJpc3VsdGEgbGEgY2l0dMOgIGNvbiBpbCBwcmV6em8gbWVkaW8gcGnDuSBhbHRvLiBQcm9iYWJpbG1lbnRlIGNpw7Igw6ggZ2l1c3RpZmljYXRvIGRhIHVuYSBwb3NpemlvbmUgc3RyYXRlZ2ljYSBhIHJpZG9zc28gZGVsbGEgc3RhemlvbmUgZSBkYWwgQ29sbGFnZS4NCiAgLSAqKkFuZGFtZW50byBkaSBtZXJjYXRvIGFubm8gc3UgYW5ubyoqOiBkb3BvIHVuIHJpYmFzc28gZGVsIHZhbG9yZSBtZWRpbyBuZWwgMjAxMSBpbCBwcmV6em8gbWVkaW8gZGVnbGkgaW1tb2JpbGkgw6ggY3Jlc2NpdXRvIGFubm8gc3UgYW5ubyBmaW5vIGFsIDIwMTQNCiAgLSAqKnN0YWdpb25hbGl0w6AgcHJlenppIGRpIG1lcmNhdG8qKjogR2VubmFpbyDDqCBpbCBtZXNlIGRvdmUgaWwgcHJlenpvIG1lZGlvIMOoIHBpw7kgYmFzc28sIG1lbnRyZSBjcmVzY2UgZmlubyBhZCBhcnJpdmFyZSBhbCBwaWNjbyBkaSBHaXVnbm8NCi0gYEFuYWxpc2kgdmVuZGl0ZSBgDQogIC0gKipUcmVuZCB2ZW5kaXRlKio6IGlsIGNvbmZyb250byBhbm5vIHN1IGFubm8gKFlvWSkgw6ggaW4gY3Jlc2NpdGEgZGFsIDIwMTAgYWwgMjAxNA0KICAtICoqU3RhZ2lvbmFsaXTDoCoqOiBsZSB2ZW5kaXRlIHNpIGNvbmNlbnRyYW5vIG5lbCBwZXJpb2RvIGNlbnRyYWxlIGRlbGwnYW5uby4gSSBtZXNpIGEgcmlkb3NzbyBkaSBpbml6aW8gZSBmaW5lIGFubm8gc29ubyBwacO5IHNvZmZlcmVudGkuDQogICAgICAgICAgICAgICAgICAgICAgKipHaXVnbm8qKiDDqCBpbCBtZXNlIFRPUCwgbm9ub3N0YW50ZSBpbCB2YWxvcmUgbWVkaW8gZGVnbGkgaW1tb2JpbGkgc2lhIHBpw7kgYWx0by4gTWVudHJlICoqR2VubmFpbyoqIGlsIHBlZ2dpb3JlIHBlciB2ZW5kaXRlDQogICAgICAgICAgICAgICAgICAgICAgDQogIC0gKipQZXJmb3JtYW5jZSBDaXR0w6AqKjogTGEgY2l0dMOgIGRpIFR5bGVyIMOoIGxhIHRvcCBwZXJmb3JtZXIgY29tZSB2ZW5kaXRlIGFzc29sdXRlIGRpIGltbW9iaWxpLCBzZWd1aXRhIGRhIEJyeWFuLUNvbGxlZ2UgU3RhdGlvbg0KICAtICoqUGVyZm9ybWFuY2UgQ2l0dMOgIG5lbCB0ZW1wbyoqOiBpIGRhdGkgbW9zdHJhbm8gdW5hIGNlcnRhIGZsdXR0dWFsaXTDoCBkZWxsZSB2ZW5kaXRlIG5lbCB0ZW1wbyBkb3Z1dGUgYWkgcGljY2hpIHN0YWdpb25hbGkNCg0KLSBgQ29ycmVsYXppb25lIHRyYSBhbm51bmNpIGUgdmVuZGl0ZSBgDQogIC0gKipQZXJmb3JtYW5jZSBhbm51bmNpKio6IEMnw6ggdW5hIHJlbGF6aW9uZSBwb3NpdGl2YSB0cmEgYW5udW5jaSBlIHZlbmRpdGU6IHBpw7kgYW5udW5jaT1wacO5IHZlbmRpdGUuIFBlciBhdW1lbnRhcmUgdWx0ZXJpb3JtZW50ZSBsZSB2ZW5kaXRlIHNpIHBvdHJlYmJlIGZhciBsZXZhIHN1bGwnaW5jcmVtZW50byBkaSBhbm51bmNpIHN1IHZhcmkgY2FuYWxpIGRpIGNvbXVuaWNhemlvbmUgKHJhZGlvLCB0diBsb2NhbGksIGdpb3JuYWxpIGUgcml2aXN0ZSwgZXRjIGV0YykNCg0KLSBgQW5hbGlzaSB0ZW1waSBkaSB2ZW5kaXRhIGltbW9iaWxpIGANCiAgLSAqKlBlcmZvcm1hbmNlIGdlbmVyYWxlKio6IElsIHRlbXBvIG1lZGlvIHBlciB2ZW5kZXJlIHR1dHRlIGxlIGluc2Vyemlvbmkgw6g6IDkuMTkgbWVzaQ0KICAtICoqUGVyZm9ybWFuY2UgcGVyIGNpdHTDoCoqOiBOZWxsYSBjaXR0w6AgZGkgVHlsZXIgbWVkaWFtZW50ZSBzaSBpbXBpZWdhIHBpw7kgdGVtcG8gYSB2ZW5kZXJlIGdsaSBpbW1vYmlsaSAoMTEuMyBtZXNpKSwgbWVudHJlIEJyeWFuLUNvbGxhZ2UgU3RhdGlvbiDDqCBxdWVsbGEgY29uIG1lZGlhbWVudGUgbWlub3IgdGVtcG8oNy41IG1lc2kpLiBQcm9iYWJpbG1lbnRlLCBzaSBwb3RyZWJiZSBpcG90aXp6YXJlIG5vbiBhdmVuZG8gZGF0aSBhIGRpc3Bvc2l6aW9uZSwgY2hlIGNpw7Igw6ggZG92dXRvIGRhIHVuYSBtYWdnaW9yZSAicm90YXppb25lIiB0aXBpY2EgZGkgY2l0dMOgIGZyZXF1ZW50YXRlIGRhIHN0dWRlbnRpLlBvdHJlYmJlIGVzc2VyZSB1biBvdHRpbW8gaW52ZXN0aW1lbnRvIGFjcXVpc2lyZSB1biBpbW1vYmlsZSBuZWxsYSBjaXR0w6AgZGkgQnJ5YW4tQ29sbGFnZSBTdGF0aW9uDQoNCiMjIEdSQVpJRSBQRVIgTCdBVFRFTlpJT05FIChFbWFudWVsZSBSaXNhKQ0KDQoNCg0KDQo=