#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct String {
    int* symbols;
    int size;
    int cap;
};

void add_symbol(struct String* s, int symbol) {
    if (s->cap <= s->size) {
        s->cap = (1+s->cap)*2;
        s->symbols = realloc(s->symbols, s->cap*sizeof(int));
    }
    s->symbols[s->size++] = symbol;
}

int next_or_die(unsigned char** p) {
    if (((**p) >> 6) != 0x2) {
        printf("UPS\n"); exit(-1);
    }
    return (*((*p)++)) & 0x3f;
}

struct String readline() {
    struct String r;
    char buf[100000];
    unsigned char* p = (unsigned char*)&buf[0];
    memset(&r, 0, sizeof(r));
    fgets(buf, sizeof(buf), stdin);
    while (*p) {
        if ((*p & 0x80) == 0) {
            add_symbol(&r, *p++);
        } else if (((*p) >> 5) == 0x6) {
            int symbol = 0;
            symbol  = ((*p++) & 0x1f) << 6;
            symbol |= next_or_die(&p);
            add_symbol(&r, symbol);
        } else if (((*p) >> 4) == 0xe) {
            int symbol = 0;
            symbol  = ((*p++) & 0xf)  << 12;
            symbol |= next_or_die(&p) << 6;
            symbol |= next_or_die(&p);
            add_symbol(&r, symbol);
        } else if (((*p) >> 3) == 0x1e) {
            int symbol = 0;
            symbol  = ((*p++) & 0x7)  << 18;
            symbol |= next_or_die(&p) << 12;
            symbol |= next_or_die(&p) << 6;
            symbol |= next_or_die(&p);
            add_symbol(&r, symbol);
        }
    }

    return r;
};

void printline(struct String s) {
    int i;
    for (i = 0; i < s.size; i++) {
        if (s.symbols[i] <= 0x7f) {
            putchar(s.symbols[i]);
        } else if (s.symbols[i] <= 0x7ff) {
            putchar((s.symbols[i] >> 6)   | 0xc0);
            putchar((s.symbols[i] & 0x3f) | 0x80);
        } else if (s.symbols[i] <= 0xffff) {
            putchar((s.symbols[i] >> 12)  | 0xe0);
            putchar(((s.symbols[i] >> 6)&0x3f)| 0x80);
            putchar((s.symbols[i]&0x3f)  | 0x80);
        } else {
            putchar((s.symbols[i] >> 18)  | 0xf0);
            putchar(((s.symbols[i] >> 12)&0x3f)| 0x80);
            putchar(((s.symbols[i] >> 6)&0x3f) | 0x80);
            putchar((s.symbols[i]&0x3f)  | 0x80);
        }
    }
    putchar('\n');
}

int min(int a, int b) {
    return a<b?a:b;
}

struct String substring(struct String s, int from, int len) {
    struct String r = {
        s.symbols+min(s.size, from),
        min(s.size, from+len)-min(s.size, from)
    };
    return r;
}

int main() {
    struct String r = readline();
    printf("len=%d\n", r.size);
    printline(r);
    printline(substring(r, 11, 11));
    free(r.symbols);
    return 0;
}
