Befolkning


library("tidyverse")
library(statgl) # Info at www.stat.gl/SBE202003/o1
library("kableExtra")
library("glue")
library("rjson")


lang <- paste0("?lang=", language) 
select <- "&select"
json <- ".json_stat2"
csv <- ".csv"

first_blank <- c(" " = 1)

table <- "Tabel"
note   <- "Se Statistikbanken tabel: "

title1 <- "1.1. Befolkning i kommuner, distrikter og lokaliteter"

id1 <- "BEDST2"
id2 <- "BEDST3"
id3 <- "BEDST4"


link1 <- "https://bank.stat.gl:443/sq/be66e20d-950c-41fd-98be-0c81e0f19417"
link2 <- "https://bank.stat.gl:443/sq/45b2ccd0-17b0-476c-b7c1-7a92cd5c7a3c" 
link3 <- "https://bank.stat.gl:443/sq/1bb5507d-07ca-4f13-a800-eb873e7c4569"


table1 <- glue("**", table, " 1.** ", fromJSON(file = glue(link1, json, lang))$label)
table2 <- glue("**", table, " 2.** ", fromJSON(file = glue(link2, json, lang))$label)
table3 <- glue("**", table, " 3.** ", fromJSON(file = glue(link3, json, lang))$label)
Befolkning i kommuner, distrikter og lokaliteter
table <- 
  read_csv(
    glue::glue(link1, csv, lang),
    locale = locale(encoding = "latin1"))

column_vector <- 1:8
names(column_vector) <- c(" ",
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$N,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$S,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$T,
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$N, " "),
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$S, " "),
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$T, " "),
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$T, "  "))

header_vector <- c(1, 3, 3, 1)
names(header_vector) <- c(" ",
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$gender$category$label$M,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$gender$category$label$K,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$gender$category$label$T)

table %>% 
  select(-8, -9) %>% 
  rename(column_vector) %>% 
  statgl_table() %>% 
  row_spec(1, bold = T) %>% 
  add_header_above(header_vector)
Mænd
Kvinder
I alt
Grønland Født udenfor Grønland I alt Grønland Født udenfor Grønland I alt I alt
Hele landet 25.701 4.170 29.871 24.459 2.279 26.738 56.609
Kommune Kujalleq 3.020 266 3.286 2.794 125 2.919 6.205
Kommuneqarfik Sermersooq 9.977 2.731 12.708 9.925 1.515 11.440 24.148
Qeqqata Kommunia 4.366 442 4.808 4.134 249 4.383 9.191
Kommune Qeqertalik 3.079 167 3.246 2.752 84 2.836 6.082
Avannaata Kommunia 5.247 530 5.777 4.844 299 5.143 10.920
Udenfor kommunerne 12 34 46 10 7 17 63


Se Statistikbanken tabel: BEDST2

table <- 
  read_csv(
    glue::glue(link2, csv, lang),
    locale = locale(encoding = "latin1"))

column_vector <- 1:8
names(column_vector) <- c(" ",
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$N,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$S,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$T,
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$N, " "),
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$S, " "),
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$T, " "),
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$T, "  "))

header_vector <- c(1, 3, 3, 1)
names(header_vector) <- c(" ",
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$gender$category$label$M,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$gender$category$label$K,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$gender$category$label$T)


table %>% 
  select(-8, -9) %>% 
  filter(table[,10] > 0) %>% 
  rename(column_vector) %>% 
  statgl_table() %>% 
  row_spec(1, bold = T) %>% 
  add_header_above(header_vector)
Mænd
Kvinder
I alt
Grønland Født udenfor Grønland I alt Grønland Født udenfor Grønland I alt I alt
Hele landet 25.701 4.170 29.871 24.459 2.279 26.738 56.609
Nanortalik 809 37 846 673 14 687 1.533
Qaqortoq 1.464 175 1.639 1.408 77 1.485 3.124
Narsaq 747 54 801 713 34 747 1.548
Paamiut 670 25 695 536 14 550 1.245
Nuuk 7.824 2.613 10.437 7.932 1.455 9.387 19.824
Maniitsoq 1.546 110 1.656 1.365 51 1.416 3.072
Sisimiut 2.820 332 3.152 2.769 198 2.967 6.119
Kangaatsiaq 591 5 596 495 3 498 1.094
Aasiaat 1.485 138 1.623 1.327 68 1.395 3.018
Qasigiannguit 568 12 580 525 8 533 1.113
Ilulissat 2.336 411 2.747 2.242 230 2.472 5.219
Qeqertarsuaq 435 12 447 405 5 410 857
Uummannaq 1.088 69 1.157 1.031 46 1.077 2.234
Upernavik 1.433 40 1.473 1.226 16 1.242 2.715
Qaanaaq 390 10 400 345 7 352 752
Tasiilaq 1.307 82 1.389 1.299 37 1.336 2.725
Ittoqqortoormiit 176 11 187 158 9 167 354


Se Statistikbanken tabel: BEDST3

table <- 
  read_csv(
    glue(link3, csv, lang),
    locale = locale(encoding = "latin1"))

column_vector <- 1:8
names(column_vector) <- c(" ",
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$N,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$S,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$T,
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$N, " "),
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$S, " "),
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$T, " "),
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$T, "  "))

header_vector <- c(1, 3, 3, 1)
names(header_vector) <- c(" ",
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$gender$category$label$M,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$gender$category$label$K,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$gender$category$label$T)

table %>% 
    select(-8, -9) %>% 
    filter(table[,10] > 0) %>% 
    rename(column_vector) %>% 
    statgl_table() %>% 
    row_spec(1, bold = T) %>% 
    add_header_above(header_vector)
Mænd
Kvinder
I alt
Grønland Født udenfor Grønland I alt Grønland Født udenfor Grønland I alt I alt
Hele landet 25.701 4.170 29.871 24.459 2.279 26.738 56.609
Nanortalik (by) 582 28 610 496 13 509 1.119
Aappilattoq (bygd i Kujalleq) 52 1 53 39 1 40 93
Narsarmijit 28 1 29 28 0 28 57
Tasiusaq (bygd i Kujalleq) 37 0 37 19 0 19 56
Ammassivik (bygd) 23 0 23 20 0 20 43
Alluitsup Paa (bygd) 87 6 93 71 0 71 164
Uoplyst i Nanortalik distrikt 0 1 1 0 0 0 1
Qaqortoq (by) 1.396 171 1.567 1.362 76 1.438 3.005
Saarloq (bygd) 16 0 16 10 0 10 26
Eqalugaarsuit (bygd) 42 3 45 33 1 34 79
Qassimiut (bygd) 10 1 11 3 0 3 14
Narsaq (by) 634 36 670 617 25 642 1.312
Igaliku (bygd) 21 1 22 12 1 13 35
Qassiarsuk (bygd) 33 1 34 26 2 28 62
Narsarsuaq (bygd) 59 16 75 58 6 64 139
Paamiut (by) 632 25 657 505 11 516 1.173
Arsuk (bygd) 38 0 38 31 3 34 72
Nuuk (by) 7.698 2.611 10.309 7.842 1.453 9.295 19.604
Qeqertarsuatsiaat (bygd) 101 1 102 74 1 75 177
Kapisillit (bygd) 25 1 26 16 1 17 43
Tasiilaq (by) 887 67 954 918 32 950 1.904
Sermiligaaq (bygd) 95 1 96 93 0 93 189
Isertoq (bygd) 34 0 34 29 0 29 63
Kulusuk (bygd) 121 9 130 91 5 96 226
Tiilerilaaq (bygd) 42 2 44 49 0 49 93
Kuummiit (bygd) 128 3 131 119 0 119 250
Ittoqqortoormiit (by) 176 9 185 158 9 167 352
Nerlerit Inaat (Lufthavn) 0 1 1 0 0 0 1
Uoplyst i Illoqqortoormiut distrikt 0 1 1 0 0 0 1
Maniitsoq (by) 1.245 107 1.352 1.116 51 1.167 2.519
Atammik (bygd) 104 2 106 86 0 86 192
Napasoq (bygd) 34 0 34 36 0 36 70
Kangaamiut (bygd) 163 1 164 127 0 127 291
Sisimiut (by) 2.530 248 2.778 2.481 177 2.658 5.436
Itilleq (bygd) 49 0 49 42 0 42 91
Sarfannguit (bygd) 55 0 55 46 0 46 101
Kangerlussuaq (bygd) 186 84 270 200 21 221 491
Kangaatsiaq (by) 270 3 273 231 3 234 507
Attu (bygd) 110 1 111 85 0 85 196
Iginniarfik (bygd) 35 0 35 29 0 29 64
Niaqornaarsuk (bygd) 127 0 127 106 0 106 233
Ikerasaarsuk (KAN)(bygd) 49 1 50 44 0 44 94
Aasiaat (by) 1.415 138 1.553 1.282 68 1.350 2.903
Akunnaaq (bygd) 40 0 40 21 0 21 61
Kitsissuarsuit (bygd) 30 0 30 24 0 24 54
Qasigiannguit (by) 531 12 543 487 7 494 1.037
Ikamiut (bygd) 37 0 37 38 1 39 76
Qeqertarsuaq (by) 428 12 440 400 5 405 845
Kangerluk (bygd) 7 0 7 5 0 5 12
Ilulissat (by) 2.142 404 2.546 2.077 225 2.302 4.848
Oqaatsut (bygd) 24 4 28 19 1 20 48
Qeqertaq (bygd) 57 1 58 53 1 54 112
Saqqaq (bygd) 89 2 91 67 2 69 160
Ilimanaq (bygd) 24 0 24 26 1 27 51
Uummannaq (by) 666 57 723 646 38 684 1.407
Niaqornat (bygd) 15 0 15 19 0 19 34
Qaarsut (bygd) 78 2 80 80 1 81 161
Ikerasak (bygd) 121 0 121 108 0 108 229
Saattut (bygd) 135 6 141 113 5 118 259
Ukkusissat (bygd) 73 4 77 65 2 67 144
Upernavik (by) 576 28 604 477 9 486 1.090
Upernavik Kujalleq (bygd) 104 0 104 97 0 97 201
Kangersuatsiaq (bygd) 85 0 85 56 0 56 141
Aappilattoq (bygd i Avannaani) 78 0 78 71 0 71 149
Tasiusaq (bygd i Avannaa) 125 4 129 116 4 120 249
Nuussuaq (bygd) 93 0 93 88 0 88 181
Kullorsuaq (bygd) 222 5 227 215 2 217 444
Naajaat (bygd) 25 0 25 20 0 20 45
Innaarsuit (bygd) 99 3 102 68 1 69 171
Nutaarmiut (bygd) 25 0 25 18 0 18 43
Ikerasaarsuk (UPE)(bygd) 1 0 1 0 0 0 1
Qaanaaq (by) 317 9 326 296 7 303 629
Savissivik (bygd) 32 0 32 18 0 18 50
Siorapaluk (bygd) 24 1 25 16 0 16 41
Qeqertat (bygd) 16 0 16 15 0 15 31
Uoplyst i Qaanaaq distrikt 1 0 1 0 0 0 1
Pituffik (Station) 12 26 38 9 4 13 51
Uoplyst udenfor kommunerne 0 8 8 1 3 4 12


Se Statistikbanken tabel: BEDST4


Sidst opdateret: 06. juni 2023
LS0tDQpwYXJhbXM6DQogIGxhbmc6ICJkYSINCm91dHB1dDoNCiAgc3RhdGdsOjpzdGF0Z2xfcmVwb3J0Og0KICAgIGFuY2hvcl9zZWN0aW9uczogZmFsc2UNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCgllY2hvICAgID0gVFJVRSwNCgltZXNzYWdlID0gRkFMU0UsDQoJd2FybmluZyA9IEZBTFNFLA0KCWNsYXNzLm91dHB1dCA9ICJzY3JvbGwtMTAwIg0KKQ0KDQp7DQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSgic3RhdGdsIikNCmxpYnJhcnkoImthYmxlRXh0cmEiKQ0KbGlicmFyeSgibHVicmlkYXRlIikNCmxpYnJhcnkoInlhbWwiKQ0KfQ0KDQp7ICANCmxhbmd1YWdlICA8LSBwYXJhbXMkbGFuZw0Kb3B0aW9uICAgIDwtIHBhc3RlMCgiP2xhbmc9IiwgbGFuZ3VhZ2UsICImc2VsZWN0IikNCmxvZ28gICAgICA8LSBwYXN0ZTAoZ2V0d2QoKSwiL2FkZC9sb2dvLmdpZiIpDQp0eHQgICAgICAgPC0gcmVhZF95YW1sKHBhc3RlMChnZXR3ZCgpLCAiL2FkZC90eHQueW1sIiksIGZpbGVFbmNvZGluZyA9ICJJU08tODg1OS0xIikNCnNvdXJjZSAgICA8LSB0eHQkc291cmNlW2xhbmd1YWdlXSAlPiUgdW5saXN0KCkNCn0NCg0KeGFyaW5nYW5FeHRyYTo6dXNlX2NsaXBib2FyZCgpDQoNCmBgYA0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQoNCi5hY2NvcmRpb24gew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTE5OTAwOw0KICBjb2xvcjogd2hpdGU7DQogIGN1cnNvcjogcG9pbnRlcjsNCiAgcGFkZGluZzogMThweDsNCiAgd2lkdGg6IDEwMCU7DQogIGJvcmRlcjogbm9uZTsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICBvdXRsaW5lOiBub25lOw0KICBmb250LXNpemU6IDE1cHg7DQogIHRyYW5zaXRpb246IDAuNHM7DQp9DQoNCi5hY3RpdmUsIC5hY2NvcmRpb246aG92ZXIgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjk3MjQyOw0KfQ0KDQouYWNjb3JkaW9uOmFmdGVyIHsNCiAgY29udGVudDogJ1wwMDJCJzsNCiAgY29sb3I6ICM3Nzc7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmbG9hdDogcmlnaHQ7DQogIG1hcmdpbi1sZWZ0OiA1cHg7DQp9DQoNCi5hY3RpdmU6YWZ0ZXIgew0KICBjb250ZW50OiAiXDIyMTIiOw0KfQ0KDQoucGFuZWwgew0KICBwYWRkaW5nOiAwcHggNXB4IDBweCA1cHg7DQogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KICBtYXgtaGVpZ2h0OiAwOw0KICBvdmVyZmxvdzogaGlkZGVuOw0KICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuMnMgZWFzZS1vdXQ7DQp9DQoNCmRldGFpbHMgew0KICB3aWR0aDogMTAwJTsNCn0NCg0KZGV0YWlscyA+IHN1bW1hcnkgew0KICBwYWRkaW5nOiA0cHggMTJweDsNCiAgd2lkdGg6IDEwMCU7DQogIGJhY2tncm91bmQtY29sb3I6ICMwMDdmOTk7DQogIGJvcmRlcjogc29saWQ7DQogIGJvcmRlci1jb2xvcjogd2hpdGU7DQogIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KICBmb250LXNpemU6IDE1cHg7DQogIGNvbG9yOiB3aGl0ZTsNCn0NCg0KZGV0YWlsc1tvcGVuXSA+IHN1bW1hcnkgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFhNDFhOw0KfQ0KDQoNCi50aXRsZSB7DQogIGNvbG9yOiAjMWI1NDYzOw0KICBmb250LXNpemU6IDM2cHg7DQp9DQoNCg0KLnBlcnNvbmVyIHsNCiAgYm94LXNoYWRvdzogM3B4IDNweCA0cHggYmxhY2s7DQogIGJhY2tncm91bmQ6ICMwMDQ0NTk7DQogIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQogIHBhZGRpbmctbGVmdDogMTZweDsNCiAgcGFkZGluZy10b3A6IDAuMXB4Ow0KICBwYWRkaW5nLWJvdHRvbTogMXB4Ow0KICBmb250LXNpemU6IDExcHg7DQogIGNvbG9yOiB3aGl0ZTsNCiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCn0NCg0KLsO4a29ub21pIHsNCiAgYm94LXNoYWRvdzogM3B4IDNweCA0cHggYmxhY2s7DQogIGJhY2tncm91bmQ6ICMwMDdGOTk7DQogIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQogIHBhZGRpbmctbGVmdDogMTZweDsNCiAgcGFkZGluZy10b3A6IDFweDsNCiAgcGFkZGluZy1ib3R0b206IDAuMXB4Ow0KICBmb250LXNpemU6IDExcHg7DQogIGNvbG9yOiB3aGl0ZTsNCiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCn0NCg0KLnR2w6ZyZ8OlZW5kZSB7DQogIGJveC1zaGFkb3c6IDNweCAzcHggNHB4IGJsYWNrOw0KICBiYWNrZ3JvdW5kOiAjZmFhNDFhOw0KICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KICBwYWRkaW5nLWxlZnQ6IDE2cHg7DQogIHBhZGRpbmctdG9wOiAwLjFweDsNCiAgcGFkZGluZy1ib3R0b206IDFweDsNCiAgZm9udC1zaXplOiAxMXB4Ow0KICBjb2xvcjogd2hpdGU7DQogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQp9DQoNCi5jb250YWluZXIgew0KICB3aWR0aDogaW5oZXJpdDsNCn0NCg0KLnNjcm9sbC0xMDAgew0KICBtYXgtaGVpZ2h0OiAxMDA7DQogIG92ZXJmbG93LXk6IGF1dG87DQogIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7DQp9DQoNCg0KcHJlIHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQp9DQoNCnByZVtjbGFzc10gew0KICBtYXgtaGVpZ2h0OiAzMDBweDsNCn0NCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KPGNlbnRlcj4NCg0KLS0tDQogDQojIFtgciB0eHQkQkUkdGl0bGVbbGFuZ3VhZ2VdYF17LnRpdGxlfQ0KIA0KLS0tDQo8L2NlbnRlcj4NCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQ0KbGlicmFyeShzdGF0Z2wpICMgSW5mbyBhdCB3d3cuc3RhdC5nbC9TQkUyMDIwMDMvbzENCmxpYnJhcnkoImthYmxlRXh0cmEiKQ0KbGlicmFyeSgiZ2x1ZSIpDQpsaWJyYXJ5KCJyanNvbiIpDQoNCg0KbGFuZyA8LSBwYXN0ZTAoIj9sYW5nPSIsIGxhbmd1YWdlKSANCnNlbGVjdCA8LSAiJnNlbGVjdCINCmpzb24gPC0gIi5qc29uX3N0YXQyIg0KY3N2IDwtICIuY3N2Ig0KDQpmaXJzdF9ibGFuayA8LSBjKCIgIiA9IDEpDQoNCnRhYmxlIDwtICJUYWJlbCINCm5vdGUgICA8LSAiU2UgU3RhdGlzdGlrYmFua2VuIHRhYmVsOiAiDQoNCnRpdGxlMSA8LSAiMS4xLiBCZWZvbGtuaW5nIGkga29tbXVuZXIsIGRpc3RyaWt0ZXIgb2cgbG9rYWxpdGV0ZXIiDQoNCmlkMSA8LSAiQkVEU1QyIg0KaWQyIDwtICJCRURTVDMiDQppZDMgPC0gIkJFRFNUNCINCg0KDQpsaW5rMSA8LSAiaHR0cHM6Ly9iYW5rLnN0YXQuZ2w6NDQzL3NxL2JlNjZlMjBkLTk1MGMtNDFmZC05OGJlLTBjODFlMGYxOTQxNyINCmxpbmsyIDwtICJodHRwczovL2Jhbmsuc3RhdC5nbDo0NDMvc3EvNDViMmNjZDAtMTdiMC00NzZjLWI3YzEtN2E5MmNkNWM3YTNjIiANCmxpbmszIDwtICJodHRwczovL2Jhbmsuc3RhdC5nbDo0NDMvc3EvMWJiNTUwN2QtMDdjYS00ZjEzLWE4MDAtZWI4NzNlN2M0NTY5Ig0KDQoNCnRhYmxlMSA8LSBnbHVlKCIqKiIsIHRhYmxlLCAiIDEuKiogIiwgZnJvbUpTT04oZmlsZSA9IGdsdWUobGluazEsIGpzb24sIGxhbmcpKSRsYWJlbCkNCnRhYmxlMiA8LSBnbHVlKCIqKiIsIHRhYmxlLCAiIDIuKiogIiwgZnJvbUpTT04oZmlsZSA9IGdsdWUobGluazIsIGpzb24sIGxhbmcpKSRsYWJlbCkNCnRhYmxlMyA8LSBnbHVlKCIqKiIsIHRhYmxlLCAiIDMuKiogIiwgZnJvbUpTT04oZmlsZSA9IGdsdWUobGluazMsIGpzb24sIGxhbmcpKSRsYWJlbCkNCg0KDQoNCg0KDQoNCmBgYA0KDQo8ZGV0YWlscyBvcGVuPiA8c3VtbWFyeT4gYHIgdHh0JEJFJHN1YjFbbGFuZ3VhZ2VdYCA8L3N1bW1hcnk+DQo8YnI+DQo8YnV0dG9uIGNsYXNzPSJhY2NvcmRpb24iPiBgciB0YWJsZTEgYCA8L2J1dHRvbj4gPGRpdiBjbGFzcz0icGFuZWwiPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KdGFibGUgPC0gDQogIHJlYWRfY3N2KA0KICAgIGdsdWU6OmdsdWUobGluazEsIGNzdiwgbGFuZyksDQogICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gImxhdGluMSIpKQ0KDQpjb2x1bW5fdmVjdG9yIDwtIDE6OA0KbmFtZXMoY29sdW1uX3ZlY3RvcikgPC0gYygiICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsxLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkTiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMSwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCROLCAiICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlKGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsxLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkUywgIiAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMSwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsICIgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRULCAiICAiKSkNCg0KaGVhZGVyX3ZlY3RvciA8LSBjKDEsIDMsIDMsIDEpDQpuYW1lcyhoZWFkZXJfdmVjdG9yKSA8LSBjKCIgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kZ2VuZGVyJGNhdGVnb3J5JGxhYmVsJE0sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsxLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGdlbmRlciRjYXRlZ29yeSRsYWJlbCRLLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMSwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRnZW5kZXIkY2F0ZWdvcnkkbGFiZWwkVCkNCg0KdGFibGUgJT4lIA0KICBzZWxlY3QoLTgsIC05KSAlPiUgDQogIHJlbmFtZShjb2x1bW5fdmVjdG9yKSAlPiUgDQogIHN0YXRnbF90YWJsZSgpICU+JSANCiAgcm93X3NwZWMoMSwgYm9sZCA9IFQpICU+JSANCiAgYWRkX2hlYWRlcl9hYm92ZShoZWFkZXJfdmVjdG9yKQ0KDQoNCg0KYGBgDQo8YnI+DQpbIVtdKGByIGxvZ29gKXt3aWR0aD00MH1gciBnbHVlOjpnbHVlKG5vdGUsIGlkMSlgICBdKGByIGdsdWU6OmdsdWUobGluazEsIGxhbmcsIHNlbGVjdClgKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2Rpdj4gDQoNCg0KPGJ1dHRvbiBjbGFzcz0iYWNjb3JkaW9uIj4gYHIgdGFibGUyIGAgPC9idXR0b24+IDxkaXYgY2xhc3M9InBhbmVsIj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnRhYmxlIDwtIA0KICByZWFkX2NzdigNCiAgICBnbHVlOjpnbHVlKGxpbmsyLCBjc3YsIGxhbmcpLA0KICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJsYXRpbjEiKSkNCg0KY29sdW1uX3ZlY3RvciA8LSAxOjgNCm5hbWVzKGNvbHVtbl92ZWN0b3IpIDwtIGMoIiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMiwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJE4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsyLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazIsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRULA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlKGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsyLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkTiwgIiAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMiwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFMsICIgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazIsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRULCAiICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlKGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsyLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkVCwgIiAgIikpDQoNCmhlYWRlcl92ZWN0b3IgPC0gYygxLCAzLCAzLCAxKQ0KbmFtZXMoaGVhZGVyX3ZlY3RvcikgPC0gYygiICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsyLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGdlbmRlciRjYXRlZ29yeSRsYWJlbCRNLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMiwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRnZW5kZXIkY2F0ZWdvcnkkbGFiZWwkSywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazIsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kZ2VuZGVyJGNhdGVnb3J5JGxhYmVsJFQpDQoNCg0KdGFibGUgJT4lIA0KICBzZWxlY3QoLTgsIC05KSAlPiUgDQogIGZpbHRlcih0YWJsZVssMTBdID4gMCkgJT4lIA0KICByZW5hbWUoY29sdW1uX3ZlY3RvcikgJT4lIA0KICBzdGF0Z2xfdGFibGUoKSAlPiUgDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoaGVhZGVyX3ZlY3RvcikNCg0KDQoNCmBgYA0KPGJyPg0KWyFbXShgciBsb2dvYCl7d2lkdGg9NDB9YHIgZ2x1ZTo6Z2x1ZShub3RlLCBpZDIpYCAgXShgciBnbHVlOjpnbHVlKGxpbmsyLCBsYW5nLCBzZWxlY3QpYCl7dGFyZ2V0PSJfYmxhbmsifQ0KPC9kaXY+DQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHRhYmxlMyBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0YWJsZSA8LSANCiAgcmVhZF9jc3YoDQogICAgZ2x1ZShsaW5rMywgY3N2LCBsYW5nKSwNCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAibGF0aW4xIikpDQoNCmNvbHVtbl92ZWN0b3IgPC0gMTo4DQpuYW1lcyhjb2x1bW5fdmVjdG9yKSA8LSBjKCIgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazMsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCROLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmszLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJE4sICIgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazMsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRTLCAiICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlKGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmszLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkVCwgIiAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsICIgICIpKQ0KDQpoZWFkZXJfdmVjdG9yIDwtIGMoMSwgMywgMywgMSkNCm5hbWVzKGhlYWRlcl92ZWN0b3IpIDwtIGMoIiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRnZW5kZXIkY2F0ZWdvcnkkbGFiZWwkTSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazMsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kZ2VuZGVyJGNhdGVnb3J5JGxhYmVsJEssDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmszLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGdlbmRlciRjYXRlZ29yeSRsYWJlbCRUKQ0KDQp0YWJsZSAlPiUgDQogICAgc2VsZWN0KC04LCAtOSkgJT4lIA0KICAgIGZpbHRlcih0YWJsZVssMTBdID4gMCkgJT4lIA0KICAgIHJlbmFtZShjb2x1bW5fdmVjdG9yKSAlPiUgDQogICAgc3RhdGdsX3RhYmxlKCkgJT4lIA0KICAgIHJvd19zcGVjKDEsIGJvbGQgPSBUKSAlPiUgDQogICAgYWRkX2hlYWRlcl9hYm92ZShoZWFkZXJfdmVjdG9yKQ0KDQpgYGANCjxicj4NClshW10oKXt3aWR0aD00MH1gciBnbHVlOjpnbHVlKG5vdGUsIGlkMylgICBdKGByIGdsdWU6OmdsdWUobGluazMsIGxhbmcsIHNlbGVjdClgKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2Rpdj4gDQoNCjwvZGV0YWlscz4NCg0KDQoNCg0KDQoNCg0KDQoNCjxociBzdHlsZT0iYm9yZGVyOjFweCByaWRnZSBsaWdodGdyYXkiPiA8L2hyPg0KPGNlbnRlcj4gPHNwYW4gc3R5bGU9J2NvbG9yOiNEM0QzRDM7IGZvbnQtc2l6ZTo5MCU7Jz4gYHIgcGFzdGUodHh0JHVwZGF0ZVtsYW5ndWFnZV0sIGZvcm1hdChTeXMuRGF0ZSgpLCAiJWQuICVCICVZIikpYCA8L3NwYW4+IDwvY2VudGVyPg0KDQoNCg0KDQo8c2NyaXB0Pg0KdmFyIGFjYyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImFjY29yZGlvbiIpOw0KdmFyIGk7DQoNCmZvciAoaSA9IDA7IGkgPCBhY2MubGVuZ3RoOyBpKyspIHsNCiAgYWNjW2ldLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKSB7DQogICAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiKTsNCiAgICB2YXIgcGFuZWwgPSB0aGlzLm5leHRFbGVtZW50U2libGluZzsNCiAgICBpZiAocGFuZWwuc3R5bGUubWF4SGVpZ2h0KSB7DQogICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSBudWxsOw0KICAgIH0gZWxzZSB7DQogICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSBwYW5lbC5zY3JvbGxIZWlnaHQgKyAicHgiOw0KICAgIH0gDQogIH0pOw0KfQ0KPC9zY3JpcHQ+DQoNCg==